diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index 22a3f34ba1f..0b236a9f7c9 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -502,6 +502,15 @@ gpu_supports_vertex_format(struct etna_screen *screen, enum pipe_format format) return true; } +static bool +gpu_supports_depth_stencil_format(struct etna_screen *screen, enum pipe_format format) +{ + if (format == PIPE_FORMAT_S8_UINT) + return VIV_FEATURE(screen, ETNA_FEATURE_S8); + + return true; +} + static bool etna_screen_is_format_supported(struct pipe_screen *pscreen, enum pipe_format format, @@ -529,7 +538,12 @@ etna_screen_is_format_supported(struct pipe_screen *pscreen, } if (usage & PIPE_BIND_DEPTH_STENCIL) { - if (translate_depth_format(format) != ETNA_NO_MATCH) + uint32_t fmt = translate_depth_format(format); + + if (!gpu_supports_depth_stencil_format(screen, format)) + fmt = ETNA_NO_MATCH; + + if (fmt != ETNA_NO_MATCH) allowed |= PIPE_BIND_DEPTH_STENCIL; } diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index e16c22b76f3..7d3eee9dcc1 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -343,6 +343,9 @@ etna_set_framebuffer_state(struct pipe_context *pctx, /* VIVS_PE_DEPTH_CONFIG_ONLY_DEPTH */ /* merged with depth_stencil_alpha */ + if (surf->format == PIPE_FORMAT_S8_UINT) + pe_logic_op |= VIVS_PE_LOGIC_OP_UNK20(1); + for (int i = 0; i < screen->specs.pixel_pipes; i++) { cs->PE_PIPE_DEPTH_ADDR[i].bo = res->bo; cs->PE_PIPE_DEPTH_ADDR[i].offset = level->offset + surf->first_layer * level->layer_stride; diff --git a/src/gallium/drivers/etnaviv/etnaviv_translate.h b/src/gallium/drivers/etnaviv/etnaviv_translate.h index 27a0a315a49..1fb14805453 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_translate.h +++ b/src/gallium/drivers/etnaviv/etnaviv_translate.h @@ -233,6 +233,8 @@ translate_depth_format(enum pipe_format fmt) return VIVS_PE_DEPTH_CONFIG_DEPTH_FORMAT_D24S8; case PIPE_FORMAT_S8_UINT_Z24_UNORM: return VIVS_PE_DEPTH_CONFIG_DEPTH_FORMAT_D24S8; + case PIPE_FORMAT_S8_UINT: + return VIVS_PE_DEPTH_CONFIG_DEPTH_FORMAT_D24S8; default: return ETNA_NO_MATCH; }