[PATCH vkd3d 8/8] vkd3d-shader/glsl: Implement shader_glsl_get_register_name().

Atharva Nimbalkar atharvakn at gmail.com
Tue Aug 17 23:19:21 CDT 2021


Signed-off-by: Atharva Nimbalkar <atharvakn at gmail.com>
---
 libs/vkd3d-shader/glsl.c | 58 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 52 insertions(+), 6 deletions(-)

diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c
index 32458f0..afab2c3 100644
--- a/libs/vkd3d-shader/glsl.c
+++ b/libs/vkd3d-shader/glsl.c
@@ -219,13 +219,59 @@ static void shader_glsl_get_register_name(struct vkd3d_glsl_generator *gen,
         const struct vkd3d_shader_register *reg, enum vkd3d_data_type data_type,
         struct vkd3d_string_buffer *register_name, bool *is_swizzled)
 {
-    /* TODO: Add implementation
-     * Sets an error state as of now
-     */
-    if(is_swizzled)
+    /*
+    * Currently adds support for input and output shaders.
+    * with support for relative addressing.
+    */
+
+    const struct vkd3d_shader_version *version = &gen->version;
+    const char *prefix = shader_get_type_prefix(version->type);
+    struct glsl_src_param rel_param0, rel_param1;
+
+    rel_param0.param_str = vkd3d_string_buffer_get(&gen->string_buffers);
+    rel_param1.param_str = vkd3d_string_buffer_get(&gen->string_buffers);
+    if (reg->idx[0].offset != ~0u && reg->idx[0].rel_addr)
+        glsl_src_param_init_ext(gen, reg->idx[0].rel_addr, VKD3DSP_WRITEMASK_0,
+                &rel_param0, reg->idx[0].rel_addr->reg.data_type);
+    if (reg->idx[1].offset != ~0u && reg->idx[1].rel_addr)
+        glsl_src_param_init_ext(gen, reg->idx[1].rel_addr, VKD3DSP_WRITEMASK_0,
+                &rel_param1, reg->idx[1].rel_addr->reg.data_type);
+    if (is_swizzled)
         *is_swizzled = false;
-    vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
-            "Internal compiler error: Unhandled register type %#x.", reg->type);
+
+    switch (reg->type)
+    {
+        case VKD3DSPR_INPUT:
+            if (version->type == VKD3D_SHADER_TYPE_VERTEX)
+            {
+                if (reg->idx[0].rel_addr)
+                {
+                    vkd3d_string_buffer_printf(register_name, "%s_in[%s + %u]",
+                            prefix, rel_param0.param_str->buffer, reg->idx[0].offset);
+                }
+                else
+                {
+                    vkd3d_string_buffer_printf(register_name, "%s_in%u", prefix, reg->idx[0].offset);
+                }
+                break;
+            }
+            break;
+        case VKD3DSPR_OUTPUT:
+            if (reg->idx[0].rel_addr)
+                vkd3d_string_buffer_printf(register_name, "%s_out[%s + %u]",
+                        prefix, rel_param0.param_str->buffer, reg->idx[0].offset);
+            else
+                vkd3d_string_buffer_printf(register_name, "%s_out[%u]", prefix, reg->idx[0].offset);
+            break;
+        default:
+            vkd3d_string_buffer_printf(register_name, "unrecognised_register");
+            vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
+                "Unhandled register type %#x.\n", reg->type);
+            break;
+    }
+
+    glsl_src_param_cleanup(&rel_param0, &gen->string_buffers);
+    glsl_src_param_cleanup(&rel_param1, &gen->string_buffers);
 }
 
 static void shader_glsl_sprintf_cast(struct vkd3d_glsl_generator *gen,
-- 
2.32.0




More information about the wine-devel mailing list