From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d-shader/vkd3d_shader_main.c | 102 ++++++++------------------ 1 file changed, 31 insertions(+), 71 deletions(-)
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 3dcc99e2a..1b60ac789 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1472,70 +1472,6 @@ static int scan_with_parser(const struct vkd3d_shader_compile_info *compile_info return ret; }
-int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char **messages) -{ - struct vkd3d_shader_message_context message_context; - int ret; - - TRACE("compile_info %p, messages %p.\n", compile_info, messages); - - if (messages) - *messages = NULL; - - if ((ret = vkd3d_shader_validate_compile_info(compile_info, false)) < 0) - return ret; - - init_scan_signature_info(compile_info); - - vkd3d_shader_message_context_init(&message_context, compile_info->log_level); - - vkd3d_shader_dump_shader(compile_info); - - if (compile_info->source_type == VKD3D_SHADER_SOURCE_HLSL) - { - FIXME("HLSL support not implemented.\n"); - ret = VKD3D_ERROR_NOT_IMPLEMENTED; - } - else - { - struct vkd3d_shader_parser *parser; - - switch (compile_info->source_type) - { - case VKD3D_SHADER_SOURCE_D3D_BYTECODE: - ret = vkd3d_shader_sm1_parser_create(compile_info, &message_context, &parser); - break; - - case VKD3D_SHADER_SOURCE_DXBC_TPF: - ret = vkd3d_shader_sm4_parser_create(compile_info, &message_context, &parser); - break; - - case VKD3D_SHADER_SOURCE_DXBC_DXIL: - ret = vkd3d_shader_sm6_parser_create(compile_info, &message_context, &parser); - break; - - default: - vkd3d_unreachable(); - } - - if (ret < 0) - { - WARN("Failed to create shader parser.\n"); - } - else - { - ret = scan_with_parser(compile_info, &message_context, NULL, parser); - vkd3d_shader_parser_destroy(parser); - } - } - - vkd3d_shader_message_context_trace_messages(&message_context); - if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) - ret = VKD3D_ERROR_OUT_OF_MEMORY; - vkd3d_shader_message_context_cleanup(&message_context); - return ret; -} - static int vkd3d_shader_parser_compile(struct vkd3d_shader_parser *parser, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) @@ -1600,18 +1536,16 @@ static int compile_hlsl(const struct vkd3d_shader_compile_info *compile_info, return ret; }
-int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, - struct vkd3d_shader_code *out, char **messages) +static int scan_or_compile(const struct vkd3d_shader_compile_info *compile_info, + struct vkd3d_shader_code *out, char **messages, bool compile) { struct vkd3d_shader_message_context message_context; int ret;
- TRACE("compile_info %p, out %p, messages %p.\n", compile_info, out, messages); - if (messages) *messages = NULL;
- if ((ret = vkd3d_shader_validate_compile_info(compile_info, true)) < 0) + if ((ret = vkd3d_shader_validate_compile_info(compile_info, compile)) < 0) return ret;
init_scan_signature_info(compile_info); @@ -1622,7 +1556,15 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info,
if (compile_info->source_type == VKD3D_SHADER_SOURCE_HLSL) { - ret = compile_hlsl(compile_info, out, &message_context); + if (compile) + { + ret = compile_hlsl(compile_info, out, &message_context); + } + else + { + FIXME("HLSL support not implemented.\n"); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + } } else { @@ -1652,7 +1594,10 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, } else { - ret = vkd3d_shader_parser_compile(parser, compile_info, out, &message_context); + if (compile) + ret = vkd3d_shader_parser_compile(parser, compile_info, out, &message_context); + else + ret = scan_with_parser(compile_info, &message_context, NULL, parser); vkd3d_shader_parser_destroy(parser); } } @@ -1664,6 +1609,21 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, return ret; }
+int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char **messages) +{ + TRACE("compile_info %p, messages %p.\n", compile_info, messages); + + return scan_or_compile(compile_info, NULL, messages, false); +} + +int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, + struct vkd3d_shader_code *out, char **messages) +{ + TRACE("compile_info %p, out %p, messages %p.\n", compile_info, out, messages); + + return scan_or_compile(compile_info, out, messages, true); +} + void vkd3d_shader_free_scan_combined_resource_sampler_info( struct vkd3d_shader_scan_combined_resource_sampler_info *info) {