vkd3d-shader/spirv: Pass a vsir_data_type to spirv_compiler_emit_array_variable().

This commit is contained in:
Henri Verbeet
2025-10-03 01:01:59 +02:00
parent 8923847ed0
commit 94990717f9
Notes: Henri Verbeet 2025-10-06 19:48:32 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1767

View File

@@ -3905,15 +3905,14 @@ static void spirv_compiler_emit_register_debug_name(struct vkd3d_spirv_builder *
} }
static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compiler, static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compiler,
struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class, struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class, enum vsir_data_type data_type,
enum vkd3d_shader_component_type component_type, unsigned int component_count, unsigned int component_count, const unsigned int *array_lengths, unsigned int length_count)
const unsigned int *array_lengths, unsigned int length_count)
{ {
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
uint32_t type_id, length_id, ptr_type_id; uint32_t type_id, length_id, ptr_type_id;
unsigned int i; unsigned int i;
type_id = spirv_get_type_id_for_component_type(builder, component_type, component_count); type_id = spirv_get_type_id(builder, data_type, component_count);
for (i = 0; i < length_count; ++i) for (i = 0; i < length_count; ++i)
{ {
if (!array_lengths[i]) if (!array_lengths[i])
@@ -3921,17 +3920,16 @@ static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compil
length_id = spirv_compiler_get_constant_uint(compiler, array_lengths[i]); length_id = spirv_compiler_get_constant_uint(compiler, array_lengths[i]);
type_id = vkd3d_spirv_get_op_type_array(builder, type_id, length_id); type_id = vkd3d_spirv_get_op_type_array(builder, type_id, length_id);
} }
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id); ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id);
return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0); return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0);
} }
static uint32_t spirv_compiler_emit_variable(struct spirv_compiler *compiler, static uint32_t spirv_compiler_emit_variable(struct spirv_compiler *compiler, struct vkd3d_spirv_stream *stream,
struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class, SpvStorageClass storage_class, enum vsir_data_type data_type, unsigned int component_count)
enum vkd3d_shader_component_type component_type, unsigned int component_count)
{ {
return spirv_compiler_emit_array_variable(compiler, stream, storage_class, return spirv_compiler_emit_array_variable(compiler, stream,
component_type, component_count, NULL, 0); storage_class, data_type, component_count, NULL, 0);
} }
static const struct vkd3d_spec_constant_info static const struct vkd3d_spec_constant_info
@@ -4404,7 +4402,7 @@ static uint32_t spirv_compiler_get_register_id(struct spirv_compiler *compiler,
} }
return spirv_compiler_emit_variable(compiler, &builder->global_stream, return spirv_compiler_emit_variable(compiler, &builder->global_stream,
SpvStorageClassPrivate, VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_VEC4_SIZE); SpvStorageClassPrivate, VSIR_DATA_F32, VKD3D_VEC4_SIZE);
} }
static bool vkd3d_swizzle_is_equal(uint32_t dst_write_mask, uint32_t swizzle, uint32_t write_mask) static bool vkd3d_swizzle_is_equal(uint32_t dst_write_mask, uint32_t swizzle, uint32_t write_mask)
@@ -5282,8 +5280,8 @@ static uint32_t spirv_compiler_emit_draw_parameter_fixup(struct spirv_compiler *
vkd3d_spirv_enable_capability(builder, SpvCapabilityDrawParameters); vkd3d_spirv_enable_capability(builder, SpvCapabilityDrawParameters);
base_var_id = spirv_compiler_emit_variable(compiler, &builder->global_stream, base_var_id = spirv_compiler_emit_variable(compiler,
SpvStorageClassInput, VKD3D_SHADER_COMPONENT_INT, 1); &builder->global_stream, SpvStorageClassInput, VSIR_DATA_I32, 1);
vkd3d_spirv_add_iface_variable(builder, base_var_id); vkd3d_spirv_add_iface_variable(builder, base_var_id);
spirv_compiler_decorate_builtin(compiler, base_var_id, base); spirv_compiler_decorate_builtin(compiler, base_var_id, base);
@@ -5646,7 +5644,7 @@ static uint32_t spirv_compiler_emit_builtin_variable_v(struct spirv_compiler *co
sizes[0] = max(sizes[0], builtin->spirv_array_size); sizes[0] = max(sizes[0], builtin->spirv_array_size);
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, storage_class, id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, storage_class,
vkd3d_component_type_from_data_type(builtin->data_type), builtin->component_count, array_sizes, size_count); builtin->data_type, builtin->component_count, array_sizes, size_count);
vkd3d_spirv_add_iface_variable(builder, id); vkd3d_spirv_add_iface_variable(builder, id);
spirv_compiler_decorate_builtin(compiler, id, builtin->spirv_builtin); spirv_compiler_decorate_builtin(compiler, id, builtin->spirv_builtin);
@@ -5834,7 +5832,7 @@ static void spirv_compiler_emit_input(struct spirv_compiler *compiler,
unsigned int location = signature_element->target_location; unsigned int location = signature_element->target_location;
input_id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, input_id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream,
storage_class, component_type, input_component_count, array_sizes, 2); storage_class, data_type, input_component_count, array_sizes, 2);
vkd3d_spirv_add_iface_variable(builder, input_id); vkd3d_spirv_add_iface_variable(builder, input_id);
if (reg_type == VKD3DSPR_PATCHCONST) if (reg_type == VKD3DSPR_PATCHCONST)
{ {
@@ -5854,7 +5852,7 @@ static void spirv_compiler_emit_input(struct spirv_compiler *compiler,
{ {
storage_class = SpvStorageClassPrivate; storage_class = SpvStorageClassPrivate;
var_id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, var_id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream,
storage_class, VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_VEC4_SIZE, array_sizes, 2); storage_class, VSIR_DATA_F32, VKD3D_VEC4_SIZE, array_sizes, 2);
} }
vkd3d_symbol_set_register_info(&reg_symbol, var_id, storage_class, vkd3d_symbol_set_register_info(&reg_symbol, var_id, storage_class,
@@ -6026,7 +6024,6 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
unsigned int component_idx, output_component_count; unsigned int component_idx, output_component_count;
const struct signature_element *signature_element; const struct signature_element *signature_element;
enum vkd3d_shader_component_type component_type;
const struct shader_signature *shader_signature; const struct shader_signature *shader_signature;
const struct vkd3d_spirv_builtin *builtin; const struct vkd3d_spirv_builtin *builtin;
enum vkd3d_shader_sysval_semantic sysval; enum vkd3d_shader_sysval_semantic sysval;
@@ -6063,14 +6060,12 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
if (builtin) if (builtin)
{ {
data_type = builtin->data_type; data_type = builtin->data_type;
component_type = vkd3d_component_type_from_data_type(data_type);
if (!builtin->spirv_array_size) if (!builtin->spirv_array_size)
output_component_count = builtin->component_count; output_component_count = builtin->component_count;
} }
else else
{ {
component_type = signature_element->component_type; data_type = vsir_data_type_from_component_type(signature_element->component_type);
data_type = vsir_data_type_from_component_type(component_type);
} }
storage_class = SpvStorageClassOutput; storage_class = SpvStorageClassOutput;
@@ -6111,7 +6106,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
{ {
storage_class = SpvStorageClassPrivate; storage_class = SpvStorageClassPrivate;
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream,
storage_class, component_type, output_component_count, array_sizes, 2); storage_class, data_type, output_component_count, array_sizes, 2);
} }
else else
{ {
@@ -6124,7 +6119,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
location = signature_element->semantic_index; location = signature_element->semantic_index;
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream,
storage_class, component_type, output_component_count, array_sizes, 2); storage_class, data_type, output_component_count, array_sizes, 2);
vkd3d_spirv_add_iface_variable(builder, id); vkd3d_spirv_add_iface_variable(builder, id);
if (is_dual_source_blending(compiler) && location < 2) if (is_dual_source_blending(compiler) && location < 2)
@@ -6157,7 +6152,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
{ {
storage_class = SpvStorageClassPrivate; storage_class = SpvStorageClassPrivate;
var_id = spirv_compiler_emit_variable(compiler, &builder->global_stream, var_id = spirv_compiler_emit_variable(compiler, &builder->global_stream,
storage_class, VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_VEC4_SIZE); storage_class, VSIR_DATA_F32, VKD3D_VEC4_SIZE);
} }
vkd3d_symbol_set_register_info(&reg_symbol, var_id, storage_class, vkd3d_symbol_set_register_info(&reg_symbol, var_id, storage_class,
@@ -6495,7 +6490,7 @@ static void spirv_compiler_emit_temps(struct spirv_compiler *compiler, uint32_t
for (i = 0; i < compiler->temp_count; ++i) for (i = 0; i < compiler->temp_count; ++i)
{ {
id = spirv_compiler_emit_variable(compiler, &builder->global_stream, id = spirv_compiler_emit_variable(compiler, &builder->global_stream,
SpvStorageClassPrivate, VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_VEC4_SIZE); SpvStorageClassPrivate, VSIR_DATA_F32, VKD3D_VEC4_SIZE);
if (!i) if (!i)
compiler->temp_id = id; compiler->temp_id = id;
VKD3D_ASSERT(id == compiler->temp_id + i); VKD3D_ASSERT(id == compiler->temp_id + i);