mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/spirv: Use register counts from the signature and shader desc.
This commit is contained in:
parent
0058764f01
commit
12240efa79
Notes:
Alexandre Julliard
2023-11-07 22:40:55 +01:00
Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/439
@ -827,12 +827,6 @@ static bool shader_signature_merge(struct shader_signature *s, uint8_t range_map
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool 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 unsigned int shader_register_normalise_arrayed_addressing(struct vkd3d_shader_register *reg,
|
static unsigned int shader_register_normalise_arrayed_addressing(struct vkd3d_shader_register *reg,
|
||||||
unsigned int id_idx, unsigned int register_index)
|
unsigned int id_idx, unsigned int register_index)
|
||||||
{
|
{
|
||||||
@ -933,7 +927,7 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par
|
|||||||
id_idx = 1;
|
id_idx = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((e->register_count > 1 || sysval_semantic_is_tess_factor(e->sysval_semantic)))
|
if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic)))
|
||||||
{
|
{
|
||||||
if (is_io_dcl)
|
if (is_io_dcl)
|
||||||
{
|
{
|
||||||
@ -1008,7 +1002,7 @@ static void shader_src_param_io_normalise(struct vkd3d_shader_src_param *src_par
|
|||||||
element_idx = shader_signature_find_element_for_reg(signature, reg_idx, write_mask);
|
element_idx = shader_signature_find_element_for_reg(signature, reg_idx, write_mask);
|
||||||
|
|
||||||
e = &signature->elements[element_idx];
|
e = &signature->elements[element_idx];
|
||||||
if ((e->register_count > 1 || sysval_semantic_is_tess_factor(e->sysval_semantic)))
|
if ((e->register_count > 1 || vsir_sysval_semantic_is_tess_factor(e->sysval_semantic)))
|
||||||
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;
|
||||||
|
@ -4576,7 +4576,7 @@ static uint32_t spirv_compiler_emit_builtin_variable_v(struct spirv_compiler *co
|
|||||||
assert(size_count <= ARRAY_SIZE(sizes));
|
assert(size_count <= ARRAY_SIZE(sizes));
|
||||||
memcpy(sizes, array_sizes, size_count * sizeof(sizes[0]));
|
memcpy(sizes, array_sizes, size_count * sizeof(sizes[0]));
|
||||||
array_sizes = sizes;
|
array_sizes = sizes;
|
||||||
sizes[0] = max(sizes[0], builtin->spirv_array_size);
|
sizes[size_count - 1] = max(sizes[size_count - 1], builtin->spirv_array_size);
|
||||||
|
|
||||||
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, storage_class,
|
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream, storage_class,
|
||||||
builtin->component_type, builtin->component_count, array_sizes, size_count);
|
builtin->component_type, builtin->component_count, array_sizes, size_count);
|
||||||
@ -4614,24 +4614,6 @@ static unsigned int shader_signature_next_location(const struct shader_signature
|
|||||||
return max_row;
|
return max_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int shader_register_get_io_indices(const struct vkd3d_shader_register *reg,
|
|
||||||
unsigned int *array_sizes)
|
|
||||||
{
|
|
||||||
unsigned int i, element_idx;
|
|
||||||
|
|
||||||
array_sizes[0] = 0;
|
|
||||||
array_sizes[1] = 0;
|
|
||||||
element_idx = reg->idx[0].offset;
|
|
||||||
for (i = 1; i < reg->idx_count; ++i)
|
|
||||||
{
|
|
||||||
array_sizes[1] = array_sizes[0];
|
|
||||||
array_sizes[0] = element_idx;
|
|
||||||
element_idx = reg->idx[i].offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
return element_idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler,
|
static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler,
|
||||||
const struct vkd3d_shader_dst_param *dst)
|
const struct vkd3d_shader_dst_param *dst)
|
||||||
{
|
{
|
||||||
@ -4660,7 +4642,7 @@ static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler,
|
|||||||
shader_signature = reg->type == VKD3DSPR_PATCHCONST
|
shader_signature = reg->type == VKD3DSPR_PATCHCONST
|
||||||
? &compiler->patch_constant_signature : &compiler->input_signature;
|
? &compiler->patch_constant_signature : &compiler->input_signature;
|
||||||
|
|
||||||
element_idx = shader_register_get_io_indices(reg, array_sizes);
|
element_idx = reg->idx[reg->idx_count - 1].offset;
|
||||||
signature_element = &shader_signature->elements[element_idx];
|
signature_element = &shader_signature->elements[element_idx];
|
||||||
sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic);
|
sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic);
|
||||||
/* The Vulkan spec does not explicitly forbid passing varyings from the
|
/* The Vulkan spec does not explicitly forbid passing varyings from the
|
||||||
@ -4671,6 +4653,11 @@ static uint32_t spirv_compiler_emit_input(struct spirv_compiler *compiler,
|
|||||||
|
|
||||||
builtin = get_spirv_builtin_for_sysval(compiler, sysval);
|
builtin = get_spirv_builtin_for_sysval(compiler, sysval);
|
||||||
|
|
||||||
|
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))
|
||||||
|
array_sizes[1] = 0;
|
||||||
|
|
||||||
write_mask = signature_element->mask;
|
write_mask = signature_element->mask;
|
||||||
|
|
||||||
if (builtin)
|
if (builtin)
|
||||||
@ -5021,12 +5008,16 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler, const st
|
|||||||
|
|
||||||
shader_signature = is_patch_constant ? &compiler->patch_constant_signature : &compiler->output_signature;
|
shader_signature = is_patch_constant ? &compiler->patch_constant_signature : &compiler->output_signature;
|
||||||
|
|
||||||
element_idx = shader_register_get_io_indices(reg, array_sizes);
|
element_idx = reg->idx[reg->idx_count - 1].offset;
|
||||||
signature_element = &shader_signature->elements[element_idx];
|
signature_element = &shader_signature->elements[element_idx];
|
||||||
sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic);
|
sysval = vkd3d_siv_from_sysval(signature_element->sysval_semantic);
|
||||||
/* Don't use builtins for TCS -> TES varyings. See spirv_compiler_emit_input(). */
|
/* Don't use builtins for TCS -> TES varyings. See spirv_compiler_emit_input(). */
|
||||||
if (compiler->shader_type == VKD3D_SHADER_TYPE_HULL && !is_patch_constant)
|
if (compiler->shader_type == VKD3D_SHADER_TYPE_HULL && !is_patch_constant)
|
||||||
sysval = VKD3D_SIV_NONE;
|
sysval = VKD3D_SIV_NONE;
|
||||||
|
array_sizes[0] = (reg->type == VKD3DSPR_PATCHCONST ? 0 : compiler->output_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))
|
||||||
|
array_sizes[1] = 0;
|
||||||
|
|
||||||
builtin = vkd3d_get_spirv_builtin(compiler, dst->reg.type, sysval);
|
builtin = vkd3d_get_spirv_builtin(compiler, dst->reg.type, sysval);
|
||||||
|
|
||||||
|
@ -942,6 +942,12 @@ 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;
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
void shader_signature_cleanup(struct shader_signature *signature);
|
void shader_signature_cleanup(struct shader_signature *signature);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user