diff options
author | Marek Olšák <[email protected]> | 2018-08-06 04:16:47 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2018-08-14 21:19:01 -0400 |
commit | 465e929d6a94d156e8321ebece5a45f4a60969aa (patch) | |
tree | 6ef5b42cb3c09d033e3b34fdc8973431ac077455 | |
parent | 15fc0f8d4ab78c4680e0ec8ea9d6af6dda656b69 (diff) |
gallium/u_blitter: save/restore window rectangles
Reviewed-by: Samuel Pitoiset <[email protected]>
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.c | 10 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.h | 19 |
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, |