From 65d89097b8bbf23d305c7d488e6a4a140ce03a91 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 17 Jul 2019 15:42:48 -0700 Subject: [PATCH] panfrost: Copy stencil front to back if back disabled When backside stenciling is disabled, backfacing primitives just do the same thing as frontfacing primitives. Signed-off-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_context.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 929ffd16605..26276cde073 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -1126,8 +1126,13 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data) ctx->fragment_shader_core.midgard1.flags = flags; /* Assign the stencil refs late */ - ctx->fragment_shader_core.stencil_front.ref = ctx->stencil_ref.ref_value[0]; - ctx->fragment_shader_core.stencil_back.ref = ctx->stencil_ref.ref_value[1]; + + unsigned front_ref = ctx->stencil_ref.ref_value[0]; + unsigned back_ref = ctx->stencil_ref.ref_value[1]; + bool back_enab = ctx->depth_stencil->stencil[1].enabled; + + ctx->fragment_shader_core.stencil_front.ref = front_ref; + ctx->fragment_shader_core.stencil_back.ref = back_enab ? back_ref : front_ref; /* CAN_DISCARD should be set if the fragment shader possibly * contains a 'discard' instruction. It is likely this is @@ -2431,13 +2436,17 @@ panfrost_bind_depth_stencil_state(struct pipe_context *pipe, } /* Stencil state */ - SET_BIT(ctx->fragment_shader_core.unknown2_4, MALI_STENCIL_TEST, depth_stencil->stencil[0].enabled); /* XXX: which one? */ + SET_BIT(ctx->fragment_shader_core.unknown2_4, MALI_STENCIL_TEST, depth_stencil->stencil[0].enabled); panfrost_make_stencil_state(&depth_stencil->stencil[0], &ctx->fragment_shader_core.stencil_front); ctx->fragment_shader_core.stencil_mask_front = depth_stencil->stencil[0].writemask; - panfrost_make_stencil_state(&depth_stencil->stencil[1], &ctx->fragment_shader_core.stencil_back); - ctx->fragment_shader_core.stencil_mask_back = depth_stencil->stencil[1].writemask; + /* If back-stencil is not enabled, use the front values */ + bool back_enab = ctx->depth_stencil->stencil[1].enabled; + unsigned back_index = back_enab ? 1 : 0; + + panfrost_make_stencil_state(&depth_stencil->stencil[back_index], &ctx->fragment_shader_core.stencil_back); + ctx->fragment_shader_core.stencil_mask_back = depth_stencil->stencil[back_index].writemask; /* Depth state (TODO: Refactor) */ SET_BIT(ctx->fragment_shader_core.unknown2_3, MALI_DEPTH_TEST, depth_stencil->depth.enabled); -- 2.30.2