From 33e4b1150990cdd20e80285d4a1a9ccd6aff61df Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 27 Jul 2025 03:27:57 +0300 Subject: [PATCH] vk: Fix use of push constants - The double-overhead is so not worth it. Better to remove it down the line. --- rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp | 2 +- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 30 +++++++++++++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index dc92101a2d..d7181881ba 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -286,7 +286,7 @@ void VKFragmentDecompilerThread::insertConstants(std::stringstream & OS) OS << "layout(push_constant) uniform push_constants_block\n" "{\n" - " uint fs_constants_offset;\n" + " layout(offset=12) uint fs_constants_offset;\n" "};\n\n"; const vk::glsl::program_input push_constants diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 63c3d578e2..ca431116d1 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2185,11 +2185,15 @@ void VKGSRender::upload_transform_constants(const rsx::io_buffer& buffer) void VKGSRender::update_vertex_env(u32 id, const vk::vertex_upload_info& vertex_info) { - struct rsx_prog_push_constants_block_t + struct rsx_vs_prog_push_constants_block_t { u32 xform_constants_offset; u32 vs_context_offset; u32 vs_attrib_layout_offset; + }; + + struct rsx_fs_prog_push_constants_block_t + { u32 fs_constants_offset; }; @@ -2209,19 +2213,29 @@ void VKGSRender::update_vertex_env(u32 id, const vk::vertex_upload_info& vertex_ const u32 fs_constant_id_offset = static_cast(m_fragment_constants_dynamic_offset) / 16u; // Pack - rsx_prog_push_constants_block_t push_constants; - push_constants.xform_constants_offset = vs_constant_id_offset; - push_constants.vs_context_offset = vertex_context_offset; - push_constants.vs_attrib_layout_offset = vertex_layout_offset + id; - push_constants.fs_constants_offset = fs_constant_id_offset; + rsx_vs_prog_push_constants_block_t vs_push_constants; + vs_push_constants.xform_constants_offset = vs_constant_id_offset; + vs_push_constants.vs_context_offset = vertex_context_offset; + vs_push_constants.vs_attrib_layout_offset = vertex_layout_offset + id; + + rsx_fs_prog_push_constants_block_t fs_push_constants; + fs_push_constants.fs_constants_offset = fs_constant_id_offset; vkCmdPushConstants( *m_current_command_buffer, m_program->layout(), VK_SHADER_STAGE_VERTEX_BIT, 0, - sizeof(push_constants), - &push_constants); + sizeof(vs_push_constants), + &vs_push_constants); + + vkCmdPushConstants( + *m_current_command_buffer, + m_program->layout(), + VK_SHADER_STAGE_FRAGMENT_BIT, + sizeof(vs_push_constants), + sizeof(fs_push_constants), + &fs_push_constants); // Now actually fill in the data auto buf = m_vertex_layout_ring_info.map(m_vertex_layout_dynamic_offset + (144u * id), 144);