crocus/gen8: add VF SGVS support.
authorDave Airlie <airlied@redhat.com>
Mon, 21 Jun 2021 19:11:25 +0000 (05:11 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 22 Jun 2021 18:56:21 +0000 (18:56 +0000)
This is moved functionality on gen8

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11507>

src/gallium/drivers/crocus/crocus_context.h
src/gallium/drivers/crocus/crocus_draw.c
src/gallium/drivers/crocus/crocus_program.c
src/gallium/drivers/crocus/crocus_state.c

index 272f0fc..333c264 100644 (file)
@@ -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)
 
index adb7316..bdcebd2 100644 (file)
@@ -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;
    }
 }
 
index 2675545..47be0f1 100644 (file)
@@ -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;
index 18810a2..5ad7c23 100644 (file)
@@ -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) {