Henri Verbeet : vkd3d-shader: Introduce a helper to print d3d-asm subscripts.

Alexandre Julliard julliard at winehq.org
Wed Feb 17 16:23:18 CST 2021


Module: vkd3d
Branch: master
Commit: 401b51f88800f973f12ab735cb8f8df82bc3d4f5
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=401b51f88800f973f12ab735cb8f8df82bc3d4f5

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Feb 17 12:21:08 2021 +0100

vkd3d-shader: Introduce a helper to print d3d-asm subscripts.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/trace.c | 75 +++++++++++++++++++++--------------------------
 1 file changed, 33 insertions(+), 42 deletions(-)

diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index f8b7923..b5abe22 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -702,6 +702,18 @@ static void shader_dump_decl_usage(struct vkd3d_d3d_asm_compiler *compiler,
 static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
         const struct vkd3d_shader_src_param *param);
 
+static void shader_print_subscript(struct vkd3d_d3d_asm_compiler *compiler,
+        unsigned int offset, const struct vkd3d_shader_src_param *rel_addr)
+{
+    vkd3d_string_buffer_printf(&compiler->buffer, "[");
+    if (rel_addr)
+    {
+        shader_dump_src_param(compiler, rel_addr);
+        vkd3d_string_buffer_printf(&compiler->buffer, " + ");
+    }
+    vkd3d_string_buffer_printf(&compiler->buffer, "%u]", offset);
+}
+
 static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg)
 {
     struct vkd3d_string_buffer *buffer = &compiler->buffer;
@@ -981,51 +993,28 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const
     {
         if (offset != ~0u)
         {
-            bool printbrackets = reg->idx[0].rel_addr
-                || reg->type == VKD3DSPR_INCONTROLPOINT
-                || reg->type == VKD3DSPR_IMMCONSTBUFFER
-                || ((compiler->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY
-                            || compiler->shader_version.type == VKD3D_SHADER_TYPE_HULL)
-                        && reg->type == VKD3DSPR_INPUT);
-
-            if (printbrackets)
-                shader_addline(buffer, "%s[", compiler->colours.reset);
-            if (reg->idx[0].rel_addr)
+            if (reg->idx[0].rel_addr || reg->type == VKD3DSPR_IMMCONSTBUFFER
+                    || reg->type == VKD3DSPR_INCONTROLPOINT || (reg->type == VKD3DSPR_INPUT
+                    && (compiler->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY
+                    || compiler->shader_version.type == VKD3D_SHADER_TYPE_HULL)))
             {
-                shader_dump_src_param(compiler, reg->idx[0].rel_addr);
-                shader_addline(buffer, " + ");
+                vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset);
+                shader_print_subscript(compiler, offset, reg->idx[0].rel_addr);
             }
-            shader_addline(buffer, "%u", offset);
-            if (printbrackets)
-                shader_addline(buffer, "]");
             else
-                shader_addline(buffer, "%s", compiler->colours.reset);
+            {
+                vkd3d_string_buffer_printf(buffer, "%u%s", offset, compiler->colours.reset);
+            }
 
             /* For CBs in sm < 5.1 we move the buffer offset from idx[1] to idx[2]
              * to normalise it with 5.1.
              * Here we should ignore it if it's a CB in sm < 5.1. */
             if (reg->idx[1].offset != ~0u &&
                     (reg->type != VKD3DSPR_CONSTBUFFER || shader_ver_ge(&compiler->shader_version, 5, 1)))
-            {
-                shader_addline(buffer, "[");
-                if (reg->idx[1].rel_addr)
-                {
-                    shader_dump_src_param(compiler, reg->idx[1].rel_addr);
-                    shader_addline(buffer, " + ");
-                }
-                shader_addline(buffer, "%u]", reg->idx[1].offset);
-            }
+                shader_print_subscript(compiler, reg->idx[1].offset, reg->idx[1].rel_addr);
 
             if (reg->idx[2].offset != ~0u)
-            {
-                shader_addline(buffer, "[");
-                if (reg->idx[2].rel_addr)
-                {
-                    shader_dump_src_param(compiler, reg->idx[2].rel_addr);
-                    shader_addline(buffer, " + ");
-                }
-                shader_addline(buffer, "%u]", reg->idx[2].offset);
-            }
+                shader_print_subscript(compiler, reg->idx[2].offset, reg->idx[2].rel_addr);
         }
         else
         {
@@ -1033,7 +1022,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const
         }
 
         if (reg->type == VKD3DSPR_FUNCTIONPOINTER)
-            shader_addline(buffer, "[%u]", reg->u.fp_body_idx);
+            shader_print_subscript(compiler, reg->u.fp_body_idx, NULL);
     }
     else
     {
@@ -1392,7 +1381,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
             vkd3d_string_buffer_printf(buffer, " ");
             shader_dump_register(compiler, &ins->declaration.cb.src.reg);
             if (shader_ver_ge(&compiler->shader_version, 5, 1))
-                shader_addline(buffer, "[%u]", ins->declaration.cb.size);
+                shader_print_subscript(compiler, ins->declaration.cb.size, NULL);
             shader_addline(buffer, ", %s",
                     ins->flags & VKD3DSI_INDEXED_DYNAMIC ? "dynamicIndexed" : "immediateIndexed");
             shader_dump_register_space(compiler, ins->declaration.cb.register_space);
@@ -1435,10 +1424,10 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
             break;
 
         case VKD3DSIH_DCL_INDEXABLE_TEMP:
-            vkd3d_string_buffer_printf(buffer, " %sx%u%s[%u], %u", compiler->colours.reg,
-                    ins->declaration.indexable_temp.register_idx, compiler->colours.reset,
-                    ins->declaration.indexable_temp.register_size,
-                    ins->declaration.indexable_temp.component_count);
+            vkd3d_string_buffer_printf(buffer, " %sx%u%s", compiler->colours.reg,
+                    ins->declaration.indexable_temp.register_idx, compiler->colours.reset);
+            shader_print_subscript(compiler, ins->declaration.indexable_temp.register_size, NULL);
+            vkd3d_string_buffer_printf(buffer, ", %u", ins->declaration.indexable_temp.component_count);
             break;
 
         case VKD3DSIH_DCL_INPUT_PS:
@@ -1480,8 +1469,10 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
             break;
 
         case VKD3DSIH_DCL_INTERFACE:
-            vkd3d_string_buffer_printf(buffer, " fp%u[%u][%u] = {...}", ins->declaration.fp.index,
-                    ins->declaration.fp.array_size, ins->declaration.fp.body_count);
+            vkd3d_string_buffer_printf(buffer, " fp%u", ins->declaration.fp.index);
+            shader_print_subscript(compiler, ins->declaration.fp.array_size, NULL);
+            shader_print_subscript(compiler, ins->declaration.fp.body_count, NULL);
+            vkd3d_string_buffer_printf(buffer, " = {...}");
             break;
 
         case VKD3DSIH_DCL_RESOURCE_RAW:




More information about the wine-cvs mailing list