From e150d307a675e58909b6f3cbdc3caf9e4db541d3 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 30 Apr 2014 18:48:40 +0200 Subject: [PATCH] ogl: use ARB_texture_multisample for msaa --- .../VideoBackends/OGL/FramebufferManager.cpp | 21 ++++++++----------- Source/Core/VideoBackends/OGL/Render.cpp | 6 ++++-- Source/Core/VideoBackends/OGL/Render.h | 1 + 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Source/Core/VideoBackends/OGL/FramebufferManager.cpp b/Source/Core/VideoBackends/OGL/FramebufferManager.cpp index 0deec1d3cc..782c60b745 100644 --- a/Source/Core/VideoBackends/OGL/FramebufferManager.cpp +++ b/Source/Core/VideoBackends/OGL/FramebufferManager.cpp @@ -110,24 +110,24 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms // Create EFB target renderbuffers. GLuint glObj[2]; - glGenRenderbuffers(2, glObj); + glGenTextures(2, glObj); m_efbColor = glObj[0]; m_efbDepth = glObj[1]; - glBindRenderbuffer(GL_RENDERBUFFER, m_efbColor); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_efbColor); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, false); - glBindRenderbuffer(GL_RENDERBUFFER, m_efbDepth); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_msaaSamples, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_efbDepth); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, m_msaaSamples, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, false); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); // Bind target renderbuffers to EFB framebuffer. glBindFramebuffer(GL_FRAMEBUFFER, m_efbFramebuffer); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_efbColor); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_efbDepth); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, m_efbColor, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, m_efbDepth, 0); GL_REPORT_FBO_ERROR(); @@ -237,10 +237,7 @@ FramebufferManager::~FramebufferManager() glObj[0] = m_efbColor; glObj[1] = m_efbDepth; - if (m_msaaSamples <= 1) - glDeleteTextures(2, glObj); - else - glDeleteRenderbuffers(2, glObj); + glDeleteTextures(2, glObj); m_efbColor = 0; m_efbDepth = 0; diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 3f2ca5e942..3337bbc9eb 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -455,6 +455,7 @@ Renderer::Renderer() g_ogl_config.bSupportsGLSync = GLExtensions::Supports("GL_ARB_sync"); g_ogl_config.bSupportsGLBaseVertex = GLExtensions::Supports("GL_ARB_draw_elements_base_vertex"); g_ogl_config.bSupportsGLBufferStorage = GLExtensions::Supports("GL_ARB_buffer_storage"); + g_ogl_config.bSupportsMSAA = GLExtensions::Supports("GL_ARB_texture_multisample"); g_ogl_config.bSupportSampleShading = GLExtensions::Supports("GL_ARB_sample_shading"); g_ogl_config.bSupportOGL31 = GLExtensions::Version() >= 310; g_ogl_config.bSupportViewportFloat = GLExtensions::Supports("GL_ARB_viewport_array"); @@ -530,7 +531,7 @@ Renderer::Renderer() } glGetIntegerv(GL_MAX_SAMPLES, &g_ogl_config.max_samples); - if (g_ogl_config.max_samples < 1) + if (g_ogl_config.max_samples < 1 || !g_ogl_config.bSupportsMSAA) g_ogl_config.max_samples = 1; UpdateActiveConfig(); @@ -540,7 +541,7 @@ Renderer::Renderer() g_ogl_config.gl_renderer, g_ogl_config.gl_version), 5000); - WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s", + WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s", g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ", g_ActiveConfig.backend_info.bSupportsPrimitiveRestart ? "" : "PrimitiveRestart ", g_ActiveConfig.backend_info.bSupportsEarlyZ ? "" : "EarlyZ ", @@ -549,6 +550,7 @@ Renderer::Renderer() g_ogl_config.bSupportsGLBaseVertex ? "" : "BaseVertex ", g_ogl_config.bSupportsGLBufferStorage ? "" : "BufferStorage ", g_ogl_config.bSupportsGLSync ? "" : "Sync ", + g_ogl_config.bSupportsMSAA ? "" : "MSAA ", g_ogl_config.bSupportSampleShading ? "" : "SSAA " ); diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h index 83b9bc5561..2ccc00ac0b 100644 --- a/Source/Core/VideoBackends/OGL/Render.h +++ b/Source/Core/VideoBackends/OGL/Render.h @@ -23,6 +23,7 @@ extern struct VideoConfig { bool bSupportsGLSync; bool bSupportsGLBaseVertex; bool bSupportsGLBufferStorage; + bool bSupportsMSAA; bool bSupportSampleShading; GLSL_VERSION eSupportedGLSLVersion; bool bSupportOGL31;