diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 61b3e9bbab..18997088d3 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -228,7 +228,11 @@ public: bool BindMultiRangeStorage(const Binding& binding, bool is_written, std::span pool); - void ResolveMultiRangeStorage(Binding& binding, std::vector& pool); + + + + + void ResolveMultiRangeStorage(Binding& binding, std::vector& pool); void UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size); diff --git a/src/video_core/engines/draw_manager.cpp b/src/video_core/engines/draw_manager.cpp index b38847db6b..177d83700b 100644 --- a/src/video_core/engines/draw_manager.cpp +++ b/src/video_core/engines/draw_manager.cpp @@ -83,7 +83,7 @@ void Maxwell3D::DrawManager::FlushInstanceArray(Maxwell3D& maxwell3d) { const u32 instance_count = draw_state.instance_count + 1; draw_state.draw_mode = DrawMode::General; draw_state.instance_count = 0; - if (draw_state.vertex_buffer.count != 0 && maxwell3d.ShouldExecute()) { + if (maxwell3d.ShouldExecute()) { maxwell3d.rasterizer->Draw(false, instance_count); } } @@ -309,13 +309,6 @@ void Maxwell3D::DrawManager::UpdateTopology(Maxwell3D& maxwell3d) { void Maxwell3D::DrawManager::ProcessDraw(Maxwell3D& maxwell3d, bool draw_indexed, u32 instance_count) { LOG_TRACE(HW_GPU, "called, topology={}, count={}", draw_state.topology, draw_indexed ? draw_state.index_buffer.count : draw_state.vertex_buffer.count); UpdateTopology(maxwell3d); - u32 count = draw_state.vertex_buffer.count; - if (draw_indexed) { - count = draw_state.index_buffer.count; - } - if (count == 0) { - return; - } if (maxwell3d.ShouldExecute()) { maxwell3d.rasterizer->Draw(draw_indexed, instance_count); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index b5eb0c5763..7346c5c269 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -237,7 +237,7 @@ RasterizerVulkan::~RasterizerVulkan() { } template -void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { +void RasterizerVulkan::PrepareDraw(bool is_indexed, bool skip_empty, Func&& draw_func) { SCOPE_EXIT { gpu.TickWork(); @@ -245,6 +245,17 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { FlushWork(); gpu_memory->FlushCaching(); + if (skip_empty) { + const auto& draw_state = maxwell3d->draw_manager.draw_state; + u32 count = draw_state.vertex_buffer.count; + if (is_indexed) { + count = draw_state.index_buffer.count; + } + if (count == 0) { + return; + } + } + GraphicsPipeline* const pipeline{pipeline_cache.CurrentGraphicsPipeline()}; if (!pipeline) { return; @@ -264,7 +275,7 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { } void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { - PrepareDraw(is_indexed, [this, is_indexed, instance_count] { + PrepareDraw(is_indexed, true, [this, is_indexed, instance_count] { const auto& draw_state = maxwell3d->draw_manager.draw_state; const u32 num_instances{instance_count}; const DrawParams draw_params{MakeDrawParams(draw_state, num_instances, is_indexed)}; @@ -299,7 +310,7 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { void RasterizerVulkan::DrawIndirect() { const auto& params = maxwell3d->draw_manager.indirect_state; buffer_cache.SetDrawIndirect(¶ms); - PrepareDraw(params.is_indexed, [this, ¶ms] { + PrepareDraw(params.is_indexed, false, [this, ¶ms] { const auto indirect_buffer = buffer_cache.GetDrawIndirectBuffer(); const auto& buffer = indirect_buffer.first; const auto& offset = indirect_buffer.second; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 59bcf65ec4..bb7c5ff09e 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -155,7 +155,7 @@ private: static constexpr VkDeviceSize DEFAULT_BUFFER_SIZE = 4 * sizeof(float); template - void PrepareDraw(bool is_indexed, Func&&); + void PrepareDraw(bool is_indexed, bool skip_empty, Func&&); void FlushWork();