vk: Use write commands instead of copy commands to avoid dependencies

This commit is contained in:
kd-11 2025-06-12 23:21:14 +03:00 committed by kd-11
parent 64866098e7
commit ae74aa336f
5 changed files with 28 additions and 9 deletions

View file

@ -48,7 +48,9 @@ namespace vk
bool compile_async, bool compile_async,
std::function<pipeline_type*(pipeline_storage_type&)> callback) std::function<pipeline_type*(pipeline_storage_type&)> 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 compiler = vk::get_pipe_compiler();
auto result = compiler->compile( auto result = compiler->compile(
pipelineProperties, pipelineProperties,

View file

@ -509,20 +509,20 @@ namespace vk
} }
m_copy_cmds.push_back({ m_copy_cmds.push_back({
.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET, .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.srcSet = m_previous_set,
.srcBinding = i,
.dstSet = m_descriptor_set.value(), .dstSet = m_descriptor_set.value(),
.dstBinding = i, .dstBinding = i,
.descriptorCount = 1 .descriptorCount = 1,
.descriptorType = m_descriptor_types[i],
.pImageInfo = std::get_if<VkDescriptorImageInfo>(&m_descriptor_slots[i]),
.pBufferInfo = std::get_if<VkDescriptorBufferInfo>(&m_descriptor_slots[i]),
.pTexelBufferView = std::get_if<VkBufferView>(&m_descriptor_slots[i])
}); });
type_mask |= (1u << m_descriptor_types[i]); type_mask |= (1u << m_descriptor_types[i]);
} }
m_descriptor_set.push(m_copy_cmds, type_mask); // Write previous state 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(); m_descriptor_set = allocate_descriptor_set();
} }

View file

@ -121,11 +121,10 @@ namespace vk
vk::descriptor_set m_descriptor_set{}; vk::descriptor_set m_descriptor_set{};
rsx::simple_array<VkDescriptorPoolSize> m_descriptor_pool_sizes; rsx::simple_array<VkDescriptorPoolSize> m_descriptor_pool_sizes;
rsx::simple_array<VkDescriptorType> m_descriptor_types; rsx::simple_array<VkDescriptorType> m_descriptor_types;
VkDescriptorSet m_previous_set = VK_NULL_HANDLE;
std::vector<descriptor_slot_t> m_descriptor_slots; std::vector<descriptor_slot_t> m_descriptor_slots;
std::vector<bool> m_descriptors_dirty; std::vector<bool> m_descriptors_dirty;
rsx::simple_array<VkCopyDescriptorSet> m_copy_cmds; rsx::simple_array<VkWriteDescriptorSet> m_copy_cmds;
bool m_any_descriptors_dirty = false; bool m_any_descriptors_dirty = false;
void init(VkDevice dev); void init(VkDevice dev);

View file

@ -422,6 +422,23 @@ namespace vk
} }
} }
void descriptor_set::push(rsx::simple_array<VkWriteDescriptorSet>& 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) void descriptor_set::push(const descriptor_set_dynamic_offset_t& offset)
{ {
ensure(offset.location >= 0 && offset.location <= 16); ensure(offset.location >= 0 && offset.location <= 16);

View file

@ -103,6 +103,7 @@ namespace vk
void push(const VkDescriptorImageInfo& image_info, VkDescriptorType type, u32 binding); void push(const VkDescriptorImageInfo& image_info, VkDescriptorType type, u32 binding);
void push(const VkDescriptorImageInfo* image_info, u32 count, VkDescriptorType type, u32 binding); void push(const VkDescriptorImageInfo* image_info, u32 count, VkDescriptorType type, u32 binding);
void push(rsx::simple_array<VkCopyDescriptorSet>& copy_cmd, u32 type_mask = umax); void push(rsx::simple_array<VkCopyDescriptorSet>& copy_cmd, u32 type_mask = umax);
void push(rsx::simple_array<VkWriteDescriptorSet>& write_cmds, u32 type_mask = umax);
void push(const descriptor_set_dynamic_offset_t& offset); void push(const descriptor_set_dynamic_offset_t& offset);
void bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout); void bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout);