diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2016-06-11 16:52:17 -0400 |
---|---|---|
committer | Ilia Mirkin <imirkin@alum.mit.edu> | 2016-06-18 13:38:30 -0400 |
commit | d1bdc1238a39469e6760758876e8832019795a54 (patch) | |
tree | 2df6f5e0242f36cff0168f8ac1b85b071672ee7d /src/mesa/state_tracker/st_atom_scissor.c | |
parent | 07fcb06fe0220a51ad20b6b8a70512071999182c (diff) |
st/mesa: add support for GL_EXT_window_rectangles
Make sure to pass the requisite information in draws, blits, and clears
that work on the context's draw buffer.
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Diffstat (limited to 'src/mesa/state_tracker/st_atom_scissor.c')
-rw-r--r-- | src/mesa/state_tracker/st_atom_scissor.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_atom_scissor.c b/src/mesa/state_tracker/st_atom_scissor.c index 605d5cba9e7..72539df24fc 100644 --- a/src/mesa/state_tracker/st_atom_scissor.c +++ b/src/mesa/state_tracker/st_atom_scissor.c @@ -99,6 +99,46 @@ update_scissor( struct st_context *st ) st->pipe->set_scissor_states(st->pipe, 0, ctx->Const.MaxViewports, scissor); /* activate */ } +static void +update_window_rectangles(struct st_context *st) +{ + struct pipe_scissor_state new_rects[PIPE_MAX_WINDOW_RECTANGLES]; + const struct gl_context *ctx = st->ctx; + const struct gl_scissor_attrib *scissor = &ctx->Scissor; + unsigned i; + bool changed = false; + unsigned num_rects = scissor->NumWindowRects; + bool include = scissor->WindowRectMode == GL_INCLUSIVE_EXT; + + if (ctx->DrawBuffer == ctx->WinSysDrawBuffer) { + num_rects = 0; + include = false; + } + for (i = 0; i < num_rects; i++) { + const struct gl_scissor_rect *rect = &scissor->WindowRects[i]; + new_rects[i].minx = MAX2(rect->X, 0); + new_rects[i].miny = MAX2(rect->Y, 0); + new_rects[i].maxx = MAX2(rect->X + rect->Width, 0); + new_rects[i].maxy = MAX2(rect->Y + rect->Height, 0); + } + if (num_rects > 0 && memcmp(new_rects, st->state.window_rects.rects, + num_rects * sizeof(struct pipe_scissor_state))) { + memcpy(st->state.window_rects.rects, new_rects, + num_rects * sizeof(struct pipe_scissor_state)); + changed = true; + } + if (st->state.window_rects.num != num_rects) { + st->state.window_rects.num = num_rects; + changed = true; + } + if (st->state.window_rects.include != include) { + st->state.window_rects.include = include; + changed = true; + } + if (changed) + st->pipe->set_window_rectangles( + st->pipe, include, num_rects, new_rects); +} const struct st_tracked_state st_update_scissor = { "st_update_scissor", /* name */ @@ -108,3 +148,12 @@ const struct st_tracked_state st_update_scissor = { }, update_scissor /* update */ }; + +const struct st_tracked_state st_update_window_rectangles = { + "st_update_window_rectangles", /* name */ + { /* dirty */ + (_NEW_SCISSOR | _NEW_BUFFERS), /* mesa */ + 0, /* st */ + }, + update_window_rectangles /* update */ +}; |