=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d-shader: Avoid using SPIR-V built-ins for shader interface between tessellation stages.

Alexandre Julliard julliard at winehq.org
Wed Feb 20 16:34:06 CST 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Feb 20 13:42:51 2019 +0100

vkd3d-shader: Avoid using SPIR-V built-ins for shader interface between tessellation stages.

We can do this because both tessellation shaders are required in
Direct3D.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/spirv.c | 67 +++++++++++++++++------------------------------
 1 file changed, 24 insertions(+), 43 deletions(-)

diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 6ba169f..afed8a2 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -129,20 +129,6 @@ static const void *vkd3d_find_struct_(const struct vkd3d_struct *chain,
     return NULL;
 }
 
-static enum vkd3d_shader_input_sysval_semantic vkd3d_siv_from_sysval(enum vkd3d_sysval_semantic sysval)
-{
-    switch (sysval)
-    {
-        case VKD3D_SV_NONE:
-            return VKD3D_SIV_NONE;
-        case VKD3D_SV_POSITION:
-            return VKD3D_SIV_POSITION;
-        default:
-            FIXME("Unhandled sysval %#x.\n", sysval);
-            return VKD3D_SIV_NONE;
-    }
-}
-
 #define VKD3D_SPIRV_VERSION 0x00010000
 #define VKD3D_SPIRV_GENERATOR_ID 18
 #define VKD3D_SPIRV_GENERATOR_VERSION 1
@@ -3558,9 +3544,6 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi
         return 0;
     }
 
-    if (!sysval && signature_element->sysval_semantic)
-        sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic);
-
     builtin = get_spirv_builtin_for_sysval(compiler, sysval);
 
     component_idx = vkd3d_write_mask_get_component_idx(dst->write_mask);
@@ -5014,11 +4997,12 @@ static const struct vkd3d_shader_phase *vkd3d_dxbc_compiler_get_control_point_ph
 
 static void vkd3d_dxbc_compiler_emit_default_control_point_phase(struct vkd3d_dxbc_compiler *compiler)
 {
-    const struct vkd3d_shader_signature *signature = compiler->input_signature;
+    const struct vkd3d_shader_signature *output_signature = compiler->output_signature;
+    const struct vkd3d_shader_signature *input_signature = compiler->input_signature;
     struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+    const struct vkd3d_spirv_builtin *builtin, *input_builtin;
     uint32_t type_id, input_ptr_type_id, output_ptr_type_id;
     uint32_t input_id, output_id, dst_id, src_id;
-    const struct vkd3d_spirv_builtin *builtin;
     enum vkd3d_component_type component_type;
     unsigned int component_count;
     uint32_t invocation_id;
@@ -5030,48 +5014,45 @@ static void vkd3d_dxbc_compiler_emit_default_control_point_phase(struct vkd3d_dx
     type_id = vkd3d_spirv_get_type_id(builder, builtin->component_type, builtin->component_count);
     invocation_id = vkd3d_spirv_build_op_load(builder, type_id, invocation_id, SpvMemoryAccessMaskNone);
 
-    for (i = 0; i < signature->element_count; ++i)
+    assert(input_signature->element_count == output_signature->element_count);
+    for (i = 0; i < output_signature->element_count; ++i)
     {
-        const struct vkd3d_shader_signature_element *e = &signature->elements[i];
+        const struct vkd3d_shader_signature_element *output = &output_signature->elements[i];
+        const struct vkd3d_shader_signature_element *input = &input_signature->elements[i];
+
+        assert((input->mask & 0xff) == (output->mask & 0xff));
+        assert(input->component_type == output->component_type);
 
-        if ((builtin = get_spirv_builtin_for_sysval(compiler, e->sysval_semantic)))
+        if ((input_builtin = get_spirv_builtin_for_sysval(compiler, input->sysval_semantic)))
         {
-            component_type = builtin->component_type;
-            component_count = builtin->component_count;
+            component_type = input_builtin->component_type;
+            component_count = input_builtin->component_count;
         }
         else
         {
-            component_type = e->component_type;
-            component_count = vkd3d_write_mask_component_count(e->mask & 0xff);
+            component_type = input->component_type;
+            component_count = vkd3d_write_mask_component_count(input->mask & 0xff);
         }
 
-        if (builtin)
+        if (input_builtin)
         {
             input_id = vkd3d_dxbc_compiler_emit_builtin_variable(compiler,
-                    builtin, SpvStorageClassInput, compiler->input_control_point_count);
+                    input_builtin, SpvStorageClassInput, compiler->input_control_point_count);
         }
         else
         {
             input_id = vkd3d_dxbc_compiler_emit_array_variable(compiler, &builder->global_stream,
                     SpvStorageClassInput, component_type, component_count, compiler->input_control_point_count);
             vkd3d_spirv_add_iface_variable(builder, input_id);
-            vkd3d_spirv_build_op_decorate1(builder, input_id, SpvDecorationLocation, e->register_index);
+            vkd3d_spirv_build_op_decorate1(builder, input_id, SpvDecorationLocation, input->register_index);
         }
-        vkd3d_spirv_build_op_name(builder, input_id, "vicp%u", e->register_index);
+        vkd3d_spirv_build_op_name(builder, input_id, "vicp%u", input->register_index);
 
-        if (builtin)
-        {
-            output_id = vkd3d_dxbc_compiler_emit_builtin_variable(compiler,
-                    builtin, SpvStorageClassOutput, compiler->output_control_point_count);
-        }
-        else
-        {
-            output_id = vkd3d_dxbc_compiler_emit_array_variable(compiler, &builder->global_stream,
-                    SpvStorageClassOutput, component_type, component_count, compiler->output_control_point_count);
-            vkd3d_spirv_add_iface_variable(builder, output_id);
-            vkd3d_spirv_build_op_decorate1(builder, output_id, SpvDecorationLocation, e->register_index);
-        }
-        vkd3d_spirv_build_op_name(builder, output_id, "vocp%u", e->register_index);
+        output_id = vkd3d_dxbc_compiler_emit_array_variable(compiler, &builder->global_stream,
+                SpvStorageClassOutput, component_type, component_count, compiler->output_control_point_count);
+        vkd3d_spirv_add_iface_variable(builder, output_id);
+        vkd3d_spirv_build_op_decorate1(builder, output_id, SpvDecorationLocation, output->register_index);
+        vkd3d_spirv_build_op_name(builder, output_id, "vocp%u", output->register_index);
 
         type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
         output_ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, SpvStorageClassOutput, type_id);




More information about the wine-cvs mailing list