mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/spirv: Pass a vsir_data_type to spirv_compiler_emit_array_variable().
This commit is contained in:
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
@@ -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(®_symbol, var_id, storage_class,
|
vkd3d_symbol_set_register_info(®_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(®_symbol, var_id, storage_class,
|
vkd3d_symbol_set_register_info(®_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);
|
||||||
|
|||||||
Reference in New Issue
Block a user