mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/ir: Handle all component types in vsir_data_type_from_component_type().
This commit is contained in:
Notes:
Henri Verbeet
2025-09-10 12:04:00 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1719
@@ -4499,7 +4499,7 @@ static uint32_t spirv_compiler_emit_int_to_bool(struct spirv_compiler *compiler,
|
||||
op = condition & VKD3D_SHADER_CONDITIONAL_OP_Z ? SpvOpIEqual : SpvOpINotEqual;
|
||||
|
||||
return vkd3d_spirv_build_op_tr2(builder, &builder->function_stream, op, type_id, val_id,
|
||||
data_type == VSIR_DATA_U64
|
||||
data_type_is_64_bit(data_type)
|
||||
? spirv_compiler_get_constant_uint64_vector(compiler, 0, component_count)
|
||||
: spirv_compiler_get_constant_uint_vector(compiler, 0, component_count));
|
||||
}
|
||||
@@ -4729,6 +4729,7 @@ static uint32_t spirv_compiler_emit_constant_array(struct spirv_compiler *compil
|
||||
&icb->data[component_count * i]);
|
||||
break;
|
||||
case VSIR_DATA_F64:
|
||||
case VSIR_DATA_I64:
|
||||
case VSIR_DATA_U64:
|
||||
{
|
||||
uint64_t *data = (uint64_t *)icb->data;
|
||||
@@ -7631,11 +7632,12 @@ static void spirv_compiler_emit_bool_cast(struct spirv_compiler *compiler,
|
||||
/* ITOD is not supported. Frontends which emit bool casts must use ITOF for double. */
|
||||
val_id = spirv_compiler_emit_bool_to_double(compiler, 1, val_id, instruction->opcode == VSIR_OP_ITOF);
|
||||
}
|
||||
else if (dst->reg.data_type == VSIR_DATA_U16 || dst->reg.data_type == VSIR_DATA_U32)
|
||||
else if (dst->reg.data_type == VSIR_DATA_I16 || dst->reg.data_type == VSIR_DATA_I32
|
||||
|| dst->reg.data_type == VSIR_DATA_U16 || dst->reg.data_type == VSIR_DATA_U32)
|
||||
{
|
||||
val_id = spirv_compiler_emit_bool_to_int(compiler, 1, val_id, instruction->opcode == VSIR_OP_ITOI);
|
||||
}
|
||||
else if (dst->reg.data_type == VSIR_DATA_U64)
|
||||
else if (dst->reg.data_type == VSIR_DATA_I64 || dst->reg.data_type == VSIR_DATA_U64)
|
||||
{
|
||||
val_id = spirv_compiler_emit_bool_to_int64(compiler, 1, val_id, instruction->opcode == VSIR_OP_ITOI);
|
||||
}
|
||||
@@ -7731,7 +7733,7 @@ static enum vkd3d_result spirv_compiler_emit_alu_instruction(struct spirv_compil
|
||||
condition_id = spirv_compiler_emit_int_to_bool(compiler,
|
||||
VKD3D_SHADER_CONDITIONAL_OP_NZ, src[1].reg.data_type, component_count, src_ids[1]);
|
||||
|
||||
if (dst[0].reg.data_type == VSIR_DATA_U64)
|
||||
if (data_type_is_64_bit(dst[0].reg.data_type))
|
||||
uint_max_id = spirv_compiler_get_constant_uint64_vector(compiler, UINT64_MAX, component_count);
|
||||
else
|
||||
uint_max_id = spirv_compiler_get_constant_uint_vector(compiler, UINT_MAX, component_count);
|
||||
@@ -7846,7 +7848,7 @@ static void spirv_compiler_emit_ext_glsl_instruction(struct spirv_compiler *comp
|
||||
unsigned int i, component_count;
|
||||
enum GLSLstd450 glsl_inst;
|
||||
|
||||
if (src[0].reg.data_type == VSIR_DATA_U64 && (instruction->opcode == VSIR_OP_FIRSTBIT_HI
|
||||
if (data_type_is_64_bit(src[0].reg.data_type) && (instruction->opcode == VSIR_OP_FIRSTBIT_HI
|
||||
|| instruction->opcode == VSIR_OP_FIRSTBIT_LO || instruction->opcode == VSIR_OP_FIRSTBIT_SHI))
|
||||
{
|
||||
/* At least some drivers support this anyway, but if validation is enabled it will fail. */
|
||||
@@ -8257,7 +8259,7 @@ static void spirv_compiler_emit_bitfield_instruction(struct spirv_compiler *comp
|
||||
|
||||
component_type = vkd3d_component_type_from_data_type(dst->reg.data_type);
|
||||
type_id = spirv_get_type_id_for_component_type(builder, component_type, 1);
|
||||
size = (src[src_count - 1].reg.data_type == VSIR_DATA_U64) ? 0x40 : 0x20;
|
||||
size = data_type_is_64_bit(src[src_count - 1].reg.data_type) ? 0x40 : 0x20;
|
||||
mask_id = spirv_compiler_get_constant_uint(compiler, size - 1);
|
||||
size_id = spirv_compiler_get_constant_uint(compiler, size);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user