Henri Verbeet : vkd3d-shader: Properly handle coalesced outputs in vkd3d_dxbc_compiler_emit_store_shader_output().

Alexandre Julliard julliard at winehq.org
Mon Mar 22 16:48:26 CDT 2021


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Mar 22 13:20:02 2021 +0100

vkd3d-shader: Properly handle coalesced outputs in vkd3d_dxbc_compiler_emit_store_shader_output().

Multiple patch constant or output signature elements may be coalesced
into a single output register by needs_private_io_variable() in
vkd3d_dxbc_compiler_emit_output(). When this happens, only the original
element will have a corresponding variable ID assigned in output_info[].

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

---

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

diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index a7361aa..4598ffa 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -4852,19 +4852,33 @@ static uint32_t vkd3d_dxbc_compiler_get_output_array_index(struct vkd3d_dxbc_com
 }
 
 static void vkd3d_dxbc_compiler_emit_store_shader_output(struct vkd3d_dxbc_compiler *compiler,
-        const struct vkd3d_shader_signature_element *output,
+        const struct vkd3d_shader_signature *signature, const struct vkd3d_shader_signature_element *output,
         const struct vkd3d_shader_output_info *output_info,
         uint32_t output_index_id, uint32_t val_id, unsigned int write_mask)
 {
     unsigned int dst_write_mask, use_mask, uninit_mask, swizzle, mask;
     struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
     uint32_t type_id, zero_id, ptr_type_id, chain_id, object_id;
+    const struct vkd3d_shader_signature_element *element;
     unsigned int i, index, array_idx;
     uint32_t output_id;
 
     dst_write_mask = output->mask;
-    write_mask &= dst_write_mask;
     use_mask = output->used_mask;
+    if (!output->sysval_semantic)
+    {
+        for (i = 0; i < signature->element_count; ++i)
+        {
+            element = &signature->elements[i];
+            if (element->register_index != output->register_index)
+                continue;
+            if (element->sysval_semantic)
+                continue;
+            dst_write_mask |= element->mask;
+            use_mask |= element->used_mask;
+        }
+    }
+    write_mask &= dst_write_mask;
 
     if (!write_mask)
         return;
@@ -4985,13 +4999,15 @@ static void vkd3d_dxbc_compiler_emit_shader_epilogue_function(struct vkd3d_dxbc_
 
     for (i = 0; i < signature->element_count; ++i)
     {
+        if (!compiler->output_info[i].id)
+            continue;
+
         variable_idx = vkd3d_dxbc_compiler_get_output_variable_index(compiler,
                 signature->elements[i].register_index);
-
         if (!param_id[variable_idx])
             continue;
 
-        vkd3d_dxbc_compiler_emit_store_shader_output(compiler,
+        vkd3d_dxbc_compiler_emit_store_shader_output(compiler, signature,
                 &signature->elements[i], &compiler->output_info[i], output_index_id,
                 param_id[variable_idx], compiler->private_output_variable_write_mask[variable_idx]);
     }




More information about the wine-cvs mailing list