From: Marek Olšák Date: Mon, 6 Aug 2018 08:16:47 +0000 (-0400) Subject: gallium/u_blitter: save/restore window rectangles X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=465e929d6a94d156e8321ebece5a45f4a60969aa;p=mesa.git gallium/u_blitter: save/restore window rectangles Reviewed-by: Samuel Pitoiset --- 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,