From 22b9063aeecdc4dbefa6a9931aa84aa098c8fb08 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 22 Jun 2021 05:11:25 +1000 Subject: [PATCH] crocus/gen8: add VF SGVS support. This is moved functionality on gen8 Part-of: --- src/gallium/drivers/crocus/crocus_context.h | 1 + src/gallium/drivers/crocus/crocus_draw.c | 3 +++ src/gallium/drivers/crocus/crocus_program.c | 2 ++ src/gallium/drivers/crocus/crocus_state.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/src/gallium/drivers/crocus/crocus_context.h b/src/gallium/drivers/crocus/crocus_context.h index 272f0fc..333c264 100644 --- a/src/gallium/drivers/crocus/crocus_context.h +++ b/src/gallium/drivers/crocus/crocus_context.h @@ -114,6 +114,7 @@ enum { #define CROCUS_DIRTY_GEN6_SVBI (1ull << 36) #define CROCUS_DIRTY_GEN8_VF_TOPOLOGY (1ull << 37) #define CROCUS_DIRTY_GEN8_PMA_FIX (1ull << 38) +#define CROCUS_DIRTY_GEN8_VF_SGVS (1ull << 39) #define CROCUS_ALL_DIRTY_FOR_COMPUTE (CROCUS_DIRTY_COMPUTE_RESOLVES_AND_FLUSHES) diff --git a/src/gallium/drivers/crocus/crocus_draw.c b/src/gallium/drivers/crocus/crocus_draw.c index adb7316..bdcebd2 100644 --- a/src/gallium/drivers/crocus/crocus_draw.c +++ b/src/gallium/drivers/crocus/crocus_draw.c @@ -248,8 +248,11 @@ crocus_update_draw_parameters(struct crocus_context *ice, } if (changed) { + struct crocus_screen *screen = (struct crocus_screen *)ice->ctx.screen; ice->state.dirty |= CROCUS_DIRTY_VERTEX_BUFFERS | CROCUS_DIRTY_VERTEX_ELEMENTS; + if (screen->devinfo.ver == 8) + ice->state.dirty |= CROCUS_DIRTY_GEN8_VF_SGVS; } } diff --git a/src/gallium/drivers/crocus/crocus_program.c b/src/gallium/drivers/crocus/crocus_program.c index 2675545..47be0f1 100644 --- a/src/gallium/drivers/crocus/crocus_program.c +++ b/src/gallium/drivers/crocus/crocus_program.c @@ -1344,6 +1344,8 @@ crocus_update_compiled_vs(struct crocus_context *ice) if (old != shader) { ice->shaders.prog[CROCUS_CACHE_VS] = shader; + if (devinfo->ver == 8) + ice->state.dirty |= CROCUS_DIRTY_GEN8_VF_SGVS; ice->state.stage_dirty |= CROCUS_STAGE_DIRTY_VS | CROCUS_STAGE_DIRTY_BINDINGS_VS | CROCUS_STAGE_DIRTY_CONSTANTS_VS; diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c index 18810a2..5ad7c23 100644 --- a/src/gallium/drivers/crocus/crocus_state.c +++ b/src/gallium/drivers/crocus/crocus_state.c @@ -3769,7 +3769,13 @@ static void crocus_bind_vertex_elements_state(struct pipe_context *ctx, void *state) { struct crocus_context *ice = (struct crocus_context *) ctx; +#if GFX_VER == 8 + struct crocus_vertex_element_state *old_cso = ice->state.cso_vertex_elements; + struct crocus_vertex_element_state *new_cso = state; + if (new_cso && cso_changed(count)) + ice->state.dirty |= CROCUS_DIRTY_GEN8_VF_SGVS; +#endif ice->state.cso_vertex_elements = state; ice->state.dirty |= CROCUS_DIRTY_VERTEX_ELEMENTS | CROCUS_DIRTY_VERTEX_BUFFERS; ice->state.stage_dirty |= ice->state.stage_dirty_for_nos[CROCUS_NOS_VERTEX_ELEMENTS]; @@ -7377,6 +7383,29 @@ crocus_upload_dirty_render_state(struct crocus_context *ice, #endif } +#if GFX_VER == 8 + if (dirty & CROCUS_DIRTY_GEN8_VF_SGVS) { + const struct brw_vs_prog_data *vs_prog_data = (void *) + ice->shaders.prog[MESA_SHADER_VERTEX]->prog_data; + struct crocus_vertex_element_state *cso = ice->state.cso_vertex_elements; + + crocus_emit_cmd(batch, GENX(3DSTATE_VF_SGVS), sgv) { + if (vs_prog_data->uses_vertexid) { + sgv.VertexIDEnable = true; + sgv.VertexIDComponentNumber = 2; + sgv.VertexIDElementOffset = + cso->count - ice->state.vs_needs_edge_flag; + } + + if (vs_prog_data->uses_instanceid) { + sgv.InstanceIDEnable = true; + sgv.InstanceIDComponentNumber = 3; + sgv.InstanceIDElementOffset = + cso->count - ice->state.vs_needs_edge_flag; + } + } + } +#endif #if GFX_VERx10 >= 75 if (dirty & CROCUS_DIRTY_GEN75_VF) { crocus_emit_cmd(batch, GENX(3DSTATE_VF), vf) { -- 2.7.4