Skip to content
Snippets Groups Projects

vkd3d-shader/ir: Validate control point count and signature types.

Merged Giovanni Mascellani requested to merge giomasce/vkd3d:vulcano into master
1 file
+ 44
0
Compare changes
  • Side-by-side
  • Inline
+ 44
0
@@ -6942,11 +6942,23 @@ static void vsir_validate_signature_element(struct validation_context *ctx,
idx, signature_type_name, element->interpolation_mode);
}
static const unsigned int allowed_signature_phases[] =
{
[SIGNATURE_TYPE_INPUT] = PS_BIT | VS_BIT | GS_BIT | HS_BIT | DS_BIT,
[SIGNATURE_TYPE_OUTPUT] = PS_BIT | VS_BIT | GS_BIT | HS_BIT | DS_BIT,
[SIGNATURE_TYPE_PATCH_CONSTANT] = HS_BIT | DS_BIT,
};
static void vsir_validate_signature(struct validation_context *ctx,
const struct shader_signature *signature, enum vsir_signature_type signature_type)
{
unsigned int i;
if (signature->element_count != 0 && !(allowed_signature_phases[signature_type]
& (1u << ctx->program->shader_version.type)))
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
"Unexpected %s signature.", signature_type_names[signature_type]);
for (i = 0; i < signature->element_count; ++i)
vsir_validate_signature_element(ctx, signature, signature_type, i);
}
@@ -7501,6 +7513,38 @@ enum vkd3d_result vsir_program_validate(struct vsir_program *program, uint64_t c
"Patch constant signature is only valid for hull and domain shaders.");
}
switch (program->shader_version.type)
{
case VKD3D_SHADER_TYPE_HULL:
case VKD3D_SHADER_TYPE_DOMAIN:
case VKD3D_SHADER_TYPE_GEOMETRY:
if (program->input_control_point_count == 0)
validator_error(&ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
"Invalid zero input control point count.");
break;
default:
if (program->input_control_point_count != 0)
validator_error(&ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
"Invalid input control point count %u.",
program->input_control_point_count);
}
switch (program->shader_version.type)
{
case VKD3D_SHADER_TYPE_HULL:
if (program->output_control_point_count == 0)
validator_error(&ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
"Invalid zero output control point count.");
break;
default:
if (program->output_control_point_count != 0)
validator_error(&ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
"Invalid output control point count %u.",
program->output_control_point_count);
}
vsir_validate_signature(&ctx, &program->input_signature, SIGNATURE_TYPE_INPUT);
vsir_validate_signature(&ctx, &program->output_signature, SIGNATURE_TYPE_OUTPUT);
vsir_validate_signature(&ctx, &program->patch_constant_signature, SIGNATURE_TYPE_PATCH_CONSTANT);
Loading