From: Christian Gmeiner Date: Fri, 17 Jan 2020 09:32:33 +0000 (+0100) Subject: etnaviv: fix alpha test on GC3000 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=83f54e3c54ab43fc7d7946999dc9dda6a93cf67d;p=mesa.git etnaviv: fix alpha test on GC3000 Store ref_value in PE_STENCIL_CONFIG_EXT as done by blob. Fixes following piglits: spec@ext_framebuffer_object@fbo-alphatest-formats spec@ext_packed_float@fbo-alphatest-formats spec@ext_texture_srgb@fbo-alphatest-formats Signed-off-by: Christian Gmeiner Reviewed-by: Lucas Stach Tested-by: Marge Bot Part-of: --- diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.c b/src/gallium/drivers/etnaviv/etnaviv_emit.c index b92cf770cf4..072f5854644 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_emit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.c @@ -519,8 +519,9 @@ etna_emit_state(struct etna_context *ctx) abort(); } } - if (unlikely(dirty & (ETNA_DIRTY_STENCIL_REF | ETNA_DIRTY_RASTERIZER))) { - /*014A0*/ EMIT_STATE(PE_STENCIL_CONFIG_EXT, ctx->stencil_ref.PE_STENCIL_CONFIG_EXT[ccw]); + if (unlikely(dirty & (ETNA_DIRTY_STENCIL_REF | ETNA_DIRTY_RASTERIZER | ETNA_DIRTY_ZSA))) { + uint32_t val = etna_zsa_state(ctx->zsa)->PE_STENCIL_CONFIG_EXT; + /*014A0*/ EMIT_STATE(PE_STENCIL_CONFIG_EXT, val | ctx->stencil_ref.PE_STENCIL_CONFIG_EXT[ccw]); } if (unlikely(dirty & (ETNA_DIRTY_BLEND | ETNA_DIRTY_FRAMEBUFFER))) { struct etna_blend_state *blend = etna_blend_state(ctx->blend); diff --git a/src/gallium/drivers/etnaviv/etnaviv_zsa.c b/src/gallium/drivers/etnaviv/etnaviv_zsa.c index 8a4d12dc0bb..aa0dc335ca7 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_zsa.c +++ b/src/gallium/drivers/etnaviv/etnaviv_zsa.c @@ -29,6 +29,7 @@ #include "etnaviv_context.h" #include "etnaviv_screen.h" #include "etnaviv_translate.h" +#include "util/u_half.h" #include "util/u_memory.h" #include "hw/common.xml.h" @@ -38,6 +39,7 @@ etna_zsa_state_create(struct pipe_context *pctx, const struct pipe_depth_stencil_alpha_state *so) { struct etna_context *ctx = etna_context(pctx); + struct etna_screen *screen = ctx->screen; struct etna_zsa_state *cs = CALLOC_STRUCT(etna_zsa_state); if (!cs) @@ -92,6 +94,15 @@ etna_zsa_state_create(struct pipe_context *pctx, if (so->depth.enabled == false || so->depth.func == PIPE_FUNC_ALWAYS) early_z = false; + /* calculate extra_reference value */ + uint32_t extra_reference = 0; + + if (VIV_FEATURE(screen, chipMinorFeatures1, HALF_FLOAT)) + extra_reference = util_float_to_half(CLAMP(so->alpha.ref_value, 0.0f, 1.0f)); + + cs->PE_STENCIL_CONFIG_EXT = + VIVS_PE_STENCIL_CONFIG_EXT_EXTRA_ALPHA_REF(extra_reference); + /* compare funcs have 1 to 1 mapping */ cs->PE_DEPTH_CONFIG = VIVS_PE_DEPTH_CONFIG_DEPTH_FUNC(so->depth.enabled ? so->depth.func diff --git a/src/gallium/drivers/etnaviv/etnaviv_zsa.h b/src/gallium/drivers/etnaviv/etnaviv_zsa.h index 21a89c0e213..061a5f46b4d 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_zsa.h +++ b/src/gallium/drivers/etnaviv/etnaviv_zsa.h @@ -37,6 +37,7 @@ struct etna_zsa_state { uint32_t PE_ALPHA_OP; uint32_t PE_STENCIL_OP[2]; uint32_t PE_STENCIL_CONFIG[2]; + uint32_t PE_STENCIL_CONFIG_EXT; uint32_t PE_STENCIL_CONFIG_EXT2[2]; };