vkd3d-shader/dxil: Rewrite sm6_value_get_constant_uint() in terms of the SM6 value.

Instead of using the VSIR register.
This commit is contained in:
Giovanni Mascellani
2025-05-13 11:30:41 +02:00
committed by Henri Verbeet
parent f4f2617584
commit 2e3f99e61e
Notes: Henri Verbeet 2025-06-10 18:06:02 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1546
2 changed files with 66 additions and 62 deletions

View File

@@ -2225,24 +2225,6 @@ static const char *sm6_parser_get_global_symbol_name(const struct sm6_parser *sm
return NULL; return NULL;
} }
static unsigned int register_get_uint_value(const struct vkd3d_shader_register *reg)
{
if (!register_is_constant(reg) || (!data_type_is_integer(reg->data_type) && !data_type_is_bool(reg->data_type)))
return UINT_MAX;
if (reg->dimension == VSIR_DIMENSION_VEC4)
WARN("Returning vec4.x.\n");
if (reg->type == VKD3DSPR_IMMCONST64)
{
if (reg->u.immconst_u64[0] > UINT_MAX)
FIXME("Truncating 64-bit value.\n");
return reg->u.immconst_u64[0];
}
return reg->u.immconst_u32[0];
}
static uint64_t register_get_uint64_value(const struct vkd3d_shader_register *reg) static uint64_t register_get_uint64_value(const struct vkd3d_shader_register *reg)
{ {
if (!register_is_constant(reg) || !data_type_is_integer(reg->data_type)) if (!register_is_constant(reg) || !data_type_is_integer(reg->data_type))
@@ -2351,11 +2333,32 @@ static bool sm6_value_is_numeric_array(const struct sm6_value *value)
} }
} }
static inline unsigned int sm6_value_get_constant_uint(const struct sm6_value *value) static unsigned int sm6_value_get_constant_uint(const struct sm6_value *value, struct sm6_parser *sm6)
{ {
if (!sm6_value_is_constant(value)) if (!sm6_value_is_constant(value))
{
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_CONSTANT,
"Invalid non-constant value.");
return UINT_MAX; return UINT_MAX;
return register_get_uint_value(&value->reg); }
if (value->type->class != TYPE_CLASS_INTEGER)
{
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_CONSTANT,
"Invalid non-integer constant value.");
return UINT_MAX;
}
if (value->type->u.width == 64)
{
uint64_t val = value->u.constant.immconst.immconst_u64[0];
if (val > UINT_MAX)
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_CONSTANT,
"Invalid 64-bit constant %"PRIu64" will be truncated do %u.", val, (unsigned int)val);
return val;
}
return value->u.constant.immconst.immconst_u32[0];
} }
static uint64_t sm6_value_get_constant_uint64(const struct sm6_value *value) static uint64_t sm6_value_get_constant_uint64(const struct sm6_value *value)
@@ -2620,7 +2623,7 @@ static void register_index_address_init(struct vkd3d_shader_register_index *idx,
{ {
if (address && sm6_value_is_constant(address)) if (address && sm6_value_is_constant(address))
{ {
idx->offset = sm6_value_get_constant_uint(address); idx->offset = sm6_value_get_constant_uint(address, sm6);
idx->rel_addr = NULL; idx->rel_addr = NULL;
} }
else if (!address || sm6_value_is_undef(address)) else if (!address || sm6_value_is_undef(address))
@@ -3270,7 +3273,7 @@ static enum vkd3d_result sm6_parser_init_constexpr_gep(struct sm6_parser *sm6, c
"Explicit pointee type for constexpr GEP does not match the element type."); "Explicit pointee type for constexpr GEP does not match the element type.");
} }
offset = sm6_value_get_constant_uint(operands[2]); offset = sm6_value_get_constant_uint(operands[2], sm6);
if (!(gep_type = sm6_type_get_element_type_at_index(pointee_type, offset))) if (!(gep_type = sm6_type_get_element_type_at_index(pointee_type, offset)))
{ {
WARN("Failed to get element type.\n"); WARN("Failed to get element type.\n");
@@ -4213,7 +4216,7 @@ static void sm6_parser_emit_alloca(struct sm6_parser *sm6, const struct dxil_rec
if (!(size = sm6_parser_get_value_safe(sm6, record->operands[2]))) if (!(size = sm6_parser_get_value_safe(sm6, record->operands[2])))
return; return;
/* A size of 1 means one instance of type[0], i.e. one array. */ /* A size of 1 means one instance of type[0], i.e. one array. */
if (sm6_value_get_constant_uint(size) != 1) if (sm6_value_get_constant_uint(size, sm6) != 1)
{ {
FIXME("Allocation size is not 1.\n"); FIXME("Allocation size is not 1.\n");
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
@@ -4838,7 +4841,7 @@ static void sm6_parser_emit_dx_binary(struct sm6_parser *sm6, enum dx_intrinsic_
static enum vkd3d_shader_opcode map_dx_atomic_binop(const struct sm6_value *operand, struct sm6_parser *sm6) static enum vkd3d_shader_opcode map_dx_atomic_binop(const struct sm6_value *operand, struct sm6_parser *sm6)
{ {
uint64_t code = sm6_value_get_constant_uint(operand); uint64_t code = sm6_value_get_constant_uint(operand, sm6);
switch (code) switch (code)
{ {
@@ -4942,7 +4945,7 @@ static void sm6_parser_emit_dx_barrier(struct sm6_parser *sm6, enum dx_intrinsic
enum dxil_sync_flags flags; enum dxil_sync_flags flags;
vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_SYNC); vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_SYNC);
flags = sm6_value_get_constant_uint(operands[0]); flags = sm6_value_get_constant_uint(operands[0], sm6);
ins->flags = flags & (SYNC_THREAD_GROUP | SYNC_THREAD_GROUP_UAV); ins->flags = flags & (SYNC_THREAD_GROUP | SYNC_THREAD_GROUP_UAV);
if (flags & SYNC_GLOBAL_UAV) if (flags & SYNC_GLOBAL_UAV)
ins->flags |= VKD3DSSF_GLOBAL_UAV; ins->flags |= VKD3DSSF_GLOBAL_UAV;
@@ -4976,7 +4979,7 @@ static void sm6_parser_emit_dx_buffer_update_counter(struct sm6_parser *sm6, enu
"A dynamic update value for a UAV counter operation is not supported."); "A dynamic update value for a UAV counter operation is not supported.");
return; return;
} }
i = sm6_value_get_constant_uint(operands[1]); i = sm6_value_get_constant_uint(operands[1], sm6);
if (i != 1 && i != 255) if (i != 1 && i != 255)
{ {
WARN("Unexpected update value %#x.\n", i); WARN("Unexpected update value %#x.\n", i);
@@ -5013,7 +5016,7 @@ static void sm6_parser_emit_dx_calculate_lod(struct sm6_parser *sm6, enum dx_int
if (!sm6_parser_emit_coordinate_construct(sm6, &operands[2], 3, NULL, state, &coord)) if (!sm6_parser_emit_coordinate_construct(sm6, &operands[2], 3, NULL, state, &coord))
return; return;
clamp = sm6_value_get_constant_uint(operands[5]); clamp = sm6_value_get_constant_uint(operands[5], sm6);
ins = state->ins; ins = state->ins;
vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_LOD); vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_LOD);
@@ -5114,7 +5117,7 @@ static const struct sm6_descriptor_info *sm6_parser_get_descriptor(struct sm6_pa
if (!sm6_value_is_constant(address)) if (!sm6_value_is_constant(address))
return d; return d;
register_index = sm6_value_get_constant_uint(address); register_index = sm6_value_get_constant_uint(address, sm6);
if (register_index >= d->range.first && register_index <= d->range.last) if (register_index >= d->range.first && register_index <= d->range.last)
return d; return d;
} }
@@ -5131,8 +5134,8 @@ static void sm6_parser_emit_dx_create_handle(struct sm6_parser *sm6, enum dx_int
struct sm6_value *dst; struct sm6_value *dst;
unsigned int id; unsigned int id;
type = sm6_value_get_constant_uint(operands[0]); type = sm6_value_get_constant_uint(operands[0], sm6);
id = sm6_value_get_constant_uint(operands[1]); id = sm6_value_get_constant_uint(operands[1], sm6);
if (!(d = sm6_parser_get_descriptor(sm6, type, id, operands[2]))) if (!(d = sm6_parser_get_descriptor(sm6, type, id, operands[2])))
{ {
WARN("Failed to find resource type %#x, id %#x.\n", type, id); WARN("Failed to find resource type %#x, id %#x.\n", type, id);
@@ -5145,7 +5148,7 @@ static void sm6_parser_emit_dx_create_handle(struct sm6_parser *sm6, enum dx_int
dst->value_type = VALUE_TYPE_HANDLE; dst->value_type = VALUE_TYPE_HANDLE;
dst->u.handle.d = d; dst->u.handle.d = d;
dst->u.handle.index = operands[2]; dst->u.handle.index = operands[2];
dst->u.handle.non_uniform = !!sm6_value_get_constant_uint(operands[3]); dst->u.handle.non_uniform = !!sm6_value_get_constant_uint(operands[3], sm6);
/* NOP is used to flag no instruction emitted. */ /* NOP is used to flag no instruction emitted. */
ins->opcode = VKD3DSIH_NOP; ins->opcode = VKD3DSIH_NOP;
@@ -5163,7 +5166,7 @@ static void sm6_parser_emit_dx_stream(struct sm6_parser *sm6, enum dx_intrinsic_
if (!(src_param = instruction_src_params_alloc(ins, 1, sm6))) if (!(src_param = instruction_src_params_alloc(ins, 1, sm6)))
return; return;
i = sm6_value_get_constant_uint(operands[0]); i = sm6_value_get_constant_uint(operands[0], sm6);
if (i >= MAX_GS_OUTPUT_STREAMS) if (i >= MAX_GS_OUTPUT_STREAMS)
{ {
WARN("Invalid stream index %u.\n", i); WARN("Invalid stream index %u.\n", i);
@@ -5204,7 +5207,7 @@ static void sm6_parser_emit_dx_domain_location(struct sm6_parser *sm6, enum dx_i
vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_MOV); vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_MOV);
if ((component_idx = sm6_value_get_constant_uint(operands[0])) >= 3) if ((component_idx = sm6_value_get_constant_uint(operands[0], sm6)) >= 3)
{ {
WARN("Invalid component index %u.\n", component_idx); WARN("Invalid component index %u.\n", component_idx);
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
@@ -5273,8 +5276,8 @@ static void sm6_parser_emit_dx_eval_attrib(struct sm6_parser *sm6, enum dx_intri
unsigned int row_index, column_index; unsigned int row_index, column_index;
const struct signature_element *e; const struct signature_element *e;
row_index = sm6_value_get_constant_uint(operands[0]); row_index = sm6_value_get_constant_uint(operands[0], sm6);
column_index = sm6_value_get_constant_uint(operands[2]); column_index = sm6_value_get_constant_uint(operands[2], sm6);
signature = &sm6->p.program->input_signature; signature = &sm6->p.program->input_signature;
if (row_index >= signature->element_count) if (row_index >= signature->element_count)
@@ -5361,7 +5364,7 @@ static void sm6_parser_emit_dx_compute_builtin(struct sm6_parser *sm6, enum dx_i
if (component_count > 1) if (component_count > 1)
{ {
src_param->reg.dimension = VSIR_DIMENSION_VEC4; src_param->reg.dimension = VSIR_DIMENSION_VEC4;
component_idx = sm6_value_get_constant_uint(operands[0]); component_idx = sm6_value_get_constant_uint(operands[0], sm6);
} }
src_param_init_scalar(src_param, component_idx); src_param_init_scalar(src_param, component_idx);
@@ -5516,8 +5519,8 @@ static void sm6_parser_emit_dx_load_input(struct sm6_parser *sm6, enum dx_intrin
const struct shader_signature *signature; const struct shader_signature *signature;
const struct signature_element *e; const struct signature_element *e;
row_index = sm6_value_get_constant_uint(operands[0]); row_index = sm6_value_get_constant_uint(operands[0], sm6);
column_index = sm6_value_get_constant_uint(operands[2]); column_index = sm6_value_get_constant_uint(operands[2], sm6);
if (is_control_point && operands[3]->value_type == VALUE_TYPE_UNDEFINED) if (is_control_point && operands[3]->value_type == VALUE_TYPE_UNDEFINED)
{ {
@@ -5626,7 +5629,7 @@ static void sm6_parser_emit_dx_quad_op(struct sm6_parser *sm6, enum dx_intrinsic
enum vkd3d_shader_opcode opcode; enum vkd3d_shader_opcode opcode;
enum dxil_quad_op_kind quad_op; enum dxil_quad_op_kind quad_op;
quad_op = sm6_value_get_constant_uint(operands[1]); quad_op = sm6_value_get_constant_uint(operands[1], sm6);
if ((opcode = dx_map_quad_op(quad_op)) == VKD3DSIH_INVALID) if ((opcode = dx_map_quad_op(quad_op)) == VKD3DSIH_INVALID)
{ {
FIXME("Unhandled quad op kind %u.\n", quad_op); FIXME("Unhandled quad op kind %u.\n", quad_op);
@@ -5660,7 +5663,7 @@ static void sm6_parser_emit_dx_raw_buffer_load(struct sm6_parser *sm6, enum dx_i
if (op == DX_RAW_BUFFER_LOAD) if (op == DX_RAW_BUFFER_LOAD)
{ {
write_mask = sm6_value_get_constant_uint(operands[3]); write_mask = sm6_value_get_constant_uint(operands[3], sm6);
if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL) if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL)
{ {
WARN("Invalid write mask %#x.\n", write_mask); WARN("Invalid write mask %#x.\n", write_mask);
@@ -5703,7 +5706,7 @@ static void sm6_parser_emit_dx_raw_buffer_store(struct sm6_parser *sm6, enum dx_
return; return;
raw = resource->u.handle.d->kind == RESOURCE_KIND_RAWBUFFER; raw = resource->u.handle.d->kind == RESOURCE_KIND_RAWBUFFER;
write_mask = sm6_value_get_constant_uint(operands[7]); write_mask = sm6_value_get_constant_uint(operands[7], sm6);
if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL) if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL)
{ {
WARN("Invalid write mask %#x.\n", write_mask); WARN("Invalid write mask %#x.\n", write_mask);
@@ -5729,7 +5732,7 @@ static void sm6_parser_emit_dx_raw_buffer_store(struct sm6_parser *sm6, enum dx_
"Resource for a raw buffer store is not a raw or structured buffer."); "Resource for a raw buffer store is not a raw or structured buffer.");
} }
alignment = sm6_value_get_constant_uint(operands[8]); alignment = sm6_value_get_constant_uint(operands[8], sm6);
if (alignment & (alignment - 1)) if (alignment & (alignment - 1))
{ {
FIXME("Invalid alignment %#x.\n", alignment); FIXME("Invalid alignment %#x.\n", alignment);
@@ -5826,7 +5829,7 @@ static void sm6_parser_emit_dx_buffer_store(struct sm6_parser *sm6, enum dx_intr
"Resource for a typed buffer store is not a typed buffer."); "Resource for a typed buffer store is not a typed buffer.");
} }
write_mask = sm6_value_get_constant_uint(operands[7]); write_mask = sm6_value_get_constant_uint(operands[7], sm6);
if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL) if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL)
{ {
WARN("Invalid write mask %#x.\n", write_mask); WARN("Invalid write mask %#x.\n", write_mask);
@@ -5919,17 +5922,17 @@ static void sm6_parser_emit_dx_get_sample_pos(struct sm6_parser *sm6, enum dx_in
instruction_dst_param_init_ssa_vector(ins, 2, sm6); instruction_dst_param_init_ssa_vector(ins, 2, sm6);
} }
static unsigned int sm6_value_get_texel_offset(const struct sm6_value *value) static unsigned int sm6_value_get_texel_offset(const struct sm6_value *value, struct sm6_parser *sm6)
{ {
return sm6_value_is_undef(value) ? 0 : sm6_value_get_constant_uint(value); return sm6_value_is_undef(value) ? 0 : sm6_value_get_constant_uint(value, sm6);
} }
static void instruction_set_texel_offset(struct vkd3d_shader_instruction *ins, static void instruction_set_texel_offset(struct vkd3d_shader_instruction *ins,
const struct sm6_value **operands, struct sm6_parser *sm6) const struct sm6_value **operands, struct sm6_parser *sm6)
{ {
ins->texel_offset.u = sm6_value_get_texel_offset(operands[0]); ins->texel_offset.u = sm6_value_get_texel_offset(operands[0], sm6);
ins->texel_offset.v = sm6_value_get_texel_offset(operands[1]); ins->texel_offset.v = sm6_value_get_texel_offset(operands[1], sm6);
ins->texel_offset.w = sm6_value_get_texel_offset(operands[2]); ins->texel_offset.w = sm6_value_get_texel_offset(operands[2], sm6);
} }
static void sm6_parser_emit_dx_sample(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, static void sm6_parser_emit_dx_sample(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
@@ -6110,8 +6113,8 @@ static void sm6_parser_emit_dx_store_output(struct sm6_parser *sm6, enum dx_intr
const struct signature_element *e; const struct signature_element *e;
const struct sm6_value *value; const struct sm6_value *value;
row_index = sm6_value_get_constant_uint(operands[0]); row_index = sm6_value_get_constant_uint(operands[0], sm6);
column_index = sm6_value_get_constant_uint(operands[2]); column_index = sm6_value_get_constant_uint(operands[2], sm6);
signature = is_patch_constant ? &program->patch_constant_signature : &program->output_signature; signature = is_patch_constant ? &program->patch_constant_signature : &program->output_signature;
if (row_index >= signature->element_count) if (row_index >= signature->element_count)
@@ -6211,7 +6214,7 @@ static void sm6_parser_emit_dx_texture_gather(struct sm6_parser *sm6, enum dx_in
src_param_init_vector_from_handle(sm6, &src_params[1 + extended_offset], &resource->u.handle); src_param_init_vector_from_handle(sm6, &src_params[1 + extended_offset], &resource->u.handle);
src_param_init_vector_from_handle(sm6, &src_params[2 + extended_offset], &sampler->u.handle); src_param_init_vector_from_handle(sm6, &src_params[2 + extended_offset], &sampler->u.handle);
/* Swizzle stored in the sampler parameter is the scalar component index to be gathered. */ /* Swizzle stored in the sampler parameter is the scalar component index to be gathered. */
swizzle = sm6_value_get_constant_uint(operands[8]); swizzle = sm6_value_get_constant_uint(operands[8], sm6);
if (swizzle >= VKD3D_VEC4_SIZE) if (swizzle >= VKD3D_VEC4_SIZE)
{ {
WARN("Invalid swizzle %#x.\n", swizzle); WARN("Invalid swizzle %#x.\n", swizzle);
@@ -6285,7 +6288,7 @@ static void sm6_parser_emit_dx_texture_store(struct sm6_parser *sm6, enum dx_int
if (!sm6_parser_emit_coordinate_construct(sm6, &operands[1], 3, NULL, state, &coord)) if (!sm6_parser_emit_coordinate_construct(sm6, &operands[1], 3, NULL, state, &coord))
return; return;
write_mask = sm6_value_get_constant_uint(operands[8]); write_mask = sm6_value_get_constant_uint(operands[8], sm6);
if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL) if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL)
{ {
WARN("Invalid write mask %#x.\n", write_mask); WARN("Invalid write mask %#x.\n", write_mask);
@@ -6359,7 +6362,7 @@ static void sm6_parser_emit_dx_wave_active_bit(struct sm6_parser *sm6, enum dx_i
enum dxil_wave_bit_op_kind wave_op; enum dxil_wave_bit_op_kind wave_op;
enum vkd3d_shader_opcode opcode; enum vkd3d_shader_opcode opcode;
wave_op = sm6_value_get_constant_uint(operands[1]); wave_op = sm6_value_get_constant_uint(operands[1], sm6);
if ((opcode = sm6_dx_map_wave_bit_op(wave_op, sm6)) == VKD3DSIH_INVALID) if ((opcode = sm6_dx_map_wave_bit_op(wave_op, sm6)) == VKD3DSIH_INVALID)
return; return;
@@ -6406,8 +6409,8 @@ static void sm6_parser_emit_dx_wave_op(struct sm6_parser *sm6, enum dx_intrinsic
enum dxil_wave_op_kind wave_op; enum dxil_wave_op_kind wave_op;
bool is_signed; bool is_signed;
wave_op = sm6_value_get_constant_uint(operands[1]); wave_op = sm6_value_get_constant_uint(operands[1], sm6);
is_signed = !sm6_value_get_constant_uint(operands[2]); is_signed = !sm6_value_get_constant_uint(operands[2], sm6);
opcode = sm6_dx_map_wave_op(wave_op, is_signed, sm6_type_is_floating_point(operands[0]->type), sm6); opcode = sm6_dx_map_wave_op(wave_op, is_signed, sm6_type_is_floating_point(operands[0]->type), sm6);
if (opcode == VKD3DSIH_INVALID) if (opcode == VKD3DSIH_INVALID)
@@ -6800,7 +6803,7 @@ static void sm6_parser_emit_call(struct sm6_parser *sm6, const struct dxil_recor
"Expected a constant integer dx intrinsic function id."); "Expected a constant integer dx intrinsic function id.");
return; return;
} }
sm6_parser_decode_dx_op(sm6, sm6_value_get_constant_uint(op_value), sm6_parser_decode_dx_op(sm6, sm6_value_get_constant_uint(op_value, sm6),
fn_value->u.function.name, &operands[1], operand_count - 1, state, dst); fn_value->u.function.name, &operands[1], operand_count - 1, state, dst);
} }
@@ -7306,7 +7309,7 @@ static void sm6_parser_emit_gep(struct sm6_parser *sm6, const struct dxil_record
return; return;
/* The first index is always zero, to form a simple pointer dereference. */ /* The first index is always zero, to form a simple pointer dereference. */
if (sm6_value_get_constant_uint(elem_value)) if (sm6_value_get_constant_uint(elem_value, sm6))
{ {
WARN("Expected constant zero.\n"); WARN("Expected constant zero.\n");
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
@@ -7326,7 +7329,7 @@ static void sm6_parser_emit_gep(struct sm6_parser *sm6, const struct dxil_record
return; return;
/* If indexing is dynamic, just get the type at offset zero. */ /* If indexing is dynamic, just get the type at offset zero. */
elem_idx = sm6_value_is_constant(elem_value) ? sm6_value_get_constant_uint(elem_value) : 0; elem_idx = sm6_value_is_constant(elem_value) ? sm6_value_get_constant_uint(elem_value, sm6) : 0;
type = sm6_type_get_element_type_at_index(pointee_type, elem_idx); type = sm6_type_get_element_type_at_index(pointee_type, elem_idx);
if (!type) if (!type)
{ {
@@ -7769,7 +7772,7 @@ static bool sm6_metadata_value_is_zero_or_undef(const struct sm6_metadata_value
&& (sm6_value_is_undef(m->u.value) || sm6_value_is_constant_zero(m->u.value)); && (sm6_value_is_undef(m->u.value) || sm6_value_is_constant_zero(m->u.value));
} }
static bool sm6_metadata_get_uint_value(const struct sm6_parser *sm6, static bool sm6_metadata_get_uint_value(struct sm6_parser *sm6,
const struct sm6_metadata_value *m, unsigned int *u) const struct sm6_metadata_value *m, unsigned int *u)
{ {
const struct sm6_value *value; const struct sm6_value *value;
@@ -7783,12 +7786,12 @@ static bool sm6_metadata_get_uint_value(const struct sm6_parser *sm6,
if (!sm6_type_is_integer(value->type)) if (!sm6_type_is_integer(value->type))
return false; return false;
*u = sm6_value_get_constant_uint(value); *u = sm6_value_get_constant_uint(value, sm6);
return true; return true;
} }
static bool sm6_metadata_get_uint64_value(const struct sm6_parser *sm6, static bool sm6_metadata_get_uint64_value(struct sm6_parser *sm6,
const struct sm6_metadata_value *m, uint64_t *u) const struct sm6_metadata_value *m, uint64_t *u)
{ {
const struct sm6_value *value; const struct sm6_value *value;
@@ -7802,7 +7805,7 @@ static bool sm6_metadata_get_uint64_value(const struct sm6_parser *sm6,
if (!sm6_type_is_integer(value->type)) if (!sm6_type_is_integer(value->type))
return false; return false;
*u = sm6_value_get_constant_uint(value); *u = sm6_value_get_constant_uint(value, sm6);
return true; return true;
} }

View File

@@ -223,6 +223,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_DXIL_INVALID_PROPERTIES = 8017, VKD3D_SHADER_ERROR_DXIL_INVALID_PROPERTIES = 8017,
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES = 8018, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES = 8018,
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCE_HANDLE = 8019, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCE_HANDLE = 8019,
VKD3D_SHADER_ERROR_DXIL_INVALID_CONSTANT = 8020,
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_MAGIC_NUMBER = 8300, VKD3D_SHADER_WARNING_DXIL_UNKNOWN_MAGIC_NUMBER = 8300,
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_SHADER_TYPE = 8301, VKD3D_SHADER_WARNING_DXIL_UNKNOWN_SHADER_TYPE = 8301,