Module: Mesa
Branch: main
Commit: d5aec0ca4b0421e9bcbefc94f87b41d2957f3e51
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d5aec0ca4b0421e9bcbefc94f87b41d2957f3e51

Author: Lionel Landwerlin <[email protected]>
Date:   Sun Sep 17 11:55:40 2023 +0300

anv: extract out draw call generation

Signed-off-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Ivan Briano <[email protected]>
Tested-by: Felix DeGrood <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25361>

---

 .../vulkan/shaders/gfx11_generated_draws.glsl      |  90 +++++-----
 src/intel/vulkan/shaders/gfx9_generated_draws.glsl | 185 +++++++++++----------
 2 files changed, 143 insertions(+), 132 deletions(-)

diff --git a/src/intel/vulkan/shaders/gfx11_generated_draws.glsl 
b/src/intel/vulkan/shaders/gfx11_generated_draws.glsl
index efa273d2917..355d383d21b 100644
--- a/src/intel/vulkan/shaders/gfx11_generated_draws.glsl
+++ b/src/intel/vulkan/shaders/gfx11_generated_draws.glsl
@@ -27,56 +27,62 @@
 
 #include "common_generated_draws.glsl"
 
-void main()
+void write_draw(uint item_idx, uint cmd_idx, uint draw_id)
 {
    bool is_indexed = (flags & ANV_GENERATED_FLAG_INDEXED) != 0;
    bool is_predicated = (flags & ANV_GENERATED_FLAG_PREDICATED) != 0;
-   uint _3dprim_dw_size = (flags >> 16) & 0xff;
-   uint item_idx = uint(gl_FragCoord.y) * 8192 + uint(gl_FragCoord.x);
    uint indirect_data_offset = item_idx * indirect_data_stride / 4;
-   uint cmd_idx = item_idx * _3dprim_dw_size;
-   uint draw_id = draw_base + item_idx;
 
-   if (draw_id < draw_count) {
-      if (is_indexed) {
-         /* Loading a VkDrawIndexedIndirectCommand */
-         uint index_count    = indirect_data[indirect_data_offset + 0];
-         uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
-         uint first_index    = indirect_data[indirect_data_offset + 2];
-         uint vertex_offset  = indirect_data[indirect_data_offset + 3];
-         uint first_instance = indirect_data[indirect_data_offset + 4];
+   if (is_indexed) {
+      /* Loading a VkDrawIndexedIndirectCommand */
+      uint index_count    = indirect_data[indirect_data_offset + 0];
+      uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
+      uint first_index    = indirect_data[indirect_data_offset + 2];
+      uint vertex_offset  = indirect_data[indirect_data_offset + 3];
+      uint first_instance = indirect_data[indirect_data_offset + 4];
 
-         write_3DPRIMITIVE_EXTENDED(cmd_idx,
-                                    is_predicated,
-                                    is_indexed,
-                                    index_count,
-                                    first_index,
-                                    instance_count,
-                                    first_instance,
-                                    vertex_offset,
-                                    vertex_offset,
-                                    first_instance,
-                                    draw_id);
-      } else {
-         /* Loading a VkDrawIndirectCommand structure */
-         uint vertex_count   = indirect_data[indirect_data_offset + 0];
-         uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
-         uint first_vertex   = indirect_data[indirect_data_offset + 2];
-         uint first_instance = indirect_data[indirect_data_offset + 3];
+      write_3DPRIMITIVE_EXTENDED(cmd_idx,
+                                 is_predicated,
+                                 is_indexed,
+                                 index_count,
+                                 first_index,
+                                 instance_count,
+                                 first_instance,
+                                 vertex_offset,
+                                 vertex_offset,
+                                 first_instance,
+                                 draw_id);
+   } else {
+      /* Loading a VkDrawIndirectCommand structure */
+      uint vertex_count   = indirect_data[indirect_data_offset + 0];
+      uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
+      uint first_vertex   = indirect_data[indirect_data_offset + 2];
+      uint first_instance = indirect_data[indirect_data_offset + 3];
 
-         write_3DPRIMITIVE_EXTENDED(cmd_idx,
-                                    is_predicated,
-                                    is_indexed,
-                                    vertex_count,
-                                    first_vertex,
-                                    instance_count,
-                                    first_instance,
-                                    0 /* base_vertex_location */,
-                                    first_vertex,
-                                    first_instance,
-                                    draw_id);
-      }
+      write_3DPRIMITIVE_EXTENDED(cmd_idx,
+                                 is_predicated,
+                                 is_indexed,
+                                 vertex_count,
+                                 first_vertex,
+                                 instance_count,
+                                 first_instance,
+                                 0 /* base_vertex_location */,
+                                 first_vertex,
+                                 first_instance,
+                                 draw_id);
    }
+}
+
+
+void main()
+{
+   uint _3dprim_dw_size = (flags >> 16) & 0xff;
+   uint item_idx = uint(gl_FragCoord.y) * 8192 + uint(gl_FragCoord.x);
+   uint cmd_idx = item_idx * _3dprim_dw_size;
+   uint draw_id = draw_base + item_idx;
+
+   if (draw_id < draw_count)
+      write_draw(item_idx, cmd_idx, draw_id);
 
    end_generated_draws(cmd_idx, draw_id, draw_count);
 }
diff --git a/src/intel/vulkan/shaders/gfx9_generated_draws.glsl 
b/src/intel/vulkan/shaders/gfx9_generated_draws.glsl
index 265b100c5cd..a24f2c3de30 100644
--- a/src/intel/vulkan/shaders/gfx9_generated_draws.glsl
+++ b/src/intel/vulkan/shaders/gfx9_generated_draws.glsl
@@ -27,115 +27,120 @@
 
 #include "common_generated_draws.glsl"
 
-void main()
+void write_draw(uint item_idx, uint cmd_idx, uint draw_id)
 {
    bool is_indexed = (flags & ANV_GENERATED_FLAG_INDEXED) != 0;
    bool is_predicated = (flags & ANV_GENERATED_FLAG_PREDICATED) != 0;
    bool uses_base = (flags & ANV_GENERATED_FLAG_BASE) != 0;
    bool uses_drawid = (flags & ANV_GENERATED_FLAG_DRAWID) != 0;
    uint mocs = (flags >> 8) & 0xff;
-   uint _3dprim_dw_size = (flags >> 16) & 0xff;
-   uint item_idx = uint(gl_FragCoord.y) * 8192 + uint(gl_FragCoord.x);
    uint indirect_data_offset = item_idx * indirect_data_stride / 4;
-   uint cmd_idx = item_idx * _3dprim_dw_size;
-   uint draw_id = draw_base + item_idx;
 
-   if (draw_id < draw_count) {
-      if (is_indexed) {
-         /* Loading a VkDrawIndexedIndirectCommand */
-         uint index_count    = indirect_data[indirect_data_offset + 0];
-         uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
-         uint first_index    = indirect_data[indirect_data_offset + 2];
-         uint vertex_offset  = indirect_data[indirect_data_offset + 3];
-         uint first_instance = indirect_data[indirect_data_offset + 4];
+   if (is_indexed) {
+      /* Loading a VkDrawIndexedIndirectCommand */
+      uint index_count    = indirect_data[indirect_data_offset + 0];
+      uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
+      uint first_index    = indirect_data[indirect_data_offset + 2];
+      uint vertex_offset  = indirect_data[indirect_data_offset + 3];
+      uint first_instance = indirect_data[indirect_data_offset + 4];
 
-         if (uses_base || uses_drawid) {
-            uint state_vertex_len =
-               1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
-            commands[cmd_idx] =
-               (3  << 29 |                    /* Command Type */
-                3  << 27 |                    /* Command SubType */
-                0  << 24 |                    /* 3D Command Opcode */
-                8  << 16 |                    /* 3D Command Sub Opcode */
-                (state_vertex_len - 2) << 0); /* DWord Length */
-            cmd_idx += 1;
-            if (uses_base) {
-               uint64_t indirect_draw_data_addr =
-                  indirect_data_addr + item_idx * indirect_data_stride + 12;
-               write_VERTEX_BUFFER_STATE(cmd_idx,
-                                         mocs,
-                                         31,
-                                         indirect_draw_data_addr,
-                                         8);
-               cmd_idx += 4;
-            }
-            if (uses_drawid) {
-               uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
-               draw_ids[item_idx] = draw_id;
-               write_VERTEX_BUFFER_STATE(cmd_idx,
-                                         mocs,
-                                         32,
-                                         draw_idx_addr,
-                                         4);
-               cmd_idx += 4;
-            }
+      if (uses_base || uses_drawid) {
+         uint state_vertex_len =
+            1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
+         commands[cmd_idx] =
+            (3  << 29 |                    /* Command Type */
+             3  << 27 |                    /* Command SubType */
+             0  << 24 |                    /* 3D Command Opcode */
+             8  << 16 |                    /* 3D Command Sub Opcode */
+             (state_vertex_len - 2) << 0); /* DWord Length */
+         cmd_idx += 1;
+         if (uses_base) {
+            uint64_t indirect_draw_data_addr =
+               indirect_data_addr + item_idx * indirect_data_stride + 12;
+            write_VERTEX_BUFFER_STATE(cmd_idx,
+                                      mocs,
+                                      31,
+                                      indirect_draw_data_addr,
+                                      8);
+            cmd_idx += 4;
+         }
+         if (uses_drawid) {
+            uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
+            draw_ids[item_idx] = draw_id;
+            write_VERTEX_BUFFER_STATE(cmd_idx,
+                                      mocs,
+                                      32,
+                                      draw_idx_addr,
+                                      4);
+            cmd_idx += 4;
          }
-         write_3DPRIMITIVE(cmd_idx,
-                           is_predicated,
-                           is_indexed,
-                           index_count,
-                           first_index,
-                           instance_count,
-                           first_instance,
-                           vertex_offset);
-      } else {
-         /* Loading a VkDrawIndirectCommand structure */
-         uint vertex_count   = indirect_data[indirect_data_offset + 0];
-         uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
-         uint first_vertex   = indirect_data[indirect_data_offset + 2];
-         uint first_instance = indirect_data[indirect_data_offset + 3];
+      }
+      write_3DPRIMITIVE(cmd_idx,
+                        is_predicated,
+                        is_indexed,
+                        index_count,
+                        first_index,
+                        instance_count,
+                        first_instance,
+                        vertex_offset);
+   } else {
+      /* Loading a VkDrawIndirectCommand structure */
+      uint vertex_count   = indirect_data[indirect_data_offset + 0];
+      uint instance_count = indirect_data[indirect_data_offset + 1] * 
instance_multiplier;
+      uint first_vertex   = indirect_data[indirect_data_offset + 2];
+      uint first_instance = indirect_data[indirect_data_offset + 3];
 
-         if (uses_base || uses_drawid) {
-            uint state_vertex_len =
-               1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
-            commands[cmd_idx] =
+      if (uses_base || uses_drawid) {
+         uint state_vertex_len =
+            1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
+         commands[cmd_idx] =
                (3  << 29 |                    /* Command Type */
                 3  << 27 |                    /* Command SubType */
                 0  << 24 |                    /* 3D Command Opcode */
                 8  << 16 |                    /* 3D Command Sub Opcode */
                 (state_vertex_len - 2) << 0); /* DWord Length */
-            cmd_idx += 1;
-            if (uses_base) {
-               uint64_t indirect_draw_data_addr =
-                  indirect_data_addr + item_idx * indirect_data_stride + 8;
-               write_VERTEX_BUFFER_STATE(cmd_idx,
-                                         mocs,
-                                         31,
-                                         indirect_draw_data_addr,
-                                         8);
-               cmd_idx += 4;
-            }
-            if (uses_drawid) {
-               uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
-               draw_ids[item_idx] = draw_id;
-               write_VERTEX_BUFFER_STATE(cmd_idx,
-                                         mocs,
-                                         32,
-                                         draw_idx_addr,
-                                         4);
-               cmd_idx += 4;
-            }
+         cmd_idx += 1;
+         if (uses_base) {
+            uint64_t indirect_draw_data_addr =
+               indirect_data_addr + item_idx * indirect_data_stride + 8;
+            write_VERTEX_BUFFER_STATE(cmd_idx,
+                                      mocs,
+                                      31,
+                                      indirect_draw_data_addr,
+                                      8);
+            cmd_idx += 4;
+         }
+         if (uses_drawid) {
+            uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
+            draw_ids[item_idx] = draw_id;
+            write_VERTEX_BUFFER_STATE(cmd_idx,
+                                      mocs,
+                                      32,
+                                      draw_idx_addr,
+                                      4);
+            cmd_idx += 4;
          }
-         write_3DPRIMITIVE(cmd_idx,
-                           is_predicated,
-                           is_indexed,
-                           vertex_count,
-                           first_vertex,
-                           instance_count,
-                           first_instance,
-                           0 /* base_vertex_location */);
       }
+      write_3DPRIMITIVE(cmd_idx,
+                        is_predicated,
+                        is_indexed,
+                        vertex_count,
+                        first_vertex,
+                        instance_count,
+                        first_instance,
+                        0 /* base_vertex_location */);
    }
+}
+
+void main()
+{
+   uint _3dprim_dw_size = (flags >> 16) & 0xff;
+   uint item_idx = uint(gl_FragCoord.y) * 8192 + uint(gl_FragCoord.x);
+   uint cmd_idx = item_idx * _3dprim_dw_size;
+   uint draw_id = draw_base + item_idx;
+
+   if (draw_id < draw_count)
+      write_draw(item_idx, cmd_idx, draw_id);
 
    end_generated_draws(cmd_idx, draw_id, draw_count);
 }

Reply via email to