aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2018-08-06 04:16:47 -0400
committerMarek Olšák <[email protected]>2018-08-14 21:19:01 -0400
commit465e929d6a94d156e8321ebece5a45f4a60969aa (patch)
tree6ef5b42cb3c09d033e3b34fdc8973431ac077455
parent15fc0f8d4ab78c4680e0ec8ea9d6af6dda656b69 (diff)
gallium/u_blitter: save/restore window rectangles
Reviewed-by: Samuel Pitoiset <[email protected]>
-rw-r--r--src/gallium/auxiliary/util/u_blitter.c10
-rw-r--r--src/gallium/auxiliary/util/u_blitter.h19
2 files changed, 29 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
index a9df71108b4..fc86fa367c6 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -657,6 +657,13 @@ void util_blitter_restore_fragment_states(struct blitter_context *blitter)
if (!blitter->skip_viewport_restore)
pipe->set_viewport_states(pipe, 0, 1, &ctx->base.saved_viewport);
+
+ if (blitter->saved_num_window_rectangles) {
+ pipe->set_window_rectangles(pipe,
+ blitter->saved_window_rectangles_include,
+ blitter->saved_num_window_rectangles,
+ blitter->saved_window_rectangles);
+ }
}
static void blitter_check_saved_fb_state(MAYBE_UNUSED struct blitter_context_priv *ctx)
@@ -1224,6 +1231,9 @@ static void blitter_set_common_draw_rect_state(struct blitter_context_priv *ctx,
{
struct pipe_context *pipe = ctx->base.pipe;
+ if (ctx->base.saved_num_window_rectangles)
+ pipe->set_window_rectangles(pipe, false, 0, NULL);
+
pipe->bind_rasterizer_state(pipe, scissor ? ctx->rs_state_scissor
: ctx->rs_state);
if (ctx->has_geometry_shader)
diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
index 9ea1dc9b6b2..c1f1ae47443 100644
--- a/src/gallium/auxiliary/util/u_blitter.h
+++ b/src/gallium/auxiliary/util/u_blitter.h
@@ -137,6 +137,10 @@ struct blitter_context
struct pipe_query *saved_render_cond_query;
uint saved_render_cond_mode;
bool saved_render_cond_cond;
+
+ boolean saved_window_rectangles_include;
+ unsigned saved_num_window_rectangles;
+ struct pipe_scissor_state saved_window_rectangles[PIPE_MAX_WINDOW_RECTANGLES];
};
/**
@@ -563,6 +567,21 @@ util_blitter_save_render_condition(struct blitter_context *blitter,
blitter->saved_render_cond_cond = condition;
}
+static inline void
+util_blitter_save_window_rectangles(struct blitter_context *blitter,
+ boolean include,
+ unsigned num_rectangles,
+ const struct pipe_scissor_state *rects)
+{
+ blitter->saved_window_rectangles_include = include;
+ blitter->saved_num_window_rectangles = num_rectangles;
+ if (num_rectangles > 0) {
+ assert(num_rectangles < ARRAY_SIZE(blitter->saved_window_rectangles));
+ memcpy(blitter->saved_window_rectangles, rects,
+ sizeof(*rects) * num_rectangles);
+ }
+}
+
void util_blitter_common_clear_setup(struct blitter_context *blitter,
unsigned width, unsigned height,
unsigned clear_buffers,