diff --git a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp index f7c2d57f76..94bcbea0fd 100644 --- a/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Program/FragmentProgramDecompiler.cpp @@ -232,12 +232,29 @@ std::string FragmentProgramDecompiler::AddCond() std::string FragmentProgramDecompiler::AddConst() { + const u32 constant_id = m_size + (4 * sizeof(u32)); + int index = -1, ctr = 0; + + // Have we seen this constant before? + for (auto it = properties.constant_offsets.rbegin(); it != properties.constant_offsets.rend(); ++it, ++ctr) + { + if (*it == constant_id) + { + index = ctr; + break; + } + } + + if (index == -1) + { + index = static_cast(properties.constant_offsets.size()); + properties.constant_offsets.push_back(constant_id); + } + // Skip next instruction, its just a literal m_offset = 2 * 4 * sizeof(u32); // Return the next offset index - const u32 index = ::size32(properties.constant_offsets); - properties.constant_offsets.push_back(m_size + 4 * 4); return "_fetch_constant(" + std::to_string(index) + ")"; } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index ca431116d1..6cbea779c2 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2185,6 +2185,7 @@ void VKGSRender::upload_transform_constants(const rsx::io_buffer& buffer) void VKGSRender::update_vertex_env(u32 id, const vk::vertex_upload_info& vertex_info) { +#pragma pack(push, 1) struct rsx_vs_prog_push_constants_block_t { u32 xform_constants_offset; @@ -2205,6 +2206,7 @@ void VKGSRender::update_vertex_env(u32 id, const vk::vertex_upload_info& vertex_ u32 reserved; s32 attrib_data[1]; }; +#pragma pack(pop) // Actual allocation must have been done previously const u32 vs_constant_id_offset = static_cast(m_xform_constants_dynamic_offset) / 16u;