mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/dxil: Avoid using the I/O signatures from the DXBC container.
We currently generate our own I/O signatures inside the DXIL parser, but use the element counts from the DXBC container signatures to allocate the input_params/output_params/patch_constant_params arrays. That happens to work for well-behaved inputs, but it's asking for trouble.
This commit is contained in:
Notes:
Henri Verbeet
2025-02-20 16:07:33 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1383
@@ -3911,23 +3911,51 @@ static void sm6_parser_init_signature(struct sm6_parser *sm6, const struct shade
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sm6_parser_init_output_signature(struct sm6_parser *sm6, const struct shader_signature *output_signature)
|
static int sm6_parser_init_output_signature(struct sm6_parser *sm6, const struct shader_signature *output_signature)
|
||||||
{
|
{
|
||||||
|
if (!(sm6->output_params = vsir_program_get_dst_params(sm6->p.program, output_signature->element_count)))
|
||||||
|
{
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY,
|
||||||
|
"Failed to allocate output parameters.");
|
||||||
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
sm6_parser_init_signature(sm6, output_signature, false, VKD3DSPR_OUTPUT, sm6->output_params);
|
sm6_parser_init_signature(sm6, output_signature, false, VKD3DSPR_OUTPUT, sm6->output_params);
|
||||||
|
|
||||||
|
return VKD3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sm6_parser_init_input_signature(struct sm6_parser *sm6, const struct shader_signature *input_signature)
|
static int sm6_parser_init_input_signature(struct sm6_parser *sm6, const struct shader_signature *input_signature)
|
||||||
{
|
{
|
||||||
|
if (!(sm6->input_params = vsir_program_get_dst_params(sm6->p.program, input_signature->element_count)))
|
||||||
|
{
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY,
|
||||||
|
"Failed to allocate input parameters.");
|
||||||
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
sm6_parser_init_signature(sm6, input_signature, true, VKD3DSPR_INPUT, sm6->input_params);
|
sm6_parser_init_signature(sm6, input_signature, true, VKD3DSPR_INPUT, sm6->input_params);
|
||||||
|
|
||||||
|
return VKD3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sm6_parser_init_patch_constant_signature(struct sm6_parser *sm6,
|
static int sm6_parser_init_patch_constant_signature(struct sm6_parser *sm6,
|
||||||
const struct shader_signature *patch_constant_signature)
|
const struct shader_signature *patch_constant_signature)
|
||||||
{
|
{
|
||||||
bool is_input = sm6->p.program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN;
|
bool is_input = sm6->p.program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN;
|
||||||
|
|
||||||
|
if (!(sm6->patch_constant_params = vsir_program_get_dst_params(sm6->p.program,
|
||||||
|
patch_constant_signature->element_count)))
|
||||||
|
{
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY,
|
||||||
|
"Failed to allocate patch constant parameters.");
|
||||||
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
sm6_parser_init_signature(sm6, patch_constant_signature, is_input, VKD3DSPR_PATCHCONST,
|
sm6_parser_init_signature(sm6, patch_constant_signature, is_input, VKD3DSPR_PATCHCONST,
|
||||||
sm6->patch_constant_params);
|
sm6->patch_constant_params);
|
||||||
|
|
||||||
|
return VKD3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct sm6_value *sm6_parser_next_function_definition(struct sm6_parser *sm6)
|
static const struct sm6_value *sm6_parser_next_function_definition(struct sm6_parser *sm6)
|
||||||
@@ -9631,23 +9659,24 @@ static enum vkd3d_result sm6_parser_signatures_init(struct sm6_parser *sm6, cons
|
|||||||
|
|
||||||
if (m->u.node->operand_count && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[0],
|
if (m->u.node->operand_count && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[0],
|
||||||
&program->input_signature, tessellator_domain, true)) < 0)
|
&program->input_signature, tessellator_domain, true)) < 0)
|
||||||
{
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
if (m->u.node->operand_count > 1 && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[1],
|
if (m->u.node->operand_count > 1 && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[1],
|
||||||
&program->output_signature, tessellator_domain, false)) < 0)
|
&program->output_signature, tessellator_domain, false)) < 0)
|
||||||
{
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
if (m->u.node->operand_count > 1 && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[2],
|
if (m->u.node->operand_count > 1 && (ret = sm6_parser_read_signature(sm6, m->u.node->operands[2],
|
||||||
&program->patch_constant_signature, tessellator_domain, false)) < 0)
|
&program->patch_constant_signature, tessellator_domain, false)) < 0)
|
||||||
{
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
sm6_parser_init_input_signature(sm6, &program->input_signature);
|
if ((ret = sm6_parser_init_input_signature(sm6, &program->input_signature)) < 0)
|
||||||
sm6_parser_init_output_signature(sm6, &program->output_signature);
|
return ret;
|
||||||
sm6_parser_init_patch_constant_signature(sm6, &program->patch_constant_signature);
|
|
||||||
|
if ((ret = sm6_parser_init_output_signature(sm6, &program->output_signature) < 0))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = sm6_parser_init_patch_constant_signature(sm6, &program->patch_constant_signature)) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
return VKD3D_OK;
|
return VKD3D_OK;
|
||||||
}
|
}
|
||||||
@@ -10432,9 +10461,6 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, struct vsir_pro
|
|||||||
input_signature = &program->input_signature;
|
input_signature = &program->input_signature;
|
||||||
output_signature = &program->output_signature;
|
output_signature = &program->output_signature;
|
||||||
patch_constant_signature = &program->patch_constant_signature;
|
patch_constant_signature = &program->patch_constant_signature;
|
||||||
*input_signature = dxbc_desc->input_signature;
|
|
||||||
*output_signature = dxbc_desc->output_signature;
|
|
||||||
*patch_constant_signature = dxbc_desc->patch_constant_signature;
|
|
||||||
program->features = dxbc_desc->features;
|
program->features = dxbc_desc->features;
|
||||||
memset(dxbc_desc, 0, sizeof(*dxbc_desc));
|
memset(dxbc_desc, 0, sizeof(*dxbc_desc));
|
||||||
|
|
||||||
@@ -10498,18 +10524,6 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, struct vsir_pro
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(sm6->output_params = vsir_program_get_dst_params(program, output_signature->element_count))
|
|
||||||
|| !(sm6->input_params = vsir_program_get_dst_params(program, input_signature->element_count))
|
|
||||||
|| !(sm6->patch_constant_params = vsir_program_get_dst_params(program,
|
|
||||||
patch_constant_signature->element_count)))
|
|
||||||
{
|
|
||||||
ERR("Failed to allocate input/output parameters.\n");
|
|
||||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_OUT_OF_MEMORY,
|
|
||||||
"Out of memory allocating input/output parameters.");
|
|
||||||
ret = VKD3D_ERROR_OUT_OF_MEMORY;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
function_count = dxil_block_compute_function_count(&sm6->root_block);
|
function_count = dxil_block_compute_function_count(&sm6->root_block);
|
||||||
if (!(sm6->functions = vkd3d_calloc(function_count, sizeof(*sm6->functions))))
|
if (!(sm6->functions = vkd3d_calloc(function_count, sizeof(*sm6->functions))))
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user