vkd3d-shader/spirv: Always emit clip/cull builtins as an array.

Clip/cull distance can appear as input in pixel shaders, and the
array size must not be forced to zero.
This commit is contained in:
Conor McCarthy 2023-12-06 15:07:18 +10:00 committed by Alexandre Julliard
parent b5c067b41a
commit 9fcc904834
Notes: Alexandre Julliard 2023-12-06 23:24:41 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/513
2 changed files with 9 additions and 1 deletions

View File

@ -4714,8 +4714,11 @@ static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler,
array_sizes[0] = (reg->type == VKD3DSPR_PATCHCONST ? 0 : compiler->input_control_point_count);
array_sizes[1] = signature_element->register_count;
if (array_sizes[1] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic))
if (array_sizes[1] == 1 && !vsir_sysval_semantic_is_tess_factor(signature_element->sysval_semantic)
&& (!vsir_sysval_semantic_is_clip_cull(signature_element->sysval_semantic) || array_sizes[0]))
{
array_sizes[1] = 0;
}
write_mask = signature_element->mask;

View File

@ -980,6 +980,11 @@ static inline bool vsir_sysval_semantic_is_tess_factor(enum vkd3d_shader_sysval_
&& 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,
unsigned int reg_idx, unsigned int write_mask);
void shader_signature_cleanup(struct shader_signature *signature);