diff --git a/rpcs3/Emu/RSX/VK/VKProgramBuffer.h b/rpcs3/Emu/RSX/VK/VKProgramBuffer.h index 647b21adc4..3e4ee000df 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramBuffer.h +++ b/rpcs3/Emu/RSX/VK/VKProgramBuffer.h @@ -48,7 +48,9 @@ namespace vk bool compile_async, std::function callback) { - const auto compiler_flags = compile_async ? vk::pipe_compiler::COMPILE_DEFERRED : vk::pipe_compiler::COMPILE_INLINE; + vk::pipe_compiler::op_flags compiler_flags = compile_async ? vk::pipe_compiler::COMPILE_DEFERRED : vk::pipe_compiler::COMPILE_INLINE; + compiler_flags |= vk::pipe_compiler::SEPARATE_SHADER_OBJECTS; + auto compiler = vk::get_pipe_compiler(); auto result = compiler->compile( pipelineProperties, diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp index fb8450a166..8ad89bc4a9 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp @@ -509,20 +509,20 @@ namespace vk } m_copy_cmds.push_back({ - .sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET, - .srcSet = m_previous_set, - .srcBinding = i, + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .dstSet = m_descriptor_set.value(), .dstBinding = i, - .descriptorCount = 1 + .descriptorCount = 1, + .descriptorType = m_descriptor_types[i], + .pImageInfo = std::get_if(&m_descriptor_slots[i]), + .pBufferInfo = std::get_if(&m_descriptor_slots[i]), + .pTexelBufferView = std::get_if(&m_descriptor_slots[i]) }); type_mask |= (1u << m_descriptor_types[i]); } m_descriptor_set.push(m_copy_cmds, type_mask); // Write previous state - - m_previous_set = m_descriptor_set.value(); m_descriptor_set = allocate_descriptor_set(); } diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h index 785a7f9529..d0f06e2a80 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.h +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.h @@ -121,11 +121,10 @@ namespace vk vk::descriptor_set m_descriptor_set{}; rsx::simple_array m_descriptor_pool_sizes; rsx::simple_array m_descriptor_types; - VkDescriptorSet m_previous_set = VK_NULL_HANDLE; std::vector m_descriptor_slots; std::vector m_descriptors_dirty; - rsx::simple_array m_copy_cmds; + rsx::simple_array m_copy_cmds; bool m_any_descriptors_dirty = false; void init(VkDevice dev); diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp index c8673d4517..5a2ad92dab 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp @@ -422,6 +422,23 @@ namespace vk } } + void descriptor_set::push(rsx::simple_array& write_cmds, u32 type_mask) + { + m_push_type_mask |= type_mask; + + if (m_pending_writes.empty()) [[unlikely]] + { + m_pending_writes = std::move(write_cmds); + } + else + { + const auto old_size = m_pending_writes.size(); + const auto new_size = write_cmds.size() + old_size; + m_pending_writes.resize(new_size); + std::copy(write_cmds.begin(), write_cmds.end(), m_pending_writes.begin() + old_size); + } + } + void descriptor_set::push(const descriptor_set_dynamic_offset_t& offset) { ensure(offset.location >= 0 && offset.location <= 16); diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h index 9fd0b436a9..c3e67302ae 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h @@ -103,6 +103,7 @@ namespace vk void push(const VkDescriptorImageInfo& image_info, VkDescriptorType type, u32 binding); void push(const VkDescriptorImageInfo* image_info, u32 count, VkDescriptorType type, u32 binding); void push(rsx::simple_array& copy_cmd, u32 type_mask = umax); + void push(rsx::simple_array& write_cmds, u32 type_mask = umax); void push(const descriptor_set_dynamic_offset_t& offset); void bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout);