diff options
| author | TellowKrinkle <tellowkrinkle@gmail.com> | 2022-06-18 22:49:03 -0500 |
|---|---|---|
| committer | TellowKrinkle <tellowkrinkle@gmail.com> | 2022-09-19 16:28:24 -0500 |
| commit | 936b4d5d0d4aae87507fb4952f9ad570ee7522fe (patch) | |
| tree | 320531a70ae51b4881425d171e7f3c4ab54375b4 /Source/Core/VideoBackends/Vulkan/StateTracker.cpp | |
| parent | 7edc8b4e794a71da5b21cfbdb850420dfbac5122 (diff) | |
VideoBackends:Vulkan: Dynamic vertex loader support
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index f39139cb52..8da41a61e9 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -77,14 +77,23 @@ bool StateTracker::Initialize() return true; } -void StateTracker::SetVertexBuffer(VkBuffer buffer, VkDeviceSize offset) +void StateTracker::SetVertexBuffer(VkBuffer buffer, VkDeviceSize offset, u32 size) { - if (m_vertex_buffer == buffer && m_vertex_buffer_offset == offset) - return; - - m_vertex_buffer = buffer; - m_vertex_buffer_offset = offset; - m_dirty_flags |= DIRTY_FLAG_VERTEX_BUFFER; + if (m_vertex_buffer != buffer || m_vertex_buffer_offset != offset) + { + m_vertex_buffer = buffer; + m_vertex_buffer_offset = offset; + m_dirty_flags |= DIRTY_FLAG_VERTEX_BUFFER; + } + if (m_bindings.gx_uber_vertex_ssbo.buffer != buffer || + m_bindings.gx_uber_vertex_ssbo.offset != offset || + m_bindings.gx_uber_vertex_ssbo.range != size) + { + m_bindings.gx_uber_vertex_ssbo.buffer = buffer; + m_bindings.gx_uber_vertex_ssbo.offset = offset; + m_bindings.gx_uber_vertex_ssbo.range = size; + m_dirty_flags |= DIRTY_FLAG_GX_SSBO; + } } void StateTracker::SetIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType type) @@ -366,8 +375,12 @@ bool StateTracker::Bind() // Re-bind parts of the pipeline const VkCommandBuffer command_buffer = g_command_buffer_mgr->GetCurrentCommandBuffer(); - if (m_dirty_flags & DIRTY_FLAG_VERTEX_BUFFER) + if (m_pipeline->GetUsage() != AbstractPipelineUsage::GXUber && + (m_dirty_flags & DIRTY_FLAG_VERTEX_BUFFER)) + { vkCmdBindVertexBuffers(command_buffer, 0, 1, &m_vertex_buffer, &m_vertex_buffer_offset); + m_dirty_flags &= ~DIRTY_FLAG_VERTEX_BUFFER; + } if (m_dirty_flags & DIRTY_FLAG_INDEX_BUFFER) vkCmdBindIndexBuffer(command_buffer, m_index_buffer, m_index_buffer_offset, m_index_type); @@ -381,8 +394,8 @@ bool StateTracker::Bind() if (m_dirty_flags & DIRTY_FLAG_SCISSOR) vkCmdSetScissor(command_buffer, 0, 1, &m_scissor); - m_dirty_flags &= ~(DIRTY_FLAG_VERTEX_BUFFER | DIRTY_FLAG_INDEX_BUFFER | DIRTY_FLAG_PIPELINE | - DIRTY_FLAG_VIEWPORT | DIRTY_FLAG_SCISSOR); + m_dirty_flags &= + ~(DIRTY_FLAG_INDEX_BUFFER | DIRTY_FLAG_PIPELINE | DIRTY_FLAG_VIEWPORT | DIRTY_FLAG_SCISSOR); return true; } @@ -462,7 +475,7 @@ bool StateTracker::UpdateGXDescriptorSet() { const size_t MAX_DESCRIPTOR_WRITES = NUM_UBO_DESCRIPTOR_SET_BINDINGS + // UBO 1 + // Samplers - 1; // SSBO + 2; // SSBO std::array<VkWriteDescriptorSet, MAX_DESCRIPTOR_WRITES> writes; u32 num_writes = 0; @@ -516,7 +529,11 @@ bool StateTracker::UpdateGXDescriptorSet() m_dirty_flags = (m_dirty_flags & ~DIRTY_FLAG_GX_SAMPLERS) | DIRTY_FLAG_DESCRIPTOR_SETS; } - if (g_ActiveConfig.backend_info.bSupportsBBox && + const bool needs_bbox_ssbo = g_ActiveConfig.backend_info.bSupportsBBox; + const bool needs_vertex_ssbo = m_pipeline->GetUsage() == AbstractPipelineUsage::GXUber; + const bool needs_ssbo = needs_bbox_ssbo || needs_vertex_ssbo; + + if (needs_ssbo && (m_dirty_flags & DIRTY_FLAG_GX_SSBO || m_gx_descriptor_sets[2] == VK_NULL_HANDLE)) { m_gx_descriptor_sets[2] = @@ -528,6 +545,18 @@ bool StateTracker::UpdateGXDescriptorSet() writes[num_writes++] = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, m_gx_descriptor_sets[2], 0, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nullptr, &m_bindings.ssbo, nullptr}; + + writes[num_writes++] = {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + nullptr, + m_gx_descriptor_sets[2], + 1, + 0, + 1, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + nullptr, + &m_bindings.gx_uber_vertex_ssbo, + nullptr}; + m_dirty_flags = (m_dirty_flags & ~DIRTY_FLAG_GX_SSBO) | DIRTY_FLAG_DESCRIPTOR_SETS; } @@ -538,9 +567,7 @@ bool StateTracker::UpdateGXDescriptorSet() { vkCmdBindDescriptorSets(g_command_buffer_mgr->GetCurrentCommandBuffer(), VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline->GetVkPipelineLayout(), 0, - g_ActiveConfig.backend_info.bSupportsBBox ? - NUM_GX_DESCRIPTOR_SETS : - (NUM_GX_DESCRIPTOR_SETS - 1), + needs_ssbo ? NUM_GX_DESCRIPTOR_SETS : (NUM_GX_DESCRIPTOR_SETS - 1), m_gx_descriptor_sets.data(), g_ActiveConfig.backend_info.bSupportsGeometryShaders ? NUM_UBO_DESCRIPTOR_SET_BINDINGS : |
