summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_atom_scissor.c
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2016-06-11 16:52:17 -0400
committerIlia Mirkin <imirkin@alum.mit.edu>2016-06-18 13:38:30 -0400
commitd1bdc1238a39469e6760758876e8832019795a54 (patch)
tree2df6f5e0242f36cff0168f8ac1b85b071672ee7d /src/mesa/state_tracker/st_atom_scissor.c
parent07fcb06fe0220a51ad20b6b8a70512071999182c (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.c49
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 */
+};