diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 1655dd5f98..a8abbf16fd 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -800,14 +800,17 @@ void GLGSRender::load_program_env() if (update_transform_constants) { // Vertex constants - const std::vector& constant_ids = m_vertex_prog ? m_vertex_prog->constant_ids : std::vector{}; - const usz transform_constants_size = constant_ids.empty() ? 8192 : constant_ids.size() * 16; + const usz transform_constants_size = (!m_vertex_prog || m_vertex_prog->has_indexed_constants) ? 8192 : m_vertex_prog->constant_ids.size() * 16; + if (transform_constants_size) + { + auto mapping = m_transform_constants_buffer->alloc_from_heap(transform_constants_size, m_uniform_buffer_offset_align); + auto buf = static_cast(mapping.first); - auto mapping = m_transform_constants_buffer->alloc_from_heap(transform_constants_size, m_uniform_buffer_offset_align); - auto buf = static_cast(mapping.first); - fill_vertex_program_constants_data(buf, m_vertex_prog ? m_vertex_prog->constant_ids : std::vector{}); + const std::vector& constant_ids = (transform_constants_size == 8192) ? std::vector{} : m_vertex_prog->constant_ids; + fill_vertex_program_constants_data(buf, m_vertex_prog ? m_vertex_prog->constant_ids : std::vector{}); - m_transform_constants_buffer->bind_range(GL_VERTEX_CONSTANT_BUFFERS_BIND_SLOT, mapping.second, transform_constants_size); + m_transform_constants_buffer->bind_range(GL_VERTEX_CONSTANT_BUFFERS_BIND_SLOT, mapping.second, transform_constants_size); + } } if (update_fragment_constants && !update_instruction_buffers) diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index 9ebb5c0507..a6e4491135 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -276,11 +276,8 @@ void GLVertexProgram::Decompile(const RSXVertexProgram& prog) GLVertexDecompilerThread decompiler(prog, source, parr); decompiler.Task(); - if (has_indexed_constants = decompiler.properties.has_indexed_constants; - !has_indexed_constants) - { - constant_ids = std::vector(decompiler.m_constant_ids.begin(), decompiler.m_constant_ids.end()); - } + has_indexed_constants = decompiler.properties.has_indexed_constants; + constant_ids = std::vector(decompiler.m_constant_ids.begin(), decompiler.m_constant_ids.end()); shader.create(::glsl::program_domain::glsl_vertex_program, source); id = shader.id(); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 65b206e688..9a668612bf 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1952,18 +1952,20 @@ void VKGSRender::load_program_env() if (update_transform_constants) { - check_heap_status(VK_HEAP_CHECK_TRANSFORM_CONSTANTS_STORAGE); - // Transform constants - const std::vector& constant_ids = m_vertex_prog ? m_vertex_prog->constant_ids : std::vector{}; - const usz transform_constants_size = constant_ids.empty() ? 8192 : utils::align(constant_ids.size() * 16, m_device->gpu().get_limits().minUniformBufferOffsetAlignment); + const usz transform_constants_size = (!m_vertex_prog || m_vertex_prog->has_indexed_constants) ? 8192 : m_vertex_prog->constant_ids.size() * 16; + if (transform_constants_size) + { + check_heap_status(VK_HEAP_CHECK_TRANSFORM_CONSTANTS_STORAGE); - auto mem = m_transform_constants_ring_info.alloc<1>(transform_constants_size); - auto buf = m_transform_constants_ring_info.map(mem, transform_constants_size); + auto mem = m_transform_constants_ring_info.alloc<1>(transform_constants_size); + auto buf = m_transform_constants_ring_info.map(mem, transform_constants_size); - fill_vertex_program_constants_data(buf, constant_ids); - m_transform_constants_ring_info.unmap(); - m_vertex_constants_buffer_info = { m_transform_constants_ring_info.heap->value, mem, transform_constants_size }; + const std::vector& constant_ids = (transform_constants_size == 8192) ? std::vector{} : m_vertex_prog->constant_ids; + fill_vertex_program_constants_data(buf, constant_ids); + m_transform_constants_ring_info.unmap(); + m_vertex_constants_buffer_info = { m_transform_constants_ring_info.heap->value, mem, transform_constants_size }; + } } if (update_fragment_constants && !update_instruction_buffers) diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp index 2b278cedac..c6a990a8fe 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp @@ -350,11 +350,8 @@ void VKVertexProgram::Decompile(const RSXVertexProgram& prog) VKVertexDecompilerThread decompiler(prog, source, parr, *this); decompiler.Task(); - if (has_indexed_constants = decompiler.properties.has_indexed_constants; - !has_indexed_constants) - { - constant_ids = std::vector(decompiler.m_constant_ids.begin(), decompiler.m_constant_ids.end()); - } + has_indexed_constants = decompiler.properties.has_indexed_constants; + constant_ids = std::vector(decompiler.m_constant_ids.begin(), decompiler.m_constant_ids.end()); shader.create(::glsl::program_domain::glsl_vertex_program, source); }