diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index f2ab4ecfe14..6b1327676d7 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -407,6 +407,7 @@ etna_reset_gpu_state(struct etna_context *ctx) { struct etna_cmd_stream *stream = ctx->stream; struct etna_screen *screen = ctx->screen; + uint32_t dummy_attribs[VIVS_NFE_GENERIC_ATTRIB__LEN] = { 0 }; etna_set_state(stream, VIVS_GL_API_MODE, VIVS_GL_API_MODE_OPENGL); etna_set_state(stream, VIVS_GL_VERTEX_ELEMENT_CONFIG, 0x00000001); @@ -467,6 +468,20 @@ etna_reset_gpu_state(struct etna_context *ctx) VIVS_VS_ICACHE_INVALIDATE_UNK4); } + /* It seems that some GPUs (at least some GC400 have shown this behavior) + * come out of reset with random vertex attributes enabled and also don't + * disable them on the write to the first config register as normal. Enabling + * all attributes seems to provide the GPU with the required edge to actually + * disable the unused attributes on the next draw. + */ + if (screen->specs.halti >= 5) { + etna_set_state_multi(stream, VIVS_NFE_GENERIC_ATTRIB_CONFIG0(0), + VIVS_NFE_GENERIC_ATTRIB__LEN, dummy_attribs); + } else { + etna_set_state_multi(stream, VIVS_FE_VERTEX_ELEMENT_CONFIG(0), + screen->specs.halti >= 0 ? 16 : 12, dummy_attribs); + } + ctx->dirty = ~0L; ctx->dirty_sampler_views = ~0L; }