mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-12-18 01:37:00 +00:00
speed up render pass change check
This commit is contained in:
parent
af08521676
commit
0c216e40e0
2 changed files with 20 additions and 11 deletions
|
|
@ -698,6 +698,7 @@ void MetalRenderer::rendertarget_deleteCachedFBO(LatteCachedFBO* cfbo)
|
||||||
void MetalRenderer::rendertarget_bindFramebufferObject(LatteCachedFBO* cfbo)
|
void MetalRenderer::rendertarget_bindFramebufferObject(LatteCachedFBO* cfbo)
|
||||||
{
|
{
|
||||||
m_state.m_activeFBO = {(CachedFBOMtl*)cfbo, MetalAttachmentsInfo((CachedFBOMtl*)cfbo)};
|
m_state.m_activeFBO = {(CachedFBOMtl*)cfbo, MetalAttachmentsInfo((CachedFBOMtl*)cfbo)};
|
||||||
|
m_state.m_fboChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* MetalRenderer::texture_acquireTextureUploadBuffer(uint32 size)
|
void* MetalRenderer::texture_acquireTextureUploadBuffer(uint32 size)
|
||||||
|
|
@ -1732,6 +1733,9 @@ MTL::RenderCommandEncoder* MetalRenderer::GetTemporaryRenderCommandEncoder(MTL::
|
||||||
// Some render passes clear the attachments, forceRecreate is supposed to be used in those cases
|
// Some render passes clear the attachments, forceRecreate is supposed to be used in those cases
|
||||||
MTL::RenderCommandEncoder* MetalRenderer::GetRenderCommandEncoder(bool forceRecreate)
|
MTL::RenderCommandEncoder* MetalRenderer::GetRenderCommandEncoder(bool forceRecreate)
|
||||||
{
|
{
|
||||||
|
bool fboChanged = m_state.m_fboChanged;
|
||||||
|
m_state.m_fboChanged = false;
|
||||||
|
|
||||||
// Check if we need to begin a new render pass
|
// Check if we need to begin a new render pass
|
||||||
if (m_commandEncoder)
|
if (m_commandEncoder)
|
||||||
{
|
{
|
||||||
|
|
@ -1739,24 +1743,28 @@ MTL::RenderCommandEncoder* MetalRenderer::GetRenderCommandEncoder(bool forceRecr
|
||||||
{
|
{
|
||||||
if (m_encoderType == MetalEncoderType::Render)
|
if (m_encoderType == MetalEncoderType::Render)
|
||||||
{
|
{
|
||||||
bool needsNewRenderPass = (m_state.m_lastUsedFBO.m_fbo == nullptr);
|
bool needsNewRenderPass = false;
|
||||||
if (!needsNewRenderPass)
|
if (fboChanged)
|
||||||
{
|
{
|
||||||
for (uint8 i = 0; i < 8; i++)
|
needsNewRenderPass = (m_state.m_lastUsedFBO.m_fbo == nullptr);
|
||||||
|
if (!needsNewRenderPass)
|
||||||
{
|
{
|
||||||
if (m_state.m_activeFBO.m_fbo->colorBuffer[i].texture && m_state.m_activeFBO.m_fbo->colorBuffer[i].texture != m_state.m_lastUsedFBO.m_fbo->colorBuffer[i].texture)
|
for (uint8 i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
needsNewRenderPass = true;
|
if (m_state.m_activeFBO.m_fbo->colorBuffer[i].texture && m_state.m_activeFBO.m_fbo->colorBuffer[i].texture != m_state.m_lastUsedFBO.m_fbo->colorBuffer[i].texture)
|
||||||
break;
|
{
|
||||||
|
needsNewRenderPass = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!needsNewRenderPass)
|
if (!needsNewRenderPass)
|
||||||
{
|
|
||||||
if (m_state.m_activeFBO.m_fbo->depthBuffer.texture && (m_state.m_activeFBO.m_fbo->depthBuffer.texture != m_state.m_lastUsedFBO.m_fbo->depthBuffer.texture || ( m_state.m_activeFBO.m_fbo->depthBuffer.hasStencil && !m_state.m_lastUsedFBO.m_fbo->depthBuffer.hasStencil)))
|
|
||||||
{
|
{
|
||||||
needsNewRenderPass = true;
|
if (m_state.m_activeFBO.m_fbo->depthBuffer.texture && (m_state.m_activeFBO.m_fbo->depthBuffer.texture != m_state.m_lastUsedFBO.m_fbo->depthBuffer.texture || ( m_state.m_activeFBO.m_fbo->depthBuffer.hasStencil && !m_state.m_lastUsedFBO.m_fbo->depthBuffer.hasStencil)))
|
||||||
|
{
|
||||||
|
needsNewRenderPass = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,7 @@ struct MetalState
|
||||||
MetalActiveFBOState m_activeFBO;
|
MetalActiveFBOState m_activeFBO;
|
||||||
// If the FBO changes, but it's the same FBO as the last one with some omitted attachments, this FBO doesn't change
|
// If the FBO changes, but it's the same FBO as the last one with some omitted attachments, this FBO doesn't change
|
||||||
MetalActiveFBOState m_lastUsedFBO;
|
MetalActiveFBOState m_lastUsedFBO;
|
||||||
|
bool m_fboChanged = false;
|
||||||
|
|
||||||
size_t m_vertexBufferOffsets[MAX_MTL_VERTEX_BUFFERS];
|
size_t m_vertexBufferOffsets[MAX_MTL_VERTEX_BUFFERS];
|
||||||
class LatteTextureViewMtl* m_textures[LATTE_NUM_MAX_TEX_UNITS * 3] = {nullptr};
|
class LatteTextureViewMtl* m_textures[LATTE_NUM_MAX_TEX_UNITS * 3] = {nullptr};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue