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)
{
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)
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];
};
/**
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,