mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-01-08 08:00:44 +01:00
improve command buffer sync
This commit is contained in:
parent
eb7c10e89f
commit
fd16488e4c
@ -38,12 +38,12 @@ bool LatteTextureReadbackInfoMtl::IsFinished()
|
|||||||
if (m_mtlr->GetCurrentCommandBuffer() == m_commandBuffer)
|
if (m_mtlr->GetCurrentCommandBuffer() == m_commandBuffer)
|
||||||
m_mtlr->CommitCommandBuffer();
|
m_mtlr->CommitCommandBuffer();
|
||||||
|
|
||||||
return m_mtlr->CommandBufferCompleted(m_commandBuffer);
|
return CommandBufferCompleted(m_commandBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LatteTextureReadbackInfoMtl::ForceFinish()
|
void LatteTextureReadbackInfoMtl::ForceFinish()
|
||||||
{
|
{
|
||||||
m_mtlr->WaitForCommandBufferCompletion(m_commandBuffer);
|
m_commandBuffer->waitUntilCompleted();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8* LatteTextureReadbackInfoMtl::GetData()
|
uint8* LatteTextureReadbackInfoMtl::GetData()
|
||||||
|
@ -255,7 +255,7 @@ public:
|
|||||||
auto& buffer = m_buffers[i];
|
auto& buffer = m_buffers[i];
|
||||||
for (uint32_t j = 0; j < buffer.m_data.m_commandBuffers.size(); j++)
|
for (uint32_t j = 0; j < buffer.m_data.m_commandBuffers.size(); j++)
|
||||||
{
|
{
|
||||||
if (m_mtlr->CommandBufferCompleted(buffer.m_data.m_commandBuffers[j]))
|
if (CommandBufferCompleted(buffer.m_data.m_commandBuffers[j]))
|
||||||
{
|
{
|
||||||
if (buffer.m_data.m_commandBuffers.size() == 1)
|
if (buffer.m_data.m_commandBuffers.size() == 1)
|
||||||
{
|
{
|
||||||
|
@ -69,3 +69,9 @@ inline bool IsValidDepthTextureType(Latte::E_DIM dim)
|
|||||||
{
|
{
|
||||||
return (dim == Latte::E_DIM::DIM_2D || dim == Latte::E_DIM::DIM_2D_MSAA || dim == Latte::E_DIM::DIM_2D_ARRAY || dim == Latte::E_DIM::DIM_2D_ARRAY_MSAA || dim == Latte::E_DIM::DIM_CUBEMAP);
|
return (dim == Latte::E_DIM::DIM_2D || dim == Latte::E_DIM::DIM_2D_MSAA || dim == Latte::E_DIM::DIM_2D_ARRAY || dim == Latte::E_DIM::DIM_2D_ARRAY_MSAA || dim == Latte::E_DIM::DIM_CUBEMAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool CommandBufferCompleted(MTL::CommandBuffer* commandBuffer)
|
||||||
|
{
|
||||||
|
auto status = commandBuffer->status();
|
||||||
|
return (status == MTL::CommandBufferStatusCompleted || status == MTL::CommandBufferStatusError);
|
||||||
|
}
|
||||||
|
@ -4,14 +4,21 @@
|
|||||||
|
|
||||||
bool LatteQueryObjectMtl::getResult(uint64& numSamplesPassed)
|
bool LatteQueryObjectMtl::getResult(uint64& numSamplesPassed)
|
||||||
{
|
{
|
||||||
if (!m_mtlr->CommandBufferCompleted(m_commandBuffer))
|
if (!CommandBufferCompleted(m_commandBuffer))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
numSamplesPassed = m_mtlr->GetOcclusionQueryResultsPtr()[m_queryIndex];
|
numSamplesPassed = m_mtlr->GetOcclusionQueryResultsPtr()[m_queryIndex];
|
||||||
|
printf("Num samples: %llu\n", numSamplesPassed);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LatteQueryObjectMtl::~LatteQueryObjectMtl()
|
||||||
|
{
|
||||||
|
if (m_queryIndex != INVALID_UINT32)
|
||||||
|
m_mtlr->ReleaseOcclusionQueryIndex(m_queryIndex);
|
||||||
|
}
|
||||||
|
|
||||||
void LatteQueryObjectMtl::begin()
|
void LatteQueryObjectMtl::begin()
|
||||||
{
|
{
|
||||||
m_queryIndex = m_mtlr->GetAvailableOcclusionQueryIndex();
|
m_queryIndex = m_mtlr->GetAvailableOcclusionQueryIndex();
|
||||||
@ -21,5 +28,7 @@ void LatteQueryObjectMtl::begin()
|
|||||||
void LatteQueryObjectMtl::end()
|
void LatteQueryObjectMtl::end()
|
||||||
{
|
{
|
||||||
m_mtlr->SetActiveOcclusionQueryIndex(INVALID_UINT32);
|
m_mtlr->SetActiveOcclusionQueryIndex(INVALID_UINT32);
|
||||||
// TODO: request soon submit of the command buffer
|
m_commandBuffer = m_mtlr->GetCurrentCommandBuffer();
|
||||||
|
// TODO: request soon submit instead?
|
||||||
|
m_mtlr->CommitCommandBuffer();
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ class LatteQueryObjectMtl : public LatteQueryObject
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LatteQueryObjectMtl(class MetalRenderer* mtlRenderer) : m_mtlr{mtlRenderer} {}
|
LatteQueryObjectMtl(class MetalRenderer* mtlRenderer) : m_mtlr{mtlRenderer} {}
|
||||||
|
~LatteQueryObjectMtl();
|
||||||
|
|
||||||
bool getResult(uint64& numSamplesPassed) override;
|
bool getResult(uint64& numSamplesPassed) override;
|
||||||
void begin() override;
|
void begin() override;
|
||||||
@ -16,7 +17,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
class MetalRenderer* m_mtlr;
|
class MetalRenderer* m_mtlr;
|
||||||
|
|
||||||
uint32 m_queryIndex;
|
uint32 m_queryIndex = INVALID_UINT32;
|
||||||
|
// TODO: make this a list of command buffers
|
||||||
MTL::CommandBuffer* m_commandBuffer;
|
MTL::CommandBuffer* m_commandBuffer;
|
||||||
uint64 m_acccumulatedSum;
|
|
||||||
};
|
};
|
||||||
|
@ -334,7 +334,7 @@ void MetalRenderer::Flush(bool waitIdle)
|
|||||||
{
|
{
|
||||||
cemu_assert_debug(commandBuffer.m_commited);
|
cemu_assert_debug(commandBuffer.m_commited);
|
||||||
|
|
||||||
WaitForCommandBufferCompletion(commandBuffer.m_commandBuffer);
|
commandBuffer.m_commandBuffer->waitUntilCompleted();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1059,7 +1059,7 @@ void MetalRenderer::draw_execute(uint32 baseVertex, uint32 baseInstance, uint32
|
|||||||
if (m_occlusionQuery.m_activeIndex != encoderState.m_visibilityResultOffset)
|
if (m_occlusionQuery.m_activeIndex != encoderState.m_visibilityResultOffset)
|
||||||
{
|
{
|
||||||
auto mode = (m_occlusionQuery.m_activeIndex == INVALID_UINT32 ? MTL::VisibilityResultModeDisabled : MTL::VisibilityResultModeCounting);
|
auto mode = (m_occlusionQuery.m_activeIndex == INVALID_UINT32 ? MTL::VisibilityResultModeDisabled : MTL::VisibilityResultModeCounting);
|
||||||
renderCommandEncoder->setVisibilityResultMode(mode, m_occlusionQuery.m_activeIndex);
|
renderCommandEncoder->setVisibilityResultMode(mode, m_occlusionQuery.m_activeIndex * sizeof(uint64));
|
||||||
encoderState.m_visibilityResultOffset = m_occlusionQuery.m_activeIndex;
|
encoderState.m_visibilityResultOffset = m_occlusionQuery.m_activeIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1309,16 +1309,16 @@ LatteQueryObject* MetalRenderer::occlusionQuery_create() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MetalRenderer::occlusionQuery_destroy(LatteQueryObject* queryObj) {
|
void MetalRenderer::occlusionQuery_destroy(LatteQueryObject* queryObj) {
|
||||||
// TODO: do something?
|
auto queryObjMtl = static_cast<LatteQueryObjectMtl*>(queryObj);
|
||||||
|
delete queryObjMtl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalRenderer::occlusionQuery_flush() {
|
void MetalRenderer::occlusionQuery_flush() {
|
||||||
// TODO: implement
|
// TODO: implement
|
||||||
debug_printf("Occlusion query flush is not implemented\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalRenderer::occlusionQuery_updateState() {
|
void MetalRenderer::occlusionQuery_updateState() {
|
||||||
// TODO
|
// TODO: implement
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalRenderer::SetBuffer(MTL::RenderCommandEncoder* renderCommandEncoder, MetalShaderType shaderType, MTL::Buffer* buffer, size_t offset, uint32 index)
|
void MetalRenderer::SetBuffer(MTL::RenderCommandEncoder* renderCommandEncoder, MetalShaderType shaderType, MTL::Buffer* buffer, size_t offset, uint32 index)
|
||||||
@ -1420,17 +1420,6 @@ MTL::CommandBuffer* MetalRenderer::GetCommandBuffer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MetalRenderer::CommandBufferCompleted(MTL::CommandBuffer* commandBuffer)
|
|
||||||
{
|
|
||||||
auto status = commandBuffer->status();
|
|
||||||
return (status == MTL::CommandBufferStatusCompleted || status == MTL::CommandBufferStatusError);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MetalRenderer::WaitForCommandBufferCompletion(MTL::CommandBuffer* commandBuffer)
|
|
||||||
{
|
|
||||||
commandBuffer->waitUntilCompleted();
|
|
||||||
}
|
|
||||||
|
|
||||||
MTL::RenderCommandEncoder* MetalRenderer::GetTemporaryRenderCommandEncoder(MTL::RenderPassDescriptor* renderPassDescriptor)
|
MTL::RenderCommandEncoder* MetalRenderer::GetTemporaryRenderCommandEncoder(MTL::RenderPassDescriptor* renderPassDescriptor)
|
||||||
{
|
{
|
||||||
EndEncoding();
|
EndEncoding();
|
||||||
@ -1594,8 +1583,6 @@ void MetalRenderer::CommitCommandBuffer()
|
|||||||
|
|
||||||
m_memoryManager->GetTemporaryBufferAllocator().SetActiveCommandBuffer(nullptr);
|
m_memoryManager->GetTemporaryBufferAllocator().SetActiveCommandBuffer(nullptr);
|
||||||
|
|
||||||
m_occlusionQuery.m_availableIndices.insert(m_occlusionQuery.m_availableIndices.end(), m_occlusionQuery.m_crntCmdBuffIndices.begin(), m_occlusionQuery.m_crntCmdBuffIndices.end());
|
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
//m_commandQueue->insertDebugCaptureBoundary();
|
//m_commandQueue->insertDebugCaptureBoundary();
|
||||||
}
|
}
|
||||||
|
@ -323,8 +323,6 @@ public:
|
|||||||
void SetSamplerState(MTL::RenderCommandEncoder* renderCommandEncoder, MetalShaderType shaderType, MTL::SamplerState* samplerState, uint32 index);
|
void SetSamplerState(MTL::RenderCommandEncoder* renderCommandEncoder, MetalShaderType shaderType, MTL::SamplerState* samplerState, uint32 index);
|
||||||
|
|
||||||
MTL::CommandBuffer* GetCommandBuffer();
|
MTL::CommandBuffer* GetCommandBuffer();
|
||||||
bool CommandBufferCompleted(MTL::CommandBuffer* commandBuffer);
|
|
||||||
void WaitForCommandBufferCompletion(MTL::CommandBuffer* commandBuffer);
|
|
||||||
MTL::RenderCommandEncoder* GetTemporaryRenderCommandEncoder(MTL::RenderPassDescriptor* renderPassDescriptor);
|
MTL::RenderCommandEncoder* GetTemporaryRenderCommandEncoder(MTL::RenderPassDescriptor* renderPassDescriptor);
|
||||||
MTL::RenderCommandEncoder* GetRenderCommandEncoder(bool forceRecreate = false);
|
MTL::RenderCommandEncoder* GetRenderCommandEncoder(bool forceRecreate = false);
|
||||||
MTL::ComputeCommandEncoder* GetComputeCommandEncoder();
|
MTL::ComputeCommandEncoder* GetComputeCommandEncoder();
|
||||||
@ -397,11 +395,15 @@ public:
|
|||||||
|
|
||||||
uint32 queryIndex = m_occlusionQuery.m_availableIndices.back();
|
uint32 queryIndex = m_occlusionQuery.m_availableIndices.back();
|
||||||
m_occlusionQuery.m_availableIndices.pop_back();
|
m_occlusionQuery.m_availableIndices.pop_back();
|
||||||
m_occlusionQuery.m_crntCmdBuffIndices.push_back(queryIndex);
|
|
||||||
|
|
||||||
return queryIndex;
|
return queryIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ReleaseOcclusionQueryIndex(uint32 queryIndex)
|
||||||
|
{
|
||||||
|
m_occlusionQuery.m_availableIndices.push_back(queryIndex);
|
||||||
|
}
|
||||||
|
|
||||||
void SetActiveOcclusionQueryIndex(uint32 queryIndex)
|
void SetActiveOcclusionQueryIndex(uint32 queryIndex)
|
||||||
{
|
{
|
||||||
m_occlusionQuery.m_activeIndex = queryIndex;
|
m_occlusionQuery.m_activeIndex = queryIndex;
|
||||||
@ -460,7 +462,6 @@ private:
|
|||||||
MTL::Buffer* m_resultBuffer;
|
MTL::Buffer* m_resultBuffer;
|
||||||
uint64* m_resultsPtr;
|
uint64* m_resultsPtr;
|
||||||
std::vector<uint32> m_availableIndices;
|
std::vector<uint32> m_availableIndices;
|
||||||
std::vector<uint32> m_crntCmdBuffIndices;
|
|
||||||
uint32 m_activeIndex = INVALID_UINT32;
|
uint32 m_activeIndex = INVALID_UINT32;
|
||||||
} m_occlusionQuery;
|
} m_occlusionQuery;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user