speed up render pass change check

This commit is contained in:
Samuliak 2025-01-25 20:23:22 +01:00
parent af08521676
commit 0c216e40e0
No known key found for this signature in database
2 changed files with 20 additions and 11 deletions

View file

@ -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;
}
} }
} }

View file

@ -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};