vkd3d-shader/d3dbc: Introduce d3dbc_parse_register().

This commit is contained in:
Elizabeth Figura
2024-07-20 13:15:07 -05:00
committed by Henri Verbeet
parent 3c53293028
commit d164752efc
Notes: Henri Verbeet 2024-12-18 17:39:58 +01:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1322

View File

@@ -555,28 +555,34 @@ static enum vkd3d_shader_register_type parse_register_type(
return VKD3DSPR_INVALID; return VKD3DSPR_INVALID;
} }
static void shader_sm1_parse_src_param(struct vkd3d_shader_sm1_parser *sm1, uint32_t param, static void d3dbc_parse_register(struct vkd3d_shader_sm1_parser *d3dbc,
struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_src_param *src) struct vkd3d_shader_register *reg, uint32_t param, struct vkd3d_shader_src_param *rel_addr)
{ {
enum vkd3d_shader_register_type reg_type; enum vkd3d_shader_register_type reg_type;
unsigned int index_offset, idx_count; unsigned int index_offset, idx_count;
reg_type = parse_register_type(sm1, param, &index_offset); reg_type = parse_register_type(d3dbc, param, &index_offset);
idx_count = idx_count_from_reg_type(reg_type); idx_count = idx_count_from_reg_type(reg_type);
vsir_register_init(&src->reg, reg_type, VKD3D_DATA_FLOAT, idx_count); vsir_register_init(reg, reg_type, VKD3D_DATA_FLOAT, idx_count);
src->reg.precision = VKD3D_SHADER_REGISTER_PRECISION_DEFAULT; reg->precision = VKD3D_SHADER_REGISTER_PRECISION_DEFAULT;
src->reg.non_uniform = false; reg->non_uniform = false;
if (idx_count == 1) if (idx_count == 1)
{ {
src->reg.idx[0].offset = index_offset + (param & VKD3D_SM1_REGISTER_NUMBER_MASK); reg->idx[0].offset = index_offset + (param & VKD3D_SM1_REGISTER_NUMBER_MASK);
src->reg.idx[0].rel_addr = rel_addr; reg->idx[0].rel_addr = rel_addr;
} }
if (src->reg.type == VKD3DSPR_SAMPLER) if (reg->type == VKD3DSPR_SAMPLER)
src->reg.dimension = VSIR_DIMENSION_NONE; reg->dimension = VSIR_DIMENSION_NONE;
else if (src->reg.type == VKD3DSPR_DEPTHOUT) else if (reg->type == VKD3DSPR_DEPTHOUT)
src->reg.dimension = VSIR_DIMENSION_SCALAR; reg->dimension = VSIR_DIMENSION_SCALAR;
else else
src->reg.dimension = VSIR_DIMENSION_VEC4; reg->dimension = VSIR_DIMENSION_VEC4;
}
static void shader_sm1_parse_src_param(struct vkd3d_shader_sm1_parser *sm1, uint32_t param,
struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_src_param *src)
{
d3dbc_parse_register(sm1, &src->reg, param, rel_addr);
src->swizzle = swizzle_from_sm1((param & VKD3D_SM1_SWIZZLE_MASK) >> VKD3D_SM1_SWIZZLE_SHIFT); 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; src->modifiers = (param & VKD3D_SM1_SRC_MODIFIER_MASK) >> VKD3D_SM1_SRC_MODIFIER_SHIFT;
} }
@@ -584,25 +590,7 @@ static void shader_sm1_parse_src_param(struct vkd3d_shader_sm1_parser *sm1, uint
static void shader_sm1_parse_dst_param(struct vkd3d_shader_sm1_parser *sm1, uint32_t param, static void shader_sm1_parse_dst_param(struct vkd3d_shader_sm1_parser *sm1, uint32_t param,
struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_dst_param *dst) struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_dst_param *dst)
{ {
enum vkd3d_shader_register_type reg_type; d3dbc_parse_register(sm1, &dst->reg, param, rel_addr);
unsigned int index_offset, idx_count;
reg_type = parse_register_type(sm1, param, &index_offset);
idx_count = idx_count_from_reg_type(reg_type);
vsir_register_init(&dst->reg, reg_type, VKD3D_DATA_FLOAT, idx_count);
dst->reg.precision = VKD3D_SHADER_REGISTER_PRECISION_DEFAULT;
dst->reg.non_uniform = false;
if (idx_count == 1)
{
dst->reg.idx[0].offset = index_offset + (param & VKD3D_SM1_REGISTER_NUMBER_MASK);
dst->reg.idx[0].rel_addr = rel_addr;
}
if (dst->reg.type == VKD3DSPR_SAMPLER)
dst->reg.dimension = VSIR_DIMENSION_NONE;
else if (dst->reg.type == VKD3DSPR_DEPTHOUT)
dst->reg.dimension = VSIR_DIMENSION_SCALAR;
else
dst->reg.dimension = VSIR_DIMENSION_VEC4;
dst->modifiers = (param & VKD3D_SM1_DST_MODIFIER_MASK) >> VKD3D_SM1_DST_MODIFIER_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; dst->shift = (param & VKD3D_SM1_DSTSHIFT_MASK) >> VKD3D_SM1_DSTSHIFT_SHIFT;