diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index 791c4bda9..e2a2a2d15 100755 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -1454,6 +1454,40 @@ FragmentColor* OpenGLRenderer::GetFramebuffer() return (this->willFlipAndConvertFramebufferOnGPU && this->isPBOSupported) ? this->_mappedFramebuffer : GPU->GetEngineMain()->Get3DFramebufferMain(); } + +GLsizei OpenGLRenderer::GetLimitedMultisampleSize() const +{ + GLsizei deviceMultisamples = this->_deviceInfo.maxSamples; + GLsizei maxMultisamples = OGLMaxMultisamples_Tier1; + + if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * OGLMaxMultisamplesScaleLimit_Tier1) && + (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * OGLMaxMultisamplesScaleLimit_Tier1) ) + { + maxMultisamples = OGLMaxMultisamples_Tier1; + } + else if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * OGLMaxMultisamplesScaleLimit_Tier2) && + (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * OGLMaxMultisamplesScaleLimit_Tier2) ) + { + maxMultisamples = OGLMaxMultisamples_Tier2; + } + else if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * OGLMaxMultisamplesScaleLimit_Tier3) && + (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * OGLMaxMultisamplesScaleLimit_Tier3) ) + { + maxMultisamples = OGLMaxMultisamples_Tier3; + } + else + { + maxMultisamples = OGLMaxMultisamples_Tier4; + } + + if (deviceMultisamples > maxMultisamples) + { + deviceMultisamples = maxMultisamples; + } + + return deviceMultisamples; +} + OpenGLTexture* OpenGLRenderer::GetLoadedTextureFromPolygon(const POLY &thePoly, bool enableTexturing) { OpenGLTexture *theTexture = (OpenGLTexture *)texCache.GetTexture(thePoly.texParam, thePoly.texPalette); @@ -1878,31 +1912,9 @@ Render3DError OpenGLRenderer_1_2::InitExtensions() if (maxSamplesOGL >= 2) { - GLint maxMultisamples = OGLMaxMultisamples_Tier1; + GLsizei sampleSize = this->GetLimitedMultisampleSize(); - if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH) && (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT) ) - { - maxMultisamples = OGLMaxMultisamples_Tier1; - } - else if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 2) && (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2) ) - { - maxMultisamples = OGLMaxMultisamples_Tier2; - } - else if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 8) && (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 8) ) - { - maxMultisamples = OGLMaxMultisamples_Tier3; - } - else - { - maxMultisamples = OGLMaxMultisamples_Tier4; - } - - if (maxSamplesOGL > maxMultisamples) - { - maxSamplesOGL = maxMultisamples; - } - - error = this->CreateMultisampledFBO(maxSamplesOGL); + error = this->CreateMultisampledFBO(sampleSize); if (error != OGLERROR_NOERR) { this->isMultisampledFBOSupported = false; @@ -4469,41 +4481,18 @@ Render3DError OpenGLRenderer_1_2::SetFramebufferSize(size_t w, size_t h) if (this->isMultisampledFBOSupported) { - GLsizei maxSamplesOGL = (GLsizei)this->_deviceInfo.maxSamples; - GLint maxMultisamples = OGLMaxMultisamples_Tier1; - - if ( (w <= GPU_FRAMEBUFFER_NATIVE_WIDTH) && (h <= GPU_FRAMEBUFFER_NATIVE_HEIGHT) ) - { - maxMultisamples = OGLMaxMultisamples_Tier1; - } - else if ( (w <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 2) && (h <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2) ) - { - maxMultisamples = OGLMaxMultisamples_Tier2; - } - else if ( (w <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 8) && (h <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 8) ) - { - maxMultisamples = OGLMaxMultisamples_Tier3; - } - else - { - maxMultisamples = OGLMaxMultisamples_Tier4; - } - - if (maxSamplesOGL > maxMultisamples) - { - maxSamplesOGL = maxMultisamples; - } + GLsizei sampleSize = this->GetLimitedMultisampleSize(); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSGColorID); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamplesOGL, GL_RGBA, w, h); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleSize, GL_RGBA, w, h); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSGPolyID); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamplesOGL, GL_RGBA, w, h); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleSize, GL_RGBA, w, h); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSGFogAttrID); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamplesOGL, GL_RGBA, w, h); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleSize, GL_RGBA, w, h); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSGDepthStencilID); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamplesOGL, GL_DEPTH24_STENCIL8_EXT, w, h); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleSize, GL_DEPTH24_STENCIL8_EXT, w, h); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, OGLRef.rboMSGDepthStencilAlphaID); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, maxSamplesOGL, GL_DEPTH24_STENCIL8_EXT, w, h); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, sampleSize, GL_DEPTH24_STENCIL8_EXT, w, h); } const size_t newFramebufferColorSizeBytes = w * h * sizeof(FragmentColor); diff --git a/desmume/src/OGLRender.h b/desmume/src/OGLRender.h index 347803c84..596b3a28f 100755 --- a/desmume/src/OGLRender.h +++ b/desmume/src/OGLRender.h @@ -284,10 +284,17 @@ EXTERNOGLEXT(PFNGLTEXBUFFERPROC, glTexBuffer) // Core in v3.1 enum OGLMaxMultisamples { - OGLMaxMultisamples_Tier1 = 32, - OGLMaxMultisamples_Tier2 = 16, - OGLMaxMultisamples_Tier3 = 8, - OGLMaxMultisamples_Tier4 = 4, + OGLMaxMultisamples_Tier1 = 32, + OGLMaxMultisamples_Tier2 = 16, + OGLMaxMultisamples_Tier3 = 8, + OGLMaxMultisamples_Tier4 = 4, +}; + +enum OGLMaxMultisamplesScaleLimit +{ + OGLMaxMultisamplesScaleLimit_Tier1 = 1, + OGLMaxMultisamplesScaleLimit_Tier2 = 4, + OGLMaxMultisamplesScaleLimit_Tier3 = 8 }; enum OGLVertexAttributeID @@ -717,6 +724,7 @@ public: void SetVersion(unsigned int major, unsigned int minor, unsigned int revision); virtual FragmentColor* GetFramebuffer(); + virtual GLsizei GetLimitedMultisampleSize() const; }; class OpenGLRenderer_1_2 : public OpenGLRenderer diff --git a/desmume/src/OGLRender_3_2.cpp b/desmume/src/OGLRender_3_2.cpp index c6dd267b8..9885d0553 100644 --- a/desmume/src/OGLRender_3_2.cpp +++ b/desmume/src/OGLRender_3_2.cpp @@ -703,31 +703,9 @@ Render3DError OpenGLRenderer_3_2::InitExtensions() if (maxSamplesOGL >= 2) { - GLint maxMultisamples = OGLMaxMultisamples_Tier1; + GLsizei sampleSize = this->GetLimitedMultisampleSize(); - if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH) && (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT) ) - { - maxMultisamples = OGLMaxMultisamples_Tier1; - } - else if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 2) && (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2) ) - { - maxMultisamples = OGLMaxMultisamples_Tier2; - } - else if ( (this->_framebufferWidth <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 8) && (this->_framebufferHeight <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 8) ) - { - maxMultisamples = OGLMaxMultisamples_Tier3; - } - else - { - maxMultisamples = OGLMaxMultisamples_Tier4; - } - - if (maxSamplesOGL > maxMultisamples) - { - maxSamplesOGL = maxMultisamples; - } - - error = this->CreateMultisampledFBO(maxSamplesOGL); + error = this->CreateMultisampledFBO(sampleSize); if (error != OGLERROR_NOERR) { this->isMultisampledFBOSupported = false; @@ -2026,50 +2004,27 @@ Render3DError OpenGLRenderer_3_2::SetFramebufferSize(size_t w, size_t h) if (this->isMultisampledFBOSupported) { - GLsizei maxSamplesOGL = (GLsizei)this->_deviceInfo.maxSamples; - GLint maxMultisamples = OGLMaxMultisamples_Tier1; - - if ( (w <= GPU_FRAMEBUFFER_NATIVE_WIDTH) && (h <= GPU_FRAMEBUFFER_NATIVE_HEIGHT) ) - { - maxMultisamples = OGLMaxMultisamples_Tier1; - } - else if ( (w <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 2) && (h <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2) ) - { - maxMultisamples = OGLMaxMultisamples_Tier2; - } - else if ( (w <= GPU_FRAMEBUFFER_NATIVE_WIDTH * 8) && (h <= GPU_FRAMEBUFFER_NATIVE_HEIGHT * 8) ) - { - maxMultisamples = OGLMaxMultisamples_Tier3; - } - else - { - maxMultisamples = OGLMaxMultisamples_Tier4; - } - - if (maxSamplesOGL > maxMultisamples) - { - maxSamplesOGL = maxMultisamples; - } + GLsizei sampleSize = this->GetLimitedMultisampleSize(); if (this->willUsePerSampleZeroDstPass) { glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, OGLRef.texMSGColorID); - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, maxSamplesOGL, GL_RGBA, w, h, GL_TRUE); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleSize, GL_RGBA, w, h, GL_TRUE); } else { glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSGColorID); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamplesOGL, GL_RGBA, w, h); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleSize, GL_RGBA, w, h); } glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSGPolyID); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamplesOGL, GL_RGBA, w, h); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleSize, GL_RGBA, w, h); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSGFogAttrID); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamplesOGL, GL_RGBA, w, h); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleSize, GL_RGBA, w, h); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSGDepthStencilID); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamplesOGL, GL_DEPTH24_STENCIL8, w, h); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleSize, GL_DEPTH24_STENCIL8, w, h); glBindRenderbuffer(GL_RENDERBUFFER, OGLRef.rboMSGDepthStencilAlphaID); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamplesOGL, GL_DEPTH24_STENCIL8, w, h); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleSize, GL_DEPTH24_STENCIL8, w, h); } glBindTexture(GL_TEXTURE_2D, OGLRef.texGDepthStencilAlphaID);