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