diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index 3977852a48deae2b6c65be2017ec062f167156ff..f1012d06c6a154b7e079bb78d10e0870ce023315 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -139,12 +139,16 @@ static void vkd3d_glsl_generator_init(struct vkd3d_glsl_generator *gen, gen->message_context = message_context; } -int glsl_compile(struct vsir_program *program, struct vkd3d_shader_code *out, +int glsl_compile(struct vsir_program *program, uint64_t config_flags, + const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context) { struct vkd3d_glsl_generator generator; int ret; + if ((ret = vsir_program_normalise(program, config_flags, compile_info, message_context)) < 0) + return ret; + vkd3d_glsl_generator_init(&generator, program, message_context); ret = vkd3d_glsl_generator_generate(&generator, out); vkd3d_glsl_generator_cleanup(&generator); diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 454a8927e3023d1ad4ed78037a2edf74e7b6a5db..eca18f4eb28549d62df23f35f425206d5817d0d9 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -6012,7 +6012,8 @@ enum vkd3d_result vsir_program_normalise(struct vsir_program *program, uint64_t if ((result = vsir_program_normalise_combined_samplers(program, message_context)) < 0) return result; - if ((result = vsir_program_flatten_control_flow_constructs(program, message_context)) < 0) + if (compile_info->target_type != VKD3D_SHADER_TARGET_GLSL + && (result = vsir_program_flatten_control_flow_constructs(program, message_context)) < 0) return result; } diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 12024306423ffdff3e02a5b24ae4c53663fae50d..43bf5f6fc109bddfe178cd2d9b932d12f4d047f5 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1576,7 +1576,7 @@ static int vkd3d_shader_parser_compile(struct vkd3d_shader_parser *parser, case VKD3D_SHADER_TARGET_GLSL: if ((ret = scan_with_parser(&scan_info, message_context, &scan_descriptor_info, parser)) < 0) return ret; - ret = glsl_compile(program, out, message_context); + ret = glsl_compile(program, parser->config_flags, compile_info, out, message_context); vkd3d_shader_free_scan_descriptor_info1(&scan_descriptor_info); break; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index a20a3c5f6668ad6eaa5b10d7e81b05b1128a0d4e..cfd3de2c0ca75bb735ec86c214cf2889a7d015ea 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1538,7 +1538,8 @@ int shader_extract_from_dxbc(const struct vkd3d_shader_code *dxbc, int shader_parse_input_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context, struct shader_signature *signature); -int glsl_compile(struct vsir_program *program, struct vkd3d_shader_code *out, +int glsl_compile(struct vsir_program *program, uint64_t config_flags, + const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context); #define SPIRV_MAX_SRC_COUNT 6