mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/ir: Introduce vsir_signature_element_is_array().
This commit is contained in:
committed by
Henri Verbeet
parent
1307659e74
commit
85b7b9c6b4
Notes:
Henri Verbeet
2025-11-25 20:40:54 +01:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1816
@@ -3952,7 +3952,7 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par
|
|||||||
vkd3d_unreachable();
|
vkd3d_unreachable();
|
||||||
e = &signature->elements[element_idx];
|
e = &signature->elements[element_idx];
|
||||||
|
|
||||||
if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic)))
|
if (vsir_signature_element_is_array(e))
|
||||||
id_idx = shader_register_normalise_arrayed_addressing(reg, id_idx, e->register_index);
|
id_idx = shader_register_normalise_arrayed_addressing(reg, id_idx, e->register_index);
|
||||||
|
|
||||||
/* Replace the register index with the signature element index */
|
/* Replace the register index with the signature element index */
|
||||||
@@ -4034,7 +4034,7 @@ static void shader_src_param_io_normalise(struct vkd3d_shader_src_param *src_par
|
|||||||
}
|
}
|
||||||
|
|
||||||
e = &signature->elements[element_idx];
|
e = &signature->elements[element_idx];
|
||||||
if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic)))
|
if (vsir_signature_element_is_array(e))
|
||||||
id_idx = shader_register_normalise_arrayed_addressing(reg, id_idx, e->register_index);
|
id_idx = shader_register_normalise_arrayed_addressing(reg, id_idx, e->register_index);
|
||||||
reg->idx[id_idx].offset = element_idx;
|
reg->idx[id_idx].offset = element_idx;
|
||||||
reg->idx_count = id_idx + 1;
|
reg->idx_count = id_idx + 1;
|
||||||
@@ -10529,8 +10529,7 @@ static void vsir_validate_io_register(struct validation_context *ctx, const stru
|
|||||||
}
|
}
|
||||||
|
|
||||||
element = &signature->elements[signature_idx];
|
element = &signature->elements[signature_idx];
|
||||||
if (element->register_count > 1 || vsir_sysval_semantic_is_tess_factor(element->sysval_semantic))
|
is_array = vsir_signature_element_is_array(element);
|
||||||
is_array = true;
|
|
||||||
|
|
||||||
expected_idx_count = 1 + !!has_control_point + !!is_array;
|
expected_idx_count = 1 + !!has_control_point + !!is_array;
|
||||||
control_point_index = !!is_array;
|
control_point_index = !!is_array;
|
||||||
|
|||||||
@@ -5646,11 +5646,9 @@ static void spirv_compiler_emit_input(struct spirv_compiler *compiler,
|
|||||||
|
|
||||||
array_sizes[0] = signature_element->register_count;
|
array_sizes[0] = signature_element->register_count;
|
||||||
array_sizes[1] = (reg_type == VKD3DSPR_PATCHCONST ? 0 : compiler->input_control_point_count);
|
array_sizes[1] = (reg_type == VKD3DSPR_PATCHCONST ? 0 : compiler->input_control_point_count);
|
||||||
if (array_sizes[0] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic)
|
if (!vsir_signature_element_is_array(signature_element)
|
||||||
&& (!vsir_sysval_semantic_is_clip_cull(signature_element->sysval_semantic) || array_sizes[1]))
|
&& (!vsir_sysval_semantic_is_clip_cull(signature_element->sysval_semantic) || array_sizes[1]))
|
||||||
{
|
|
||||||
array_sizes[0] = 0;
|
array_sizes[0] = 0;
|
||||||
}
|
|
||||||
|
|
||||||
write_mask = signature_element->mask;
|
write_mask = signature_element->mask;
|
||||||
|
|
||||||
@@ -5919,7 +5917,7 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
|
|||||||
sysval = VKD3D_SHADER_SV_NONE;
|
sysval = VKD3D_SHADER_SV_NONE;
|
||||||
array_sizes[0] = signature_element->register_count;
|
array_sizes[0] = signature_element->register_count;
|
||||||
array_sizes[1] = (reg_type == VKD3DSPR_PATCHCONST ? 0 : compiler->output_control_point_count);
|
array_sizes[1] = (reg_type == VKD3DSPR_PATCHCONST ? 0 : compiler->output_control_point_count);
|
||||||
if (array_sizes[0] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic))
|
if (!vsir_signature_element_is_array(signature_element))
|
||||||
array_sizes[0] = 0;
|
array_sizes[0] = 0;
|
||||||
|
|
||||||
builtin = vkd3d_get_spirv_builtin(compiler, reg_type, sysval);
|
builtin = vkd3d_get_spirv_builtin(compiler, reg_type, sysval);
|
||||||
|
|||||||
@@ -1166,6 +1166,17 @@ enum vkd3d_shader_input_sysval_semantic
|
|||||||
|
|
||||||
#define SIGNATURE_TARGET_LOCATION_UNUSED (~0u)
|
#define SIGNATURE_TARGET_LOCATION_UNUSED (~0u)
|
||||||
|
|
||||||
|
static inline bool vsir_sysval_semantic_is_tess_factor(enum vkd3d_shader_sysval_semantic sysval_semantic)
|
||||||
|
{
|
||||||
|
return sysval_semantic >= VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE
|
||||||
|
&& sysval_semantic <= VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool vsir_sysval_semantic_is_clip_cull(enum vkd3d_shader_sysval_semantic sysval_semantic)
|
||||||
|
{
|
||||||
|
return sysval_semantic == VKD3D_SHADER_SV_CLIP_DISTANCE || sysval_semantic == VKD3D_SHADER_SV_CULL_DISTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
struct signature_element
|
struct signature_element
|
||||||
{
|
{
|
||||||
/* sort_index is not a property of the signature element, it is just a
|
/* sort_index is not a property of the signature element, it is just a
|
||||||
@@ -1189,6 +1200,17 @@ struct signature_element
|
|||||||
unsigned int target_location;
|
unsigned int target_location;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline bool vsir_signature_element_is_array(const struct signature_element *element)
|
||||||
|
{
|
||||||
|
enum vkd3d_shader_sysval_semantic semantic = element->sysval_semantic;
|
||||||
|
|
||||||
|
if (element->register_count > 1)
|
||||||
|
return true;
|
||||||
|
if (vsir_sysval_semantic_is_tess_factor(semantic))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct shader_signature
|
struct shader_signature
|
||||||
{
|
{
|
||||||
struct signature_element *elements;
|
struct signature_element *elements;
|
||||||
@@ -1196,17 +1218,6 @@ struct shader_signature
|
|||||||
unsigned int element_count;
|
unsigned int element_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool vsir_sysval_semantic_is_tess_factor(enum vkd3d_shader_sysval_semantic sysval_semantic)
|
|
||||||
{
|
|
||||||
return sysval_semantic >= VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE
|
|
||||||
&& sysval_semantic <= VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool vsir_sysval_semantic_is_clip_cull(enum vkd3d_shader_sysval_semantic sysval_semantic)
|
|
||||||
{
|
|
||||||
return sysval_semantic == VKD3D_SHADER_SV_CLIP_DISTANCE || sysval_semantic == VKD3D_SHADER_SV_CULL_DISTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct signature_element *vsir_signature_find_element_for_reg(const struct shader_signature *signature,
|
struct signature_element *vsir_signature_find_element_for_reg(const struct shader_signature *signature,
|
||||||
unsigned int reg_idx, unsigned int write_mask);
|
unsigned int reg_idx, unsigned int write_mask);
|
||||||
bool vsir_signature_find_sysval(const struct shader_signature *signature,
|
bool vsir_signature_find_sysval(const struct shader_signature *signature,
|
||||||
|
|||||||
Reference in New Issue
Block a user