From ec51c8774d0f87e0a8d0ca8d8818bb13056641c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= Date: Fri, 8 Oct 2021 14:20:22 +0200 Subject: [PATCH] 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 Part-of: --- 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;