[PATCH vkd3d 7/8] vkd3d-shader: Avoid redeclaring inputs in vkd3d_dxbc_compiler_emit_default_control_point_phase().
Henri Verbeet
hverbeet at codeweavers.com
Mon Mar 22 07:20:08 CDT 2021
We've already set these up in vkd3d_dxbc_compiler_emit_hull_shader_inputs().
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 57 +++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 30 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 03a6f595..64d4e8a7 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -6207,16 +6207,32 @@ static void vkd3d_dxbc_compiler_emit_default_control_point_phase(struct vkd3d_dx
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;
- uint32_t type_id, input_ptr_type_id, output_ptr_type_id;
- const struct vkd3d_spirv_builtin *input_builtin;
enum vkd3d_shader_component_type component_type;
uint32_t input_id, output_id, dst_id, src_id;
+ struct vkd3d_shader_src_param invocation;
+ struct vkd3d_shader_register input_reg;
+ uint32_t type_id, output_ptr_type_id;
unsigned int component_count;
uint32_t invocation_id;
unsigned int i;
invocation_id = vkd3d_dxbc_compiler_emit_load_invocation_id(compiler);
+ memset(&invocation, 0, sizeof(invocation));
+ invocation.reg.type = VKD3DSPR_OUTPOINTID;
+ invocation.reg.data_type = VKD3D_DATA_INT;
+ invocation.reg.idx[0].offset = ~0u;
+ invocation.reg.idx[1].offset = ~0u;
+ invocation.reg.idx[2].offset = ~0u;
+ invocation.swizzle = VKD3D_SHADER_NO_SWIZZLE;
+
+ memset(&input_reg, 0, sizeof(input_reg));
+ input_reg.type = VKD3DSPR_INPUT;
+ input_reg.data_type = VKD3D_DATA_FLOAT;
+ input_reg.idx[0].rel_addr = &invocation;
+ input_reg.idx[2].offset = ~0u;
+ input_id = vkd3d_dxbc_compiler_get_register_id(compiler, &input_reg);
+
assert(input_signature->element_count == output_signature->element_count);
for (i = 0; i < output_signature->element_count; ++i)
{
@@ -6226,31 +6242,13 @@ static void vkd3d_dxbc_compiler_emit_default_control_point_phase(struct vkd3d_dx
assert(input->mask == output->mask);
assert(input->component_type == output->component_type);
- if ((input_builtin = get_spirv_builtin_for_sysval(compiler, vkd3d_siv_from_sysval(input->sysval_semantic))))
- {
- component_type = input_builtin->component_type;
- component_count = input_builtin->component_count;
- }
- else
- {
- component_type = input->component_type;
- component_count = vkd3d_write_mask_component_count(input->mask);
- }
-
- if (input_builtin)
- {
- input_id = vkd3d_dxbc_compiler_emit_builtin_variable(compiler,
- 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, input->register_index);
- }
- vkd3d_spirv_build_op_name(builder, input_id, "vicp%u", input->register_index);
+ input_reg.idx[1].offset = input->register_index;
+ input_id = vkd3d_dxbc_compiler_get_register_id(compiler, &input_reg);
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_FLOAT, 4);
+ src_id = vkd3d_spirv_build_op_load(builder, type_id, input_id, SpvMemoryAccessMaskNone);
+ component_type = output->component_type;
+ component_count = vkd3d_write_mask_component_count(output->mask);
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);
@@ -6259,11 +6257,10 @@ static void vkd3d_dxbc_compiler_emit_default_control_point_phase(struct vkd3d_dx
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);
- input_ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, SpvStorageClassInput, type_id);
-
dst_id = vkd3d_spirv_build_op_access_chain1(builder, output_ptr_type_id, output_id, invocation_id);
- src_id = vkd3d_spirv_build_op_access_chain1(builder, input_ptr_type_id, input_id, invocation_id);
- vkd3d_spirv_build_op_copy_memory(builder, dst_id, src_id, SpvMemoryAccessMaskNone);
+
+ vkd3d_dxbc_compiler_emit_store(compiler, dst_id, output->mask,
+ component_type, SpvStorageClassOutput, VKD3DSP_WRITEMASK_ALL, src_id);
}
}
--
2.20.1
More information about the wine-devel
mailing list