From 6b329b16f84712769621d7f284969ff604f9fc47 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 16 Jun 2022 23:08:48 -0400 Subject: [PATCH] asahi: Make ctx->zs a pointer When we save ZSA state with u_blitter, u_blitter just records the pointer for the state. It doesn't copy it. That requires an extra indirection on the context (as other drivers do) to fix restores of ZSA state with u_blitter. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/asahi/agx_blit.c | 2 +- src/gallium/drivers/asahi/agx_state.c | 14 ++++++-------- src/gallium/drivers/asahi/agx_state.h | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/asahi/agx_blit.c b/src/gallium/drivers/asahi/agx_blit.c index 542f3533992..eef8122d55f 100644 --- a/src/gallium/drivers/asahi/agx_blit.c +++ b/src/gallium/drivers/asahi/agx_blit.c @@ -94,7 +94,7 @@ agx_blitter_save(struct agx_context *ctx, struct blitter_context *blitter, util_blitter_save_scissor(blitter, &ctx->scissor); util_blitter_save_fragment_shader(blitter, ctx->stage[PIPE_SHADER_FRAGMENT].shader); util_blitter_save_blend(blitter, ctx->blend); - util_blitter_save_depth_stencil_alpha(blitter, &ctx->zs); + util_blitter_save_depth_stencil_alpha(blitter, ctx->zs); util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref); util_blitter_save_so_targets(blitter, 0, NULL); util_blitter_save_sample_mask(blitter, ctx->sample_mask, 0); diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index f96d1e55de1..ab26d88d23a 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -253,9 +253,7 @@ static void agx_bind_zsa_state(struct pipe_context *pctx, void *cso) { struct agx_context *ctx = agx_context(pctx); - - if (cso) - memcpy(&ctx->zs, cso, sizeof(ctx->zs)); + ctx->zs = cso; } static void * @@ -1498,7 +1496,7 @@ demo_rasterizer(struct agx_context *ctx, struct agx_pool *pool, bool is_points) struct agx_rasterizer_packed out; agx_pack(&out, RASTERIZER, cfg) { - bool back_stencil = ctx->zs.base.stencil[1].enabled; + bool back_stencil = ctx->zs->base.stencil[1].enabled; cfg.front.stencil_reference = ctx->stencil_ref.ref_value[0]; cfg.back.stencil_reference = back_stencil ? ctx->stencil_ref.ref_value[1] : @@ -1518,12 +1516,12 @@ demo_rasterizer(struct agx_context *ctx, struct agx_pool *pool, bool is_points) }; /* Words 2-3: front */ - out.opaque[2] |= ctx->zs.front.opaque[0]; - out.opaque[3] |= ctx->zs.front.opaque[1]; + out.opaque[2] |= ctx->zs->front.opaque[0]; + out.opaque[3] |= ctx->zs->front.opaque[1]; /* Words 4-5: back */ - out.opaque[4] |= ctx->zs.back.opaque[0]; - out.opaque[5] |= ctx->zs.back.opaque[1]; + out.opaque[4] |= ctx->zs->back.opaque[0]; + out.opaque[5] |= ctx->zs->back.opaque[1]; return agx_pool_upload_aligned(pool, &out, sizeof(out), 64); } diff --git a/src/gallium/drivers/asahi/agx_state.h b/src/gallium/drivers/asahi/agx_state.h index fc178bb1a09..39431fcc92f 100644 --- a/src/gallium/drivers/asahi/agx_state.h +++ b/src/gallium/drivers/asahi/agx_state.h @@ -156,7 +156,7 @@ struct agx_context { struct agx_stage stage[PIPE_SHADER_TYPES]; struct agx_attribute *attributes; struct agx_rasterizer *rast; - struct agx_zsa zs; + struct agx_zsa *zs; struct agx_blend *blend; struct pipe_blend_color blend_color; struct pipe_viewport_state viewport;