From 64866098e732ed2cfa548796b7934d670ed6e335 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 12 Jun 2025 23:00:41 +0300 Subject: [PATCH] vk: Respect shader compile flags when linking --- rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp | 29 ++++++++++++++----------- rpcs3/Emu/RSX/VK/VKPipelineCompiler.h | 18 ++++++++++++--- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp index 884841ec4b..26e0b64098 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.cpp @@ -36,12 +36,12 @@ namespace vk { if (job.is_graphics_job) { - auto compiled = int_compile_graphics_pipe(job.graphics_data, job.graphics_modules, job.inputs, {}); + auto compiled = int_compile_graphics_pipe(job.graphics_data, job.graphics_modules, job.inputs, {}, job.flags); job.callback_func(compiled); } else { - auto compiled = int_compile_compute_pipe(job.compute_data, job.inputs); + auto compiled = int_compile_compute_pipe(job.compute_data, job.inputs, job.flags); job.callback_func(compiled); } } @@ -52,20 +52,22 @@ namespace vk std::unique_ptr pipe_compiler::int_compile_compute_pipe( const VkComputePipelineCreateInfo& create_info, - const std::vector& cs_inputs) + const std::vector& cs_inputs, + op_flags flags) { auto program = std::make_unique(*m_device, create_info, cs_inputs); - program->link(false); + program->link(flags & SEPARATE_SHADER_OBJECTS); return program; } std::unique_ptr pipe_compiler::int_compile_graphics_pipe( const VkGraphicsPipelineCreateInfo& create_info, const std::vector& vs_inputs, - const std::vector& fs_inputs) + const std::vector& fs_inputs, + op_flags flags) { auto program = std::make_unique(*m_device, create_info, vs_inputs, fs_inputs); - program->link(true); + program->link(flags & SEPARATE_SHADER_OBJECTS); return program; } @@ -73,7 +75,8 @@ namespace vk const vk::pipeline_props &create_info, VkShaderModule modules[2], const std::vector& vs_inputs, - const std::vector& fs_inputs) + const std::vector& fs_inputs, + op_flags flags) { VkPipelineShaderStageCreateInfo shader_stages[2] = {}; shader_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; @@ -167,7 +170,7 @@ namespace vk info.basePipelineHandle = VK_NULL_HANDLE; info.renderPass = vk::get_renderpass(*m_device, create_info.renderpass_key); - return int_compile_graphics_pipe(info, vs_inputs, fs_inputs); + return int_compile_graphics_pipe(info, vs_inputs, fs_inputs, flags); } std::unique_ptr pipe_compiler::compile( @@ -177,10 +180,10 @@ namespace vk { if (flags & COMPILE_INLINE) { - return int_compile_compute_pipe(create_info, cs_inputs); + return int_compile_compute_pipe(create_info, cs_inputs, flags); } - m_work_queue.push(create_info, cs_inputs, callback); + m_work_queue.push(create_info, cs_inputs, flags, callback); return {}; } @@ -192,7 +195,7 @@ namespace vk { // It is very inefficient to defer this as all pointers need to be saved ensure(flags & COMPILE_INLINE); - return int_compile_graphics_pipe(create_info, vs_inputs, fs_inputs); + return int_compile_graphics_pipe(create_info, vs_inputs, fs_inputs, flags); } std::unique_ptr pipe_compiler::compile( @@ -206,10 +209,10 @@ namespace vk VkShaderModule modules[] = { vs, fs }; if (flags & COMPILE_INLINE) { - return int_compile_graphics_pipe(create_info, modules, vs_inputs, fs_inputs); + return int_compile_graphics_pipe(create_info, modules, vs_inputs, fs_inputs, flags); } - m_work_queue.push(create_info, modules, vs_inputs, fs_inputs, callback); + m_work_queue.push(create_info, modules, vs_inputs, fs_inputs, flags, callback); return {}; } diff --git a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h index 25c0b8e1c0..762e8aadfc 100644 --- a/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h +++ b/rpcs3/Emu/RSX/VK/VKPipelineCompiler.h @@ -117,11 +117,14 @@ namespace vk VkShaderModule graphics_modules[2]; std::vector inputs; + op_flags flags; + pipe_compiler_job( const vk::pipeline_props& props, VkShaderModule modules[2], const std::vector& vs_in, const std::vector& fs_in, + op_flags flags_, callback_t func) { callback_func = func; @@ -129,6 +132,7 @@ namespace vk graphics_modules[0] = modules[0]; graphics_modules[1] = modules[1]; is_graphics_job = true; + flags = flags_; inputs.reserve(vs_in.size() + fs_in.size()); inputs.insert(inputs.end(), vs_in.begin(), vs_in.end()); @@ -138,11 +142,16 @@ namespace vk pipe_compiler_job( const VkComputePipelineCreateInfo& props, const std::vector& cs_in, + op_flags flags_, callback_t func) { callback_func = func; compute_data = props; is_graphics_job = false; + flags = flags_; + + graphics_modules[0] = VK_NULL_HANDLE; + graphics_modules[1] = VK_NULL_HANDLE; inputs = cs_in; } @@ -153,18 +162,21 @@ namespace vk std::unique_ptr int_compile_compute_pipe( const VkComputePipelineCreateInfo& create_info, - const std::vector& cs_inputs); + const std::vector& cs_inputs, + op_flags flags); std::unique_ptr int_compile_graphics_pipe( const VkGraphicsPipelineCreateInfo& create_info, const std::vector& vs_inputs, - const std::vector& fs_inputs); + const std::vector& fs_inputs, + op_flags flags); std::unique_ptr int_compile_graphics_pipe( const vk::pipeline_props &create_info, VkShaderModule modules[2], const std::vector& vs_inputs, - const std::vector& fs_inputs); + const std::vector& fs_inputs, + op_flags flags); }; void initialize_pipe_compiler(int num_worker_threads = -1);