Mesa (main): v3d/clif: add support for dumping GS shader state

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 13 21:40:15 UTC 2021


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

Author: Alejandro Piñeiro <apinheiro at igalia.com>
Date:   Fri Oct  8 14:20:22 2021 +0200

v3d/clif: add support for dumping GS shader state

The basic vertex+fragment shader state uses the packet
GL_SHADER_STATE, but when geometry shader are involved, the packet
used is GL_SHADER_STATE_INCLUDING_GS.

Without this commit any program using a geometry shader would dump
their shader state (and their shader state record and attribues) as
binaries.

Reviewed-by: Juan A. Suarez <jasuarez at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13269>

---

 src/broadcom/clif/clif_dump.c    | 18 ++++++++++++++++--
 src/broadcom/clif/clif_private.h |  1 +
 src/broadcom/clif/v3dx_dump.c    | 19 +++++++++++++++++++
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/broadcom/clif/clif_dump.c b/src/broadcom/clif/clif_dump.c
index 0aaa6b6ad8b..ede6f42eedf 100644
--- a/src/broadcom/clif/clif_dump.c
+++ b/src/broadcom/clif/clif_dump.c
@@ -160,7 +160,8 @@ clif_dump_cl(struct clif_dump *clif, uint32_t start, uint32_t end,
 static uint32_t
 clif_dump_gl_shader_state_record(struct clif_dump *clif,
                                  struct reloc_worklist_entry *reloc,
-                                 void *vaddr)
+                                 void *vaddr,
+                                 bool including_gs)
 {
         struct v3d_group *state = v3d_spec_find_struct(clif->spec,
                                                        "GL Shader State Record");
@@ -170,6 +171,16 @@ clif_dump_gl_shader_state_record(struct clif_dump *clif,
         assert(attr);
         uint32_t offset = 0;
 
+        if (including_gs) {
+                struct v3d_group *gs_state = v3d_spec_find_struct(clif->spec,
+                                                                  "Geometry Shader State Record");
+                assert(gs_state);
+                out(clif, "@format shadrec_gl_geom\n");
+                v3d_print_group(clif, gs_state, 0, vaddr + offset);
+                offset += v3d_group_get_length(gs_state);
+                /* Extra pad when geometry/tessellation shader is present */
+                offset += 20;
+        }
         out(clif, "@format shadrec_gl_main\n");
         v3d_print_group(clif, state, 0, vaddr + offset);
         offset += v3d_group_get_length(state);
@@ -201,6 +212,7 @@ clif_process_worklist(struct clif_dump *clif)
                         break;
 
                 case reloc_gl_shader_state:
+                case reloc_gl_including_gs_shader_state:
                         break;
                 case reloc_generic_tile_list:
                         clif_dump_cl(clif, reloc->addr,
@@ -336,10 +348,12 @@ clif_dump_buffers(struct clif_dump *clif)
                         break;
 
                 case reloc_gl_shader_state:
+                case reloc_gl_including_gs_shader_state:
                         offset += clif_dump_gl_shader_state_record(clif,
                                                                    reloc,
                                                                    bo->vaddr +
-                                                                   offset);
+                                                                   offset,
+                                                                   reloc->type == reloc_gl_including_gs_shader_state);
                         break;
                 case reloc_generic_tile_list:
                         offset = clif_dump_cl(clif, reloc->addr,
diff --git a/src/broadcom/clif/clif_private.h b/src/broadcom/clif/clif_private.h
index d96bfd12de9..6ace62b0310 100644
--- a/src/broadcom/clif/clif_private.h
+++ b/src/broadcom/clif/clif_private.h
@@ -64,6 +64,7 @@ struct clif_dump {
 enum reloc_worklist_type {
         reloc_cl,
         reloc_gl_shader_state,
+        reloc_gl_including_gs_shader_state,
         reloc_generic_tile_list,
 };
 
diff --git a/src/broadcom/clif/v3dx_dump.c b/src/broadcom/clif/v3dx_dump.c
index 9cf59f88920..454478531ff 100644
--- a/src/broadcom/clif/v3dx_dump.c
+++ b/src/broadcom/clif/v3dx_dump.c
@@ -94,6 +94,25 @@ v3dX(clif_dump_packet)(struct clif_dump *clif, uint32_t offset,
                 return true;
         }
 
+#if V3D_VERSION >= 41
+        case V3DX(GL_SHADER_STATE_INCLUDING_GS_opcode): {
+                struct V3DX(GL_SHADER_STATE_INCLUDING_GS) values;
+                V3DX(GL_SHADER_STATE_INCLUDING_GS_unpack)(cl, &values);
+
+                if (reloc_mode) {
+                        struct reloc_worklist_entry *reloc =
+                                clif_dump_add_address_to_worklist(clif,
+                                                                  reloc_gl_including_gs_shader_state,
+                                                                  values.address);
+                        if (reloc) {
+                                reloc->shader_state.num_attrs =
+                                        values.number_of_attribute_arrays;
+                        }
+                }
+                return true;
+        }
+#endif /* V3D_VERSION >= 41 */
+
 #if V3D_VERSION < 40
         case V3DX(STORE_MULTI_SAMPLE_RESOLVED_TILE_COLOR_BUFFER_EXTENDED_opcode): {
                 struct V3DX(STORE_MULTI_SAMPLE_RESOLVED_TILE_COLOR_BUFFER_EXTENDED) values;



More information about the mesa-commit mailing list