iris: vertex ID, instance ID
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 18 Jul 2018 16:23:24 +0000 (09:23 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:07 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program_cache.c
src/gallium/drivers/iris/iris_state.c

index 6bcfd1ca99ad2b8dab2ba554ee17ba6bba064796..c0420ef397a8b66c950190b0afdaaa109c28dd53 100644 (file)
@@ -96,6 +96,7 @@ struct blorp_params;
 #define IRIS_DIRTY_SO_BUFFERS               (1ull << 48)
 #define IRIS_DIRTY_SO_DECL_LIST             (1ull << 49)
 #define IRIS_DIRTY_STREAMOUT                (1ull << 50)
+#define IRIS_DIRTY_VF_SGVS                  (1ull << 51)
 
 /**
  * Non-orthogonal state (NOS) dependency flags.
index 0bf01205ffbc67dc62d579c75d1f0b08cbac858e..6f88062f269f35008417125f1a9ced36d6a4bacf 100644 (file)
@@ -99,9 +99,13 @@ dirty_flag_for_cache(enum iris_program_cache_id cache_id)
    assert(cache_id <= MESA_SHADER_STAGES);
 
    // XXX: ugly...
+   // XXX: move this flagging out to a higher level, allow comparison of
+   // XXX: new and old programs to decide what bits to twiddle
    // XXX: CLIP: toggle if barycentric modes has any NONPERSPECTIVE or not
    if (cache_id == IRIS_CACHE_FS)
       return IRIS_DIRTY_WM | IRIS_DIRTY_FS | IRIS_DIRTY_CLIP;
+   if (cache_id == IRIS_CACHE_VS)
+      return IRIS_DIRTY_VS | IRIS_DIRTY_VF_SGVS;
 
    return IRIS_DIRTY_VS << cache_id;
 }
index 0cecb307a8830d95c6950fed01419ed10d0269d2..f62c0f377df552bee856cf6f4ba0bc79e77ac827 100644 (file)
@@ -1652,6 +1652,11 @@ static void
 iris_bind_vertex_elements_state(struct pipe_context *ctx, void *state)
 {
    struct iris_context *ice = (struct iris_context *) ctx;
+   struct iris_vertex_element_state *old_cso = ice->state.cso_vertex_elements;
+   struct iris_vertex_element_state *new_cso = state;
+
+   if (new_cso && cso_changed(count))
+      ice->state.dirty |= IRIS_DIRTY_VF_SGVS;
 
    ice->state.cso_vertex_elements = state;
    ice->state.dirty |= IRIS_DIRTY_VERTEX_ELEMENTS;
@@ -3147,9 +3152,25 @@ iris_upload_render_state(struct iris_context *ice,
                       (1 + cso->count * GENX(VERTEX_ELEMENT_STATE_length)));
       iris_batch_emit(batch, cso->vf_instancing, sizeof(uint32_t) *
                       cso->count * GENX(3DSTATE_VF_INSTANCING_length));
-      for (int i = 0; i < cso->count; i++) {
-         /* TODO: vertexid, instanceid support */
-         iris_emit_cmd(batch, GENX(3DSTATE_VF_SGVS), sgvs);
+   }
+
+   if (dirty & IRIS_DIRTY_VF_SGVS) {
+      const struct brw_vs_prog_data *vs_prog_data = (void *)
+         ice->shaders.prog[MESA_SHADER_VERTEX]->prog_data;
+      struct iris_vertex_element_state *cso = ice->state.cso_vertex_elements;
+
+      iris_emit_cmd(batch, GENX(3DSTATE_VF_SGVS), sgv) {
+         if (vs_prog_data->uses_vertexid) {
+            sgv.VertexIDEnable = true;
+            sgv.VertexIDComponentNumber = 2;
+            sgv.VertexIDElementOffset = cso->count;
+         }
+
+         if (vs_prog_data->uses_instanceid) {
+            sgv.InstanceIDEnable = true;
+            sgv.InstanceIDComponentNumber = 3;
+            sgv.InstanceIDElementOffset = cso->count;
+         }
       }
    }