Isabella Bosia : vkd3d-shader: Implement VKD3D_SHADER_TARGET_SPIRV_TEXT.

Alexandre Julliard julliard at winehq.org
Mon Sep 7 16:07:10 CDT 2020


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

Author: Isabella Bosia <ibosia at codeweavers.com>
Date:   Mon Sep  7 12:35:41 2020 +0100

vkd3d-shader: Implement VKD3D_SHADER_TARGET_SPIRV_TEXT.

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

---

 include/vkd3d_shader.h                | 13 ++++++++++
 libs/vkd3d-shader/spirv.c             | 47 +++++++++++++++++++++++++++++++++++
 libs/vkd3d-shader/vkd3d_shader_main.c |  3 +++
 3 files changed, 63 insertions(+)

diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h
index fe6e958..5c825df 100644
--- a/include/vkd3d_shader.h
+++ b/include/vkd3d_shader.h
@@ -73,6 +73,18 @@ enum vkd3d_shader_compile_option_buffer_uav
     VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_BUFFER_UAV),
 };
 
+enum vkd3d_shader_compile_option_formatting_flags
+{
+    VKD3D_SHADER_COMPILE_OPTION_FORMATTING_NONE             = 0x00000000,
+    VKD3D_SHADER_COMPILE_OPTION_FORMATTING_COLOUR           = 0x00000001,
+    VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT           = 0x00000002,
+    VKD3D_SHADER_COMPILE_OPTION_FORMATTING_SHOW_BYTE_OFFSET = 0x00000004,
+    VKD3D_SHADER_COMPILE_OPTION_FORMATTING_NO_HEADER        = 0x00000008,
+    VKD3D_SHADER_COMPILE_OPTION_FORMATTING_FRIENDLY_NAMES   = 0x00000010,
+
+    VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_FORMATTING_FLAGS),
+};
+
 enum vkd3d_shader_compile_option_name
 {
     /**
@@ -451,6 +463,7 @@ enum vkd3d_shader_target_type
      * shaders.
      */
     VKD3D_SHADER_TARGET_SPIRV_BINARY,
+    VKD3D_SHADER_TARGET_SPIRV_TEXT,
 
     VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_TARGET_TYPE),
 };
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 6a6d187..530e802 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -50,6 +50,32 @@ static spv_target_env spv_target_env_from_vkd3d(enum vkd3d_shader_spirv_environm
     }
 }
 
+static uint32_t get_binary_to_text_options(enum vkd3d_shader_compile_option_formatting_flags formatting)
+{
+    uint32_t out = 0;
+    unsigned int i;
+
+    static const struct
+    {
+        enum vkd3d_shader_compile_option_formatting_flags vkd3d;
+        uint32_t spv;
+    }
+    valuemap[] =
+    {
+        {VKD3D_SHADER_COMPILE_OPTION_FORMATTING_COLOUR,           SPV_BINARY_TO_TEXT_OPTION_COLOR           },
+        {VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT,           SPV_BINARY_TO_TEXT_OPTION_INDENT          },
+        {VKD3D_SHADER_COMPILE_OPTION_FORMATTING_SHOW_BYTE_OFFSET, SPV_BINARY_TO_TEXT_OPTION_SHOW_BYTE_OFFSET},
+        {VKD3D_SHADER_COMPILE_OPTION_FORMATTING_NO_HEADER,        SPV_BINARY_TO_TEXT_OPTION_NO_HEADER       },
+        {VKD3D_SHADER_COMPILE_OPTION_FORMATTING_FRIENDLY_NAMES,   SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES  },
+    };
+
+    for (i = 0; i < ARRAY_SIZE(valuemap); i++)
+        if (formatting & valuemap[i].vkd3d)
+            out |= valuemap[i].spv;
+
+    return out;
+}
+
 static enum vkd3d_result vkd3d_spirv_binary_to_text(const struct vkd3d_shader_code *spirv,
         enum vkd3d_shader_spirv_environment environment, uint32_t options, struct vkd3d_shader_code *out)
 {
@@ -130,6 +156,15 @@ static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv,
 
 #else
 
+static uint32_t get_binary_to_text_options(enum vkd3d_shader_compile_option_formatting_flags formatting)
+{
+    return 0;
+}
+static enum vkd3d_result vkd3d_spirv_binary_to_text(const struct vkd3d_shader_code *spirv,
+        enum vkd3d_shader_spirv_environment environment, uint32_t options, struct vkd3d_shader_code *out)
+{
+    return VKD3D_ERROR;
+}
 static void vkd3d_spirv_dump(const struct vkd3d_shader_code *spirv,
         enum vkd3d_shader_spirv_environment environment) {}
 static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv,
@@ -9187,6 +9222,18 @@ int vkd3d_dxbc_compiler_generate_spirv(struct vkd3d_dxbc_compiler *compiler,
     if (compiler->failed)
         return VKD3D_ERROR_INVALID_SHADER;
 
+    if (compile_info->target_type == VKD3D_SHADER_TARGET_SPIRV_TEXT)
+    {
+        struct vkd3d_shader_code text;
+        enum vkd3d_shader_spirv_environment environment = vkd3d_dxbc_compiler_get_target_environment(compiler);
+        if (vkd3d_spirv_binary_to_text(spirv, environment,
+                    get_binary_to_text_options(VKD3D_SHADER_COMPILE_OPTION_FORMATTING_FRIENDLY_NAMES |
+                                               VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT),
+                    &text) != VKD3D_OK)
+            return VKD3D_ERROR;
+        *spirv = text;
+    }
+
     return VKD3D_OK;
 }
 
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index e3abaf7..6984843 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -1063,6 +1063,9 @@ const enum vkd3d_shader_target_type *vkd3d_shader_get_supported_target_types(
     static const enum vkd3d_shader_target_type dxbc_tpf_types[] =
     {
         VKD3D_SHADER_TARGET_SPIRV_BINARY,
+#ifdef HAVE_SPIRV_TOOLS
+        VKD3D_SHADER_TARGET_SPIRV_TEXT,
+#endif
     };
 
     TRACE("source_type %#x, count %p.\n", source_type, count);




More information about the wine-cvs mailing list