This MR replaces `vkd3d_shader_register.immconst_type` with `vkd3d_shader_register.dimension` which is intended for all register types and not just immconsts.
This dimension is parsed in tpf.c, and initialized according to the register type in d3dbc.c.
Having this field in vkd3d_shader_register allows us to avoid hardcoding special cases for the register dimensions when writing sm4 bytecode (e.g. for the sampler src register in gather instructions). Also, it allows for some fixes to d3d_asm.c, which are introduced in part 2 (https://gitlab.winehq.org/fcasas/vkd3d/-/commits/add_vkd3d_reg_dim).
From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/d3d_asm.c | 16 ++++++++-------- libs/vkd3d-shader/d3dbc.c | 12 ++++++------ libs/vkd3d-shader/dxil.c | 2 +- libs/vkd3d-shader/ir.c | 6 +++--- libs/vkd3d-shader/spirv.c | 4 ++-- libs/vkd3d-shader/tpf.c | 4 ++-- libs/vkd3d-shader/vkd3d_shader_private.h | 9 +++++---- 7 files changed, 27 insertions(+), 26 deletions(-)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index d72402eb..38ded510 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -1074,9 +1074,9 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const if (reg->type == VKD3DSPR_IMMCONST) { shader_addline(buffer, "%s(", compiler->colours.reset); - switch (reg->immconst_type) + switch (reg->dimension) { - case VKD3D_IMMCONST_SCALAR: + case VKD3D_SHADER_DIMENSION_SCALAR: switch (reg->data_type) { case VKD3D_DATA_FLOAT: @@ -1096,7 +1096,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const } break;
- case VKD3D_IMMCONST_VEC4: + case VKD3D_SHADER_DIMENSION_VEC4: switch (reg->data_type) { case VKD3D_DATA_FLOAT: @@ -1126,7 +1126,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const break;
default: - shader_addline(buffer, "<unhandled immconst_type %#x>", reg->immconst_type); + shader_addline(buffer, "<unhandled immconst dimension %#x>", reg->dimension); break; } shader_addline(buffer, ")"); @@ -1134,13 +1134,13 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const else if (reg->type == VKD3DSPR_IMMCONST64) { shader_addline(buffer, "%s(", compiler->colours.reset); - /* A double2 vector is treated as a float4 vector in enum vkd3d_immconst_type. */ - if (reg->immconst_type == VKD3D_IMMCONST_SCALAR || reg->immconst_type == VKD3D_IMMCONST_VEC4) + /* A double2 vector is treated as a float4 vector in enum vkd3d_shader_dimension. */ + if (reg->dimension == VKD3D_SHADER_DIMENSION_SCALAR || reg->dimension == VKD3D_SHADER_DIMENSION_VEC4) { if (reg->data_type == VKD3D_DATA_DOUBLE) { shader_print_double_literal(compiler, "", reg->u.immconst_double[0], ""); - if (reg->immconst_type == VKD3D_IMMCONST_VEC4) + if (reg->dimension == VKD3D_SHADER_DIMENSION_VEC4) shader_print_double_literal(compiler, ", ", reg->u.immconst_double[1], ""); } else @@ -1150,7 +1150,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const } else { - shader_addline(buffer, "<unhandled immconst_type %#x>", reg->immconst_type); + shader_addline(buffer, "<unhandled immconst64 dimension %#x>", reg->dimension); } shader_addline(buffer, ")"); } diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c index 99a5bd7a..cf7f0e15 100644 --- a/libs/vkd3d-shader/d3dbc.c +++ b/libs/vkd3d-shader/d3dbc.c @@ -951,9 +951,9 @@ static void shader_sm1_read_semantic(struct vkd3d_shader_sm1_parser *sm1, }
static void shader_sm1_read_immconst(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, - struct vkd3d_shader_src_param *src_param, enum vkd3d_immconst_type type, enum vkd3d_data_type data_type) + struct vkd3d_shader_src_param *src_param, enum vkd3d_shader_dimension dimension, enum vkd3d_data_type data_type) { - unsigned int count = type == VKD3D_IMMCONST_VEC4 ? 4 : 1; + unsigned int count = dimension == VKD3D_SHADER_DIMENSION_VEC4 ? 4 : 1;
if (*ptr >= sm1->end || sm1->end - *ptr < count) { @@ -975,7 +975,7 @@ static void shader_sm1_read_immconst(struct vkd3d_shader_sm1_parser *sm1, const src_param->reg.idx[2].offset = ~0u; src_param->reg.idx[2].rel_addr = NULL; src_param->reg.idx_count = 0; - src_param->reg.immconst_type = type; + src_param->reg.dimension = dimension; memcpy(src_param->reg.u.immconst_uint, *ptr, count * sizeof(uint32_t)); src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE; src_param->modifiers = 0; @@ -1132,19 +1132,19 @@ static void shader_sm1_read_instruction(struct vkd3d_shader_sm1_parser *sm1, str else if (ins->handler_idx == VKD3DSIH_DEF) { shader_sm1_read_dst_param(sm1, &p, dst_param); - shader_sm1_read_immconst(sm1, &p, &src_params[0], VKD3D_IMMCONST_VEC4, VKD3D_DATA_FLOAT); + shader_sm1_read_immconst(sm1, &p, &src_params[0], VKD3D_SHADER_DIMENSION_VEC4, VKD3D_DATA_FLOAT); shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true); } else if (ins->handler_idx == VKD3DSIH_DEFB) { shader_sm1_read_dst_param(sm1, &p, dst_param); - shader_sm1_read_immconst(sm1, &p, &src_params[0], VKD3D_IMMCONST_SCALAR, VKD3D_DATA_UINT); + shader_sm1_read_immconst(sm1, &p, &src_params[0], VKD3D_SHADER_DIMENSION_SCALAR, VKD3D_DATA_UINT); shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true); } else if (ins->handler_idx == VKD3DSIH_DEFI) { shader_sm1_read_dst_param(sm1, &p, dst_param); - shader_sm1_read_immconst(sm1, &p, &src_params[0], VKD3D_IMMCONST_VEC4, VKD3D_DATA_INT); + shader_sm1_read_immconst(sm1, &p, &src_params[0], VKD3D_SHADER_DIMENSION_VEC4, VKD3D_DATA_INT); shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true); } else diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index f9efe47f..c92a0886 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -1675,7 +1675,7 @@ static enum vkd3d_result sm6_parser_constants_init(struct sm6_parser *sm6, const dst->type = type; dst->value_type = VALUE_TYPE_REG; dst->u.reg.type = reg_type; - dst->u.reg.immconst_type = VKD3D_IMMCONST_SCALAR; + dst->u.reg.dimension = VKD3D_SHADER_DIMENSION_SCALAR; dst->u.reg.data_type = reg_data_type;
switch (record->code) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 705905f7..07bb0e82 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -74,7 +74,7 @@ static void shader_instruction_eliminate_phase_instance_id(struct vkd3d_shader_i reg->idx[2].offset = ~0u; reg->idx[2].rel_addr = NULL; reg->idx_count = 0; - reg->immconst_type = VKD3D_IMMCONST_SCALAR; + reg->dimension = VKD3D_SHADER_DIMENSION_SCALAR; reg->u.immconst_uint[0] = instance_id; continue; } @@ -310,7 +310,7 @@ static void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_s reg->idx[2].offset = ~0u; reg->idx[2].rel_addr = NULL; reg->idx_count = idx_count; - reg->immconst_type = VKD3D_IMMCONST_SCALAR; + reg->dimension = VKD3D_SHADER_DIMENSION_SCALAR; }
void shader_instruction_init(struct vkd3d_shader_instruction *ins, enum vkd3d_shader_opcode handler_idx) @@ -1207,7 +1207,7 @@ static void shader_register_normalise_flat_constants(struct vkd3d_shader_src_par { param->reg.type = VKD3DSPR_IMMCONST; param->reg.idx_count = 0; - param->reg.immconst_type = VKD3D_IMMCONST_VEC4; + param->reg.dimension = VKD3D_SHADER_DIMENSION_VEC4; for (j = 0; j < 4; ++j) param->reg.u.immconst_uint[j] = normaliser->defs[i].value[j]; return; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index fa605f18..ed9303e0 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -3548,7 +3548,7 @@ static uint32_t spirv_compiler_emit_load_constant(struct spirv_compiler *compile
assert(reg->type == VKD3DSPR_IMMCONST);
- if (reg->immconst_type == VKD3D_IMMCONST_SCALAR) + if (reg->dimension == VKD3D_SHADER_DIMENSION_SCALAR) { for (i = 0; i < component_count; ++i) values[i] = *reg->u.immconst_uint; @@ -3575,7 +3575,7 @@ static uint32_t spirv_compiler_emit_load_constant64(struct spirv_compiler *compi
assert(reg->type == VKD3DSPR_IMMCONST64);
- if (reg->immconst_type == VKD3D_IMMCONST_SCALAR) + if (reg->dimension == VKD3D_SHADER_DIMENSION_SCALAR) { for (i = 0; i < component_count; ++i) values[i] = *reg->u.immconst_uint64; diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 550f9b27..fd946f89 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -1858,7 +1858,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui switch (dimension) { case VKD3D_SM4_DIMENSION_SCALAR: - param->immconst_type = VKD3D_IMMCONST_SCALAR; + param->dimension = VKD3D_SHADER_DIMENSION_SCALAR; dword_count = 1 + (register_type == VKD3D_SM4_RT_IMMCONST64); if (end - *ptr < dword_count) { @@ -1870,7 +1870,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui break;
case VKD3D_SM4_DIMENSION_VEC4: - param->immconst_type = VKD3D_IMMCONST_VEC4; + param->dimension = VKD3D_SHADER_DIMENSION_VEC4; if (end - *ptr < VKD3D_VEC4_SIZE) { WARN("Invalid ptr %p, end %p.\n", *ptr, end); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index c719085e..0d9d16b7 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -548,10 +548,11 @@ enum vkd3d_data_type VKD3D_DATA_UINT8, };
-enum vkd3d_immconst_type +enum vkd3d_shader_dimension { - VKD3D_IMMCONST_SCALAR, - VKD3D_IMMCONST_VEC4, + VKD3D_SHADER_DIMENSION_NONE, + VKD3D_SHADER_DIMENSION_SCALAR, + VKD3D_SHADER_DIMENSION_VEC4, };
enum vkd3d_shader_src_modifier @@ -715,7 +716,7 @@ struct vkd3d_shader_register enum vkd3d_data_type data_type; struct vkd3d_shader_register_index idx[3]; unsigned int idx_count; - enum vkd3d_immconst_type immconst_type; + enum vkd3d_shader_dimension dimension; union { DWORD immconst_uint[VKD3D_VEC4_SIZE];
From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/tpf.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index fd946f89..d75336e7 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -1703,6 +1703,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui enum vkd3d_sm4_register_type register_type; enum vkd3d_sm4_extended_operand_type type; enum vkd3d_sm4_register_modifier m; + enum vkd3d_sm4_dimension dimension; uint32_t token, order, extended;
if (*ptr >= end) @@ -1850,9 +1851,9 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui
param->idx_count = order;
+ dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT; if (register_type == VKD3D_SM4_RT_IMMCONST || register_type == VKD3D_SM4_RT_IMMCONST64) { - enum vkd3d_sm4_dimension dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT; unsigned int dword_count;
switch (dimension) @@ -1885,7 +1886,29 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui break; } } - else if (!shader_is_sm_5_1(priv) && sm4_register_is_descriptor(register_type)) + else + { + switch (dimension) + { + case VKD3D_SM4_DIMENSION_NONE: + param->dimension = VKD3D_SHADER_DIMENSION_NONE; + break; + + case VKD3D_SM4_DIMENSION_SCALAR: + param->dimension = VKD3D_SHADER_DIMENSION_SCALAR; + break; + + case VKD3D_SM4_DIMENSION_VEC4: + param->dimension = VKD3D_SHADER_DIMENSION_VEC4; + break; + + default: + FIXME("Unknown dimension %#x.\n", dimension); + break; + } + } + + if (!shader_is_sm_5_1(priv) && sm4_register_is_descriptor(register_type)) { /* SM5.1 places a symbol identifier in idx[0] and moves * other values up one slot. Normalize to SM5.1. */
From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/d3dbc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c index cf7f0e15..dd6061dd 100644 --- a/libs/vkd3d-shader/d3dbc.c +++ b/libs/vkd3d-shader/d3dbc.c @@ -469,6 +469,12 @@ static void shader_sm1_parse_src_param(uint32_t param, const struct vkd3d_shader src->reg.idx[2].offset = ~0u; src->reg.idx[2].rel_addr = NULL; src->reg.idx_count = 1; + if (src->reg.type == VKD3DSPR_SAMPLER) + src->reg.dimension = VKD3D_SHADER_DIMENSION_NONE; + else if (src->reg.type == VKD3DSPR_DEPTHOUT) + src->reg.dimension = VKD3D_SHADER_DIMENSION_SCALAR; + else + src->reg.dimension = VKD3D_SHADER_DIMENSION_VEC4; src->swizzle = swizzle_from_sm1((param & VKD3D_SM1_SWIZZLE_MASK) >> VKD3D_SM1_SWIZZLE_SHIFT); src->modifiers = (param & VKD3D_SM1_SRC_MODIFIER_MASK) >> VKD3D_SM1_SRC_MODIFIER_SHIFT; } @@ -488,6 +494,12 @@ static void shader_sm1_parse_dst_param(uint32_t param, const struct vkd3d_shader dst->reg.idx[2].offset = ~0u; dst->reg.idx[2].rel_addr = NULL; dst->reg.idx_count = 1; + if (dst->reg.type == VKD3DSPR_SAMPLER) + dst->reg.dimension = VKD3D_SHADER_DIMENSION_NONE; + else if (dst->reg.type == VKD3DSPR_DEPTHOUT) + dst->reg.dimension = VKD3D_SHADER_DIMENSION_SCALAR; + else + dst->reg.dimension = VKD3D_SHADER_DIMENSION_VEC4; dst->write_mask = (param & VKD3D_SM1_WRITEMASK_MASK) >> VKD3D_SM1_WRITEMASK_SHIFT; dst->modifiers = (param & VKD3D_SM1_DST_MODIFIER_MASK) >> VKD3D_SM1_DST_MODIFIER_SHIFT; dst->shift = (param & VKD3D_SM1_DSTSHIFT_MASK) >> VKD3D_SM1_DSTSHIFT_SHIFT;
From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/ir.c | 2 +- libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 07bb0e82..899e027a 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -296,7 +296,7 @@ static enum vkd3d_result flattener_flatten_phases(struct hull_flattener *normali return VKD3D_OK; }
-static void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, +void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, enum vkd3d_data_type data_type, unsigned int idx_count) { reg->type = reg_type; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 0d9d16b7..d34a3bd3 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -992,6 +992,8 @@ struct vkd3d_shader_instruction };
void shader_instruction_init(struct vkd3d_shader_instruction *ins, enum vkd3d_shader_opcode handler_idx); +void shader_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, + enum vkd3d_data_type data_type, unsigned int idx_count);
static inline bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_shader_instruction *ins) {
From: Francisco Casas fcasas@codeweavers.com
Since spirv.c only consumes vkd3d-shader IR, and doesn't output it, in most cases we don't care about the register's dimension or data_type, so I am just preserving the current initialization scheme for both fields. --- libs/vkd3d-shader/ir.c | 3 +-- libs/vkd3d-shader/spirv.c | 50 ++++++++++++--------------------------- 2 files changed, 16 insertions(+), 37 deletions(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 899e027a..9620e077 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1214,11 +1214,10 @@ static void shader_register_normalise_flat_constants(struct vkd3d_shader_src_par } }
- param->reg.type = VKD3DSPR_CONSTBUFFER; + shader_register_init(¶m->reg, VKD3DSPR_CONSTBUFFER, 0, 3); param->reg.idx[0].offset = set; /* register ID */ param->reg.idx[1].offset = set; /* register index */ param->reg.idx[2].offset = index; /* buffer index */ - param->reg.idx_count = 3; }
static enum vkd3d_result instruction_array_normalise_flat_constants(struct vkd3d_shader_parser *parser) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index ed9303e0..a96bf051 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4333,11 +4333,7 @@ static uint32_t spirv_compiler_get_invocation_id(struct spirv_compiler *compiler
assert(compiler->shader_type == VKD3D_SHADER_TYPE_HULL);
- memset(&r, 0, sizeof(r)); - r.type = VKD3DSPR_OUTPOINTID; - r.idx[0].offset = ~0u; - r.idx[1].offset = ~0u; - r.idx_count = 0; + shader_register_init(&r, VKD3DSPR_OUTPOINTID, 0, 0); return spirv_compiler_get_register_id(compiler, &r); }
@@ -5237,10 +5233,7 @@ static void spirv_compiler_emit_hull_shader_builtins(struct spirv_compiler *comp struct vkd3d_shader_dst_param dst;
memset(&dst, 0, sizeof(dst)); - dst.reg.type = VKD3DSPR_OUTPOINTID; - dst.reg.idx[0].offset = ~0u; - dst.reg.idx[1].offset = ~0u; - dst.reg.idx_count = 0; + shader_register_init(&dst.reg, VKD3DSPR_OUTPOINTID, 0, 0); dst.write_mask = VKD3DSP_WRITEMASK_0; spirv_compiler_emit_input_register(compiler, &dst); } @@ -5363,11 +5356,8 @@ static void spirv_compiler_emit_dcl_indexable_temp(struct spirv_compiler *compil if (temp->component_count != 4) FIXME("Unhandled component count %u.\n", temp->component_count);
- memset(®, 0, sizeof(reg)); - reg.type = VKD3DSPR_IDXTEMP; + shader_register_init(®, VKD3DSPR_IDXTEMP, 0, 1); reg.idx[0].offset = temp->register_idx; - reg.idx[1].offset = ~0u; - reg.idx_count = 1;
function_location = spirv_compiler_get_current_function_location(compiler); vkd3d_spirv_begin_function_stream_insertion(builder, function_location); @@ -5620,8 +5610,7 @@ static void spirv_compiler_emit_dcl_immediate_constant_buffer(struct spirv_compi vkd3d_spirv_build_op_name(builder, icb_id, "icb"); vkd3d_free(elements);
- memset(®, 0, sizeof(reg)); - reg.type = VKD3DSPR_IMMCONSTBUFFER; + shader_register_init(®, VKD3DSPR_IMMCONSTBUFFER, 0, 0); vkd3d_symbol_make_register(®_symbol, ®); vkd3d_symbol_set_register_info(®_symbol, icb_id, SpvStorageClassPrivate, VKD3D_SHADER_COMPONENT_FLOAT, VKD3DSP_WRITEMASK_ALL); @@ -6375,20 +6364,13 @@ static void spirv_compiler_emit_default_control_point_phase(struct spirv_compile invocation_id = spirv_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.reg.idx_count = 0; + shader_register_init(&invocation.reg, VKD3DSPR_OUTPOINTID, VKD3D_DATA_INT, 0); 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; + shader_register_init(&input_reg, VKD3DSPR_INPUT, VKD3D_DATA_FLOAT, 2); + input_reg.idx[0].offset = 0; input_reg.idx[0].rel_addr = &invocation; - input_reg.idx[2].offset = ~0u; - input_reg.idx_count = 2; + input_reg.idx[1].offset = 0; input_id = spirv_compiler_get_register_id(compiler, &input_reg);
assert(input_signature->element_count == output_signature->element_count); @@ -9509,15 +9491,13 @@ static void spirv_compiler_emit_sm1_constant_buffer(struct spirv_compiler *compi { struct vkd3d_shader_register_range range = {.space = 0, .first = set, .last = set}; uint32_t count = desc->flat_constant_count[set].external; - struct vkd3d_shader_register reg = - { - .type = VKD3DSPR_CONSTBUFFER, - .idx[0].offset = set, /* register ID */ - .idx[1].offset = set, /* register index */ - .idx[2].offset = count, /* size */ - .idx_count = 3, - .data_type = data_type, - }; + struct vkd3d_shader_register reg; + + + shader_register_init(®, VKD3DSPR_CONSTBUFFER, data_type, 3); + reg.idx[0].offset = set; /* register ID */ + reg.idx[1].offset = set; /* register index */ + reg.idx[2].offset = count; /* size */
if (count) spirv_compiler_emit_constant_buffer(compiler, count, &range, ®);