From e89efed7434fe4029861a589d57f3521cd61100c Mon Sep 17 00:00:00 2001 From: Samuliak Date: Fri, 13 Sep 2024 16:12:47 +0200 Subject: [PATCH] request soon commit instead of committing directly --- .../Latte/Renderer/Metal/LatteTextureReadbackMtl.cpp | 1 + src/Cafe/HW/Latte/Renderer/Metal/MetalQuery.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp | 12 +++++++----- src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h | 8 +++++++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Metal/LatteTextureReadbackMtl.cpp b/src/Cafe/HW/Latte/Renderer/Metal/LatteTextureReadbackMtl.cpp index d7adc25c..dd2d8aeb 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/LatteTextureReadbackMtl.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/LatteTextureReadbackMtl.cpp @@ -25,6 +25,7 @@ void LatteTextureReadbackInfoMtl::StartTransfer() blitCommandEncoder->copyFromTexture(baseTexture->GetTexture(), 0, 0, MTL::Origin{0, 0, 0}, MTL::Size{(uint32)baseTexture->width, (uint32)baseTexture->height, 1}, m_mtlr->GetTextureReadbackBuffer(), m_bufferOffset, bytesPerRow, bytesPerImage); m_commandBuffer = m_mtlr->GetCurrentCommandBuffer(); + m_mtlr->RequestSoonCommit(); } bool LatteTextureReadbackInfoMtl::IsFinished() diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalQuery.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalQuery.cpp index 895bab22..ab24b4db 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalQuery.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalQuery.cpp @@ -14,6 +14,7 @@ bool LatteQueryObjectMtl::getResult(uint64& numSamplesPassed) return false; numSamplesPassed = m_mtlr->GetOcclusionQueryResultsPtr()[m_queryIndex]; + return true; } @@ -35,7 +36,6 @@ void LatteQueryObjectMtl::end() if (m_mtlr->IsCommandBufferActive()) { m_commandBuffer = m_mtlr->GetCurrentCommandBuffer(); - // TODO: request soon submit instead? - m_mtlr->CommitCommandBuffer(); + m_mtlr->RequestSoonCommit(); } } diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp index e4b25d55..a063a0b7 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp @@ -27,7 +27,7 @@ #include "imgui/imgui_extension.h" #include "imgui/imgui_impl_metal.h" -#define COMMIT_TRESHOLD 256 +#define DEFAULT_COMMIT_TRESHOLD 256 #define OCCLUSION_QUERY_POOL_SIZE 1024 extern bool hasValidFramebufferAttached; @@ -1270,7 +1270,8 @@ void MetalRenderer::draw_endSequence() bool hasReadback = LatteTextureReadback_Update(); m_recordedDrawcalls++; // The number of draw calls needs to twice as big, since we are interrupting the render pass - if (m_recordedDrawcalls >= COMMIT_TRESHOLD * 2 || hasReadback) + // TODO: ucomment? + if (m_recordedDrawcalls >= m_commitTreshold * 2/* || hasReadback*/) { CommitCommandBuffer(); @@ -1409,6 +1410,9 @@ MTL::CommandBuffer* MetalRenderer::GetCommandBuffer() MTL::CommandBuffer* mtlCommandBuffer = m_commandQueue->commandBuffer(); m_commandBuffers.push_back({mtlCommandBuffer}); + m_recordedDrawcalls = 0; + m_commitTreshold = DEFAULT_COMMIT_TRESHOLD; + // Notify memory manager about the new command buffer m_memoryManager->GetTemporaryBufferAllocator().SetActiveCommandBuffer(mtlCommandBuffer); @@ -1557,15 +1561,13 @@ void MetalRenderer::EndEncoding() m_encoderType = MetalEncoderType::None; // Commit the command buffer if enough draw calls have been recorded - if (m_recordedDrawcalls >= COMMIT_TRESHOLD) + if (m_recordedDrawcalls >= m_commitTreshold) CommitCommandBuffer(); } } void MetalRenderer::CommitCommandBuffer() { - m_recordedDrawcalls = 0; - if (m_commandBuffers.size() != 0) { EndEncoding(); diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h index 0c7c78f5..3217d09d 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h @@ -291,6 +291,11 @@ public: return m_commandBuffers[m_commandBuffers.size() - 1].m_commandBuffer; } + void RequestSoonCommit() + { + m_commitTreshold = m_recordedDrawcalls + 8; + } + MTL::CommandEncoder* GetCommandEncoder() { return m_commandEncoder; @@ -475,7 +480,8 @@ private: MetalEncoderType m_encoderType = MetalEncoderType::None; MTL::CommandEncoder* m_commandEncoder = nullptr; - uint32 m_recordedDrawcalls = 0; + uint32 m_recordedDrawcalls; + uint32 m_commitTreshold; // State MetalState m_state;