summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/FramebufferManager.cpp
diff options
context:
space:
mode:
authorTellowKrinkle <tellowkrinkle@gmail.com>2022-06-21 02:07:35 -0500
committerTellowKrinkle <tellowkrinkle@gmail.com>2022-07-21 20:44:19 -0500
commit6ee0248eab7622d2db19f28f120b447b5db11379 (patch)
treef1c1001e82f488ed774bdf04f44613b2875e99be /Source/Core/VideoCommon/FramebufferManager.cpp
parentc0fd1281713f0ffe8bcfb628f8d328c7a1b5ae09 (diff)
VideoBackends:Metal: MSAA support
Diffstat (limited to 'Source/Core/VideoCommon/FramebufferManager.cpp')
-rw-r--r--Source/Core/VideoCommon/FramebufferManager.cpp52
1 files changed, 47 insertions, 5 deletions
diff --git a/Source/Core/VideoCommon/FramebufferManager.cpp b/Source/Core/VideoCommon/FramebufferManager.cpp
index d4fdfd0ff2..76c265c76a 100644
--- a/Source/Core/VideoCommon/FramebufferManager.cpp
+++ b/Source/Core/VideoCommon/FramebufferManager.cpp
@@ -188,12 +188,23 @@ bool FramebufferManager::CreateEFBFramebuffer()
// Create resolved textures if MSAA is on
if (g_ActiveConfig.MultisamplingEnabled())
{
+ u32 flags = 0;
+ if (!g_ActiveConfig.backend_info.bSupportsPartialMultisampleResolve)
+ flags |= AbstractTextureFlag_RenderTarget;
m_efb_resolve_color_texture = g_renderer->CreateTexture(
TextureConfig(efb_color_texture_config.width, efb_color_texture_config.height, 1,
- efb_color_texture_config.layers, 1, efb_color_texture_config.format, 0),
+ efb_color_texture_config.layers, 1, efb_color_texture_config.format, flags),
"EFB color resolve texture");
if (!m_efb_resolve_color_texture)
return false;
+
+ if (!g_ActiveConfig.backend_info.bSupportsPartialMultisampleResolve)
+ {
+ m_efb_color_resolve_framebuffer =
+ g_renderer->CreateFramebuffer(m_efb_resolve_color_texture.get(), nullptr);
+ if (!m_efb_color_resolve_framebuffer)
+ return false;
+ }
}
// We also need one to convert the D24S8 to R32F if that is being used (Adreno).
@@ -248,12 +259,27 @@ AbstractTexture* FramebufferManager::ResolveEFBColorTexture(const MathUtil::Rect
clamped_region.ClampUL(0, 0, GetEFBWidth(), GetEFBHeight());
// Resolve to our already-created texture.
- for (u32 layer = 0; layer < GetEFBLayers(); layer++)
+ if (g_ActiveConfig.backend_info.bSupportsPartialMultisampleResolve)
{
- m_efb_resolve_color_texture->ResolveFromTexture(m_efb_color_texture.get(), clamped_region,
- layer, 0);
+ for (u32 layer = 0; layer < GetEFBLayers(); layer++)
+ {
+ m_efb_resolve_color_texture->ResolveFromTexture(m_efb_color_texture.get(), clamped_region,
+ layer, 0);
+ }
+ }
+ else
+ {
+ m_efb_color_texture->FinishedRendering();
+ g_renderer->BeginUtilityDrawing();
+ g_renderer->SetAndDiscardFramebuffer(m_efb_color_resolve_framebuffer.get());
+ g_renderer->SetPipeline(m_efb_color_resolve_pipeline.get());
+ g_renderer->SetTexture(0, m_efb_color_texture.get());
+ g_renderer->SetSamplerState(0, RenderState::GetPointSamplerState());
+ g_renderer->SetViewportAndScissor(clamped_region);
+ g_renderer->Draw(0, 3);
+ m_efb_resolve_color_texture->FinishedRendering();
+ g_renderer->EndUtilityDrawing();
}
-
m_efb_resolve_color_texture->FinishedRendering();
return m_efb_resolve_color_texture.get();
}
@@ -487,6 +513,22 @@ bool FramebufferManager::CompileReadbackPipelines()
m_efb_depth_resolve_pipeline = g_renderer->CreatePipeline(config);
if (!m_efb_depth_resolve_pipeline)
return false;
+
+ if (!g_ActiveConfig.backend_info.bSupportsPartialMultisampleResolve)
+ {
+ config.framebuffer_state.color_texture_format = GetEFBColorFormat();
+ auto color_resolve_shader = g_renderer->CreateShaderFromSource(
+ ShaderStage::Pixel,
+ FramebufferShaderGen::GenerateResolveColorPixelShader(GetEFBSamples()),
+ "Color resolve pixel shader");
+ if (!color_resolve_shader)
+ return false;
+
+ config.pixel_shader = color_resolve_shader.get();
+ m_efb_color_resolve_pipeline = g_renderer->CreatePipeline(config);
+ if (!m_efb_color_resolve_pipeline)
+ return false;
+ }
}
// EFB restore pipeline