vkd3d-shader/spirv: Honor force_validation after emitting SPIR-V code.

This commit is contained in:
Giovanni Mascellani 2023-09-25 15:00:12 +02:00 committed by Alexandre Julliard
parent a6317e5f3b
commit ec4986e9e2
Notes: Alexandre Julliard 2023-12-13 23:22:34 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/504
2 changed files with 36 additions and 10 deletions

View File

@ -133,7 +133,7 @@ static void vkd3d_spirv_dump(const struct vkd3d_shader_code *spirv,
} }
} }
static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv, static bool vkd3d_spirv_validate(struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_code *spirv,
enum vkd3d_shader_spirv_environment environment) enum vkd3d_shader_spirv_environment environment)
{ {
spv_diagnostic diagnostic = NULL; spv_diagnostic diagnostic = NULL;
@ -145,12 +145,13 @@ static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv,
if ((ret = spvValidateBinary(context, spirv->code, spirv->size / sizeof(uint32_t), if ((ret = spvValidateBinary(context, spirv->code, spirv->size / sizeof(uint32_t),
&diagnostic))) &diagnostic)))
{ {
FIXME("Failed to validate SPIR-V binary, ret %d.\n", ret); vkd3d_string_buffer_printf(buffer, "%s", diagnostic->error);
FIXME("Diagnostic message: %s.\n", debugstr_a(diagnostic->error));
} }
spvDiagnosticDestroy(diagnostic); spvDiagnosticDestroy(diagnostic);
spvContextDestroy(context); spvContextDestroy(context);
return !ret;
} }
#else #else
@ -163,8 +164,11 @@ static enum vkd3d_result vkd3d_spirv_binary_to_text(const struct vkd3d_shader_co
} }
static void vkd3d_spirv_dump(const struct vkd3d_shader_code *spirv, static void vkd3d_spirv_dump(const struct vkd3d_shader_code *spirv,
enum vkd3d_shader_spirv_environment environment) {} enum vkd3d_shader_spirv_environment environment) {}
static void vkd3d_spirv_validate(const struct vkd3d_shader_code *spirv, static bool vkd3d_spirv_validate(struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_code *spirv,
enum vkd3d_shader_spirv_environment environment) {} enum vkd3d_shader_spirv_environment environment)
{
return true;
}
#endif /* HAVE_SPIRV_TOOLS */ #endif /* HAVE_SPIRV_TOOLS */
@ -2403,6 +2407,8 @@ struct spirv_compiler
struct ssa_register_info *ssa_register_info; struct ssa_register_info *ssa_register_info;
unsigned int ssa_register_count; unsigned int ssa_register_count;
uint64_t config_flags;
}; };
static bool is_in_default_phase(const struct spirv_compiler *compiler) static bool is_in_default_phase(const struct spirv_compiler *compiler)
@ -2458,7 +2464,8 @@ static void spirv_compiler_destroy(struct spirv_compiler *compiler)
static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_version *shader_version, static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_version *shader_version,
struct vkd3d_shader_desc *shader_desc, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_desc *shader_desc, const struct vkd3d_shader_compile_info *compile_info,
const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info, const struct vkd3d_shader_scan_descriptor_info1 *scan_descriptor_info,
struct vkd3d_shader_message_context *message_context, const struct vkd3d_shader_location *location) struct vkd3d_shader_message_context *message_context, const struct vkd3d_shader_location *location,
uint64_t config_flags)
{ {
const struct shader_signature *patch_constant_signature = &shader_desc->patch_constant_signature; const struct shader_signature *patch_constant_signature = &shader_desc->patch_constant_signature;
const struct shader_signature *output_signature = &shader_desc->output_signature; const struct shader_signature *output_signature = &shader_desc->output_signature;
@ -2475,6 +2482,7 @@ static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_ve
memset(compiler, 0, sizeof(*compiler)); memset(compiler, 0, sizeof(*compiler));
compiler->message_context = message_context; compiler->message_context = message_context;
compiler->location = *location; compiler->location = *location;
compiler->config_flags = config_flags;
if ((target_info = vkd3d_find_struct(compile_info->next, SPIRV_TARGET_INFO))) if ((target_info = vkd3d_find_struct(compile_info->next, SPIRV_TARGET_INFO)))
{ {
@ -9977,11 +9985,28 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler,
if (!vkd3d_spirv_compile_module(builder, spirv, spirv_compiler_get_entry_point_name(compiler))) if (!vkd3d_spirv_compile_module(builder, spirv, spirv_compiler_get_entry_point_name(compiler)))
return VKD3D_ERROR; return VKD3D_ERROR;
if (TRACE_ON()) if (TRACE_ON() || parser->config_flags & VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION)
{ {
enum vkd3d_shader_spirv_environment environment = spirv_compiler_get_target_environment(compiler); enum vkd3d_shader_spirv_environment environment = spirv_compiler_get_target_environment(compiler);
vkd3d_spirv_dump(spirv, environment); struct vkd3d_string_buffer buffer;
vkd3d_spirv_validate(spirv, environment);
if (TRACE_ON())
vkd3d_spirv_dump(spirv, environment);
vkd3d_string_buffer_init(&buffer);
if (!vkd3d_spirv_validate(&buffer, spirv, environment))
{
FIXME("Failed to validate SPIR-V binary.\n");
vkd3d_shader_trace_text(buffer.buffer, buffer.content_size);
if (compiler->config_flags & VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION)
{
spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_SHADER,
"Execution generated an invalid shader, failing compilation:\n%s",
buffer.buffer);
}
}
vkd3d_string_buffer_cleanup(&buffer);
} }
if (compiler->failed) if (compiler->failed)
@ -10008,7 +10033,7 @@ int spirv_compile(struct vkd3d_shader_parser *parser,
int ret; int ret;
if (!(spirv_compiler = spirv_compiler_create(&parser->shader_version, &parser->shader_desc, if (!(spirv_compiler = spirv_compiler_create(&parser->shader_version, &parser->shader_desc,
compile_info, scan_descriptor_info, message_context, &parser->location))) compile_info, scan_descriptor_info, message_context, &parser->location, parser->config_flags)))
{ {
ERR("Failed to create SPIR-V compiler.\n"); ERR("Failed to create SPIR-V compiler.\n");
return VKD3D_ERROR; return VKD3D_ERROR;

View File

@ -96,6 +96,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_SPV_INVALID_TYPE = 2006, VKD3D_SHADER_ERROR_SPV_INVALID_TYPE = 2006,
VKD3D_SHADER_ERROR_SPV_INVALID_HANDLER = 2007, VKD3D_SHADER_ERROR_SPV_INVALID_HANDLER = 2007,
VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED = 2008, VKD3D_SHADER_ERROR_SPV_NOT_IMPLEMENTED = 2008,
VKD3D_SHADER_ERROR_SPV_INVALID_SHADER = 2009,
VKD3D_SHADER_WARNING_SPV_INVALID_SWIZZLE = 2300, VKD3D_SHADER_WARNING_SPV_INVALID_SWIZZLE = 2300,