diff options
| author | Stenzek <stenzek@users.noreply.github.com> | 2016-12-05 12:15:38 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-12-05 12:15:38 +1000 |
| commit | 15e2133ce706fe8cd5613c81a8866abe03960e3b (patch) | |
| tree | 56d578484881f78ec684f50804c7348f00bec1bb /Source/Core/VideoBackends/Vulkan/StateTracker.cpp | |
| parent | d1c89db8c809a89d5576dc9ea524629cfc4d29a6 (diff) | |
| parent | 9736198c3b2552e51dd98445c0439dff759e08af (diff) | |
Merge pull request #4462 from stenzek/vulkan-faster-xfb
Vulkan: Cleanup/refactoring, faster RealXFB
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 081036ed8e..34ea98f41b 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -75,8 +75,8 @@ bool StateTracker::Initialize() m_pipeline_state.rasterization_state.depth_clamp = VK_TRUE; // BBox is disabled by default. - m_pipeline_state.pipeline_layout = g_object_cache->GetStandardPipelineLayout(); - m_num_active_descriptor_sets = NUM_DESCRIPTOR_SETS - 1; + m_pipeline_state.pipeline_layout = g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_STANDARD); + m_num_active_descriptor_sets = NUM_GX_DRAW_DESCRIPTOR_SETS; m_bbox_enabled = false; // Initialize all samplers to point by default @@ -164,8 +164,8 @@ bool StateTracker::PrecachePipelineUID(const SerializedPipelineUID& uid) // vertex loader that uses this format, since we need it to create a pipeline. pinfo.vertex_format = VertexFormat::GetOrCreateMatchingFormat(uid.vertex_decl); pinfo.pipeline_layout = uid.ps_uid.GetUidData()->bounding_box ? - g_object_cache->GetBBoxPipelineLayout() : - g_object_cache->GetStandardPipelineLayout(); + g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_BBOX) : + g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_STANDARD); pinfo.vs = g_object_cache->GetVertexShaderForUid(uid.vs_uid); if (pinfo.vs == VK_NULL_HANDLE) { @@ -544,17 +544,17 @@ void StateTracker::SetBBoxEnable(bool enable) // Change the number of active descriptor sets, as well as the pipeline layout if (enable) { - m_pipeline_state.pipeline_layout = g_object_cache->GetBBoxPipelineLayout(); - m_num_active_descriptor_sets = NUM_DESCRIPTOR_SETS; + m_pipeline_state.pipeline_layout = g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_BBOX); + m_num_active_descriptor_sets = NUM_GX_DRAW_WITH_BBOX_DESCRIPTOR_SETS; // The bbox buffer never changes, so we defer descriptor updates until it is enabled. - if (m_descriptor_sets[DESCRIPTOR_SET_SHADER_STORAGE_BUFFERS] == VK_NULL_HANDLE) + if (m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_STORAGE_OR_TEXEL_BUFFER] == VK_NULL_HANDLE) m_dirty_flags |= DIRTY_FLAG_PS_SSBO; } else { - m_pipeline_state.pipeline_layout = g_object_cache->GetStandardPipelineLayout(); - m_num_active_descriptor_sets = NUM_DESCRIPTOR_SETS - 1; + m_pipeline_state.pipeline_layout = g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_STANDARD); + m_num_active_descriptor_sets = NUM_GX_DRAW_DESCRIPTOR_SETS; } m_dirty_flags |= DIRTY_FLAG_PIPELINE | DIRTY_FLAG_DESCRIPTOR_SET_BINDING; @@ -731,7 +731,8 @@ bool StateTracker::Bind(bool rebind_all /*= false*/) { vkCmdBindDescriptorSets( command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_state.pipeline_layout, - DESCRIPTOR_SET_UNIFORM_BUFFERS, 1, &m_descriptor_sets[DESCRIPTOR_SET_UNIFORM_BUFFERS], + DESCRIPTOR_SET_BIND_POINT_UNIFORM_BUFFERS, 1, + &m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_UNIFORM_BUFFERS], NUM_UBO_DESCRIPTOR_SET_BINDINGS, m_bindings.uniform_buffer_offsets.data()); } @@ -791,7 +792,12 @@ void StateTracker::OnEndFrame() u32 interval = static_cast<u32>(g_ActiveConfig.iCommandBufferExecuteInterval); for (u32 draw_counter : m_cpu_accesses_this_frame) { + // We don't want to waste executing command buffers for only a few draws, so set a minimum. + // Leave last_draw_counter as-is, so we get the correct number of draws between submissions. u32 draw_count = draw_counter - last_draw_counter; + if (draw_count < MINIMUM_DRAW_CALLS_PER_COMMAND_BUFFER_FOR_READBACK) + continue; + if (draw_count <= interval) { u32 mid_point = draw_count / 2; @@ -806,6 +812,8 @@ void StateTracker::OnEndFrame() counter += interval; } } + + last_draw_counter = draw_counter; } } @@ -921,10 +929,10 @@ bool StateTracker::UpdateDescriptorSet() u32 num_writes = 0; if (m_dirty_flags & (DIRTY_FLAG_VS_UBO | DIRTY_FLAG_GS_UBO | DIRTY_FLAG_PS_UBO) || - m_descriptor_sets[DESCRIPTOR_SET_UNIFORM_BUFFERS] == VK_NULL_HANDLE) + m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_UNIFORM_BUFFERS] == VK_NULL_HANDLE) { VkDescriptorSetLayout layout = - g_object_cache->GetDescriptorSetLayout(DESCRIPTOR_SET_UNIFORM_BUFFERS); + g_object_cache->GetDescriptorSetLayout(DESCRIPTOR_SET_LAYOUT_UNIFORM_BUFFERS); VkDescriptorSet set = g_command_buffer_mgr->AllocateDescriptorSet(layout); if (set == VK_NULL_HANDLE) return false; @@ -943,15 +951,15 @@ bool StateTracker::UpdateDescriptorSet() nullptr}; } - m_descriptor_sets[DESCRIPTOR_SET_UNIFORM_BUFFERS] = set; + m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_UNIFORM_BUFFERS] = set; m_dirty_flags |= DIRTY_FLAG_DESCRIPTOR_SET_BINDING; } if (m_dirty_flags & DIRTY_FLAG_PS_SAMPLERS || - m_descriptor_sets[DESCRIPTOR_SET_PIXEL_SHADER_SAMPLERS] == VK_NULL_HANDLE) + m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_PIXEL_SHADER_SAMPLERS] == VK_NULL_HANDLE) { VkDescriptorSetLayout layout = - g_object_cache->GetDescriptorSetLayout(DESCRIPTOR_SET_PIXEL_SHADER_SAMPLERS); + g_object_cache->GetDescriptorSetLayout(DESCRIPTOR_SET_LAYOUT_PIXEL_SHADER_SAMPLERS); VkDescriptorSet set = g_command_buffer_mgr->AllocateDescriptorSet(layout); if (set == VK_NULL_HANDLE) return false; @@ -974,16 +982,16 @@ bool StateTracker::UpdateDescriptorSet() } } - m_descriptor_sets[DESCRIPTOR_SET_PIXEL_SHADER_SAMPLERS] = set; + m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_PIXEL_SHADER_SAMPLERS] = set; m_dirty_flags |= DIRTY_FLAG_DESCRIPTOR_SET_BINDING; } if (m_bbox_enabled && (m_dirty_flags & DIRTY_FLAG_PS_SSBO || - m_descriptor_sets[DESCRIPTOR_SET_SHADER_STORAGE_BUFFERS] == VK_NULL_HANDLE)) + m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_STORAGE_OR_TEXEL_BUFFER] == VK_NULL_HANDLE)) { VkDescriptorSetLayout layout = - g_object_cache->GetDescriptorSetLayout(DESCRIPTOR_SET_SHADER_STORAGE_BUFFERS); + g_object_cache->GetDescriptorSetLayout(DESCRIPTOR_SET_LAYOUT_SHADER_STORAGE_BUFFERS); VkDescriptorSet set = g_command_buffer_mgr->AllocateDescriptorSet(layout); if (set == VK_NULL_HANDLE) return false; @@ -999,7 +1007,7 @@ bool StateTracker::UpdateDescriptorSet() &m_bindings.ps_ssbo, nullptr}; - m_descriptor_sets[DESCRIPTOR_SET_SHADER_STORAGE_BUFFERS] = set; + m_descriptor_sets[DESCRIPTOR_SET_BIND_POINT_STORAGE_OR_TEXEL_BUFFER] = set; m_dirty_flags |= DIRTY_FLAG_DESCRIPTOR_SET_BINDING; } |
