zink: break out some of the u_blitter setup into util function

we'll be using this for more than just zink_blit, so we can reuse some code

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8512>
This commit is contained in:
Mike Blumenkrantz 2020-08-13 17:17:38 -04:00 committed by Marge Bot
parent 526db0fe82
commit e100746a73
3 changed files with 47 additions and 23 deletions

View file

@ -203,19 +203,9 @@ zink_blit(struct pipe_context *pctx,
return;
}
util_blitter_save_blend(ctx->blitter, ctx->gfx_pipeline_state.blend_state);
util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->dsa_state);
util_blitter_save_vertex_elements(ctx->blitter, ctx->element_state);
util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref);
util_blitter_save_rasterizer(ctx->blitter, ctx->rast_state);
util_blitter_save_fragment_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_FRAGMENT]);
util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_VERTEX]);
util_blitter_save_tessctrl_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_TESS_CTRL]);
util_blitter_save_tesseval_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]);
util_blitter_save_geometry_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_GEOMETRY]);
util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state);
util_blitter_save_viewport(ctx->blitter, ctx->viewport_states);
util_blitter_save_scissor(ctx->blitter, ctx->scissor_states);
util_blitter_save_fragment_sampler_states(ctx->blitter,
ctx->num_samplers[PIPE_SHADER_FRAGMENT],
ctx->sampler_states[PIPE_SHADER_FRAGMENT]);
@ -224,8 +214,33 @@ zink_blit(struct pipe_context *pctx,
ctx->image_views[PIPE_SHADER_FRAGMENT]);
util_blitter_save_fragment_constant_buffer_slot(ctx->blitter, ctx->ubos[PIPE_SHADER_FRAGMENT]);
util_blitter_save_vertex_buffer_slot(ctx->blitter, ctx->buffers);
util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask);
util_blitter_save_so_targets(ctx->blitter, ctx->num_so_targets, ctx->so_targets);
zink_blit_begin(ctx, ZINK_BLIT_SAVE_FB | ZINK_BLIT_SAVE_FS);
util_blitter_blit(ctx->blitter, info);
}
/* similar to radeonsi */
void
zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags)
{
util_blitter_save_vertex_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_VERTEX]);
util_blitter_save_tessctrl_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_TESS_CTRL]);
util_blitter_save_tesseval_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_TESS_EVAL]);
util_blitter_save_geometry_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_GEOMETRY]);
util_blitter_save_rasterizer(ctx->blitter, ctx->rast_state);
util_blitter_save_so_targets(ctx->blitter, ctx->num_so_targets, ctx->so_targets);
if (flags & ZINK_BLIT_SAVE_FS) {
util_blitter_save_blend(ctx->blitter, ctx->gfx_pipeline_state.blend_state);
util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->dsa_state);
util_blitter_save_stencil_ref(ctx->blitter, &ctx->stencil_ref);
util_blitter_save_sample_mask(ctx->blitter, ctx->gfx_pipeline_state.sample_mask);
util_blitter_save_scissor(ctx->blitter, ctx->scissor_states);
/* also util_blitter_save_window_rectangles when we have that? */
util_blitter_save_fragment_shader(ctx->blitter, ctx->gfx_stages[PIPE_SHADER_FRAGMENT]);
}
if (flags & ZINK_BLIT_SAVE_FB)
util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state);
}

View file

@ -143,8 +143,8 @@ clear_zs_no_rp(struct zink_batch *batch, struct zink_resource *res, VkImageAspec
vkCmdClearDepthStencilImage(batch->cmdbuf, res->image, res->layout, &zs_value, 1, &range);
}
static struct zink_batch *
get_clear_batch(struct zink_context *ctx, unsigned width, unsigned height, struct u_rect *region)
static bool
clear_needs_rp(unsigned width, unsigned height, struct u_rect *region)
{
struct u_rect intersect = {0, width, 0, height};
@ -155,14 +155,14 @@ get_clear_batch(struct zink_context *ctx, unsigned width, unsigned height, struc
*/
if (!u_rect_test_intersection(region, &intersect))
/* is this even a thing? */
return zink_batch_rp(ctx);
return true;
u_rect_find_intersection(region, &intersect);
if (intersect.x0 != 0 || intersect.y0 != 0 ||
intersect.x1 != width || intersect.y1 != height)
return zink_batch_rp(ctx);
return true;
return zink_curr_batch(ctx);
return false;
}
void
@ -174,16 +174,16 @@ zink_clear(struct pipe_context *pctx,
{
struct zink_context *ctx = zink_context(pctx);
struct pipe_framebuffer_state *fb = &ctx->fb_state;
struct zink_batch *batch;
struct zink_batch *batch = zink_curr_batch(ctx);
bool needs_rp = false;
if (scissor_state) {
struct u_rect scissor = {scissor_state->minx, scissor_state->maxx, scissor_state->miny, scissor_state->maxy};
batch = get_clear_batch(ctx, fb->width, fb->height, &scissor);
} else
batch = zink_curr_batch(ctx);
needs_rp = clear_needs_rp(fb->width, fb->height, &scissor);
}
if (batch->in_rp || ctx->render_condition_active) {
if (needs_rp || batch->in_rp || ctx->render_condition_active) {
clear_in_rp(pctx, buffers, scissor_state, pcolor, depth, stencil);
return;
}

View file

@ -46,6 +46,12 @@ struct zink_rasterizer_state;
struct zink_resource;
struct zink_vertex_elements_state;
enum zink_blit_flags {
ZINK_BLIT_NORMAL = 1 << 0,
ZINK_BLIT_SAVE_FS = 1 << 1,
ZINK_BLIT_SAVE_FB = 1 << 2,
};
struct zink_sampler_view {
struct pipe_sampler_view base;
union {
@ -191,6 +197,9 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
void
zink_context_query_init(struct pipe_context *ctx);
void
zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags);
void
zink_blit(struct pipe_context *pctx,
const struct pipe_blit_info *info);