diff --git a/DepthBuffer.cpp b/DepthBuffer.cpp index 5a8a4fa7..e848414f 100644 --- a/DepthBuffer.cpp +++ b/DepthBuffer.cpp @@ -123,19 +123,31 @@ void DepthBuffer::initDepthBufferTexture(FrameBuffer * _pBuffer) #else const GLenum format = GL_DEPTH_COMPONENT24_OES; #endif - glBindTexture( GL_TEXTURE_2D, m_pDepthBufferTexture->glName ); - if (_pBuffer != NULL) - glTexImage2D(GL_TEXTURE_2D, 0, format, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); - else - glTexImage2D(GL_TEXTURE_2D, 0, format, video().getWidth(), video().getHeight(), 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + if (config.video.multisampling != 0) { + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_pDepthBufferTexture->glName); + if (_pBuffer != NULL) + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, config.video.multisampling, GL_DEPTH_COMPONENT, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight, false); + else + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, config.video.multisampling, GL_DEPTH_COMPONENT, video().getWidth(), video().getHeight(), false); + } + else { + glBindTexture(GL_TEXTURE_2D, m_pDepthBufferTexture->glName); + if (_pBuffer != NULL) + glTexImage2D(GL_TEXTURE_2D, 0, format, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + else + glTexImage2D(GL_TEXTURE_2D, 0, format, video().getWidth(), video().getHeight(), 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } glBindTexture( GL_TEXTURE_2D, 0); } void DepthBuffer::setDepthAttachment() { - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_pDepthBufferTexture->glName, 0); + if (config.video.multisampling != 0) + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, m_pDepthBufferTexture->glName, 0); + else + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_pDepthBufferTexture->glName, 0); } void DepthBuffer::activateDepthBufferTexture() { diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index 360c0b22..5c3b71e2 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -263,16 +263,24 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt buffer.m_pTexture->textureBytes = buffer.m_pTexture->realWidth * buffer.m_pTexture->realHeight * 4; textureCache().addFrameBufferTextureSize(buffer.m_pTexture->textureBytes); - glBindTexture( GL_TEXTURE_2D, buffer.m_pTexture->glName ); - if (_size > G_IM_SIZ_8b) - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - else - glTexImage2D(GL_TEXTURE_2D, 0, monohromeInternalformat, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, 0, monohromeformat, GL_UNSIGNED_BYTE, NULL); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, buffer.m_FBO); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer.m_pTexture->glName, 0); + + if (config.video.multisampling != 0 && _size > G_IM_SIZ_8b) { + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, buffer.m_pTexture->glName); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, config.video.multisampling, GL_RGBA8, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, false); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, buffer.m_pTexture->glName, 0); + } else { + glBindTexture(GL_TEXTURE_2D, buffer.m_pTexture->glName); + if (_size > G_IM_SIZ_8b) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + else + glTexImage2D(GL_TEXTURE_2D, 0, monohromeInternalformat, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, 0, monohromeformat, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer.m_pTexture->glName, 0); + } m_pCurrent = &buffer; } @@ -405,9 +413,8 @@ void FrameBufferList::renderBuffer(u32 _address) srcY1 = srcY0 + VI.real_height; } -#if 1 + PostProcessor::get().process(pBuffer); -#endif // glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight()); glDisable(GL_SCISSOR_TEST); @@ -419,12 +426,14 @@ void FrameBufferList::renderBuffer(u32 _address) const float srcScaleY = ogl.getScaleY(); const GLint hOffset = (ogl.getScreenWidth() - ogl.getWidth()) / 2; GLint vOffset = (ogl.getScreenHeight() - ogl.getHeight()) / 2; + const GLenum filter = config.video.multisampling != 0 ? GL_NEAREST : GL_LINEAR; + if (!ogl.isFullscreen()) vOffset += ogl.getHeightOffset(); glBlitFramebuffer( 0, (GLint)(srcY0*srcScaleY), ogl.getWidth(), (GLint)(srcY1*srcScaleY), hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + ogl.getWidth(), vOffset + (GLint)(dstY1*dstScaleY), - GL_COLOR_BUFFER_BIT, GL_LINEAR + GL_COLOR_BUFFER_BIT, filter ); if (dstPartHeight > 0) { @@ -439,7 +448,7 @@ void FrameBufferList::renderBuffer(u32 _address) glBlitFramebuffer( 0, (GLint)(srcY0*srcScaleY), ogl.getWidth(), (GLint)(srcY1*srcScaleY), hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + ogl.getWidth(), vOffset + (GLint)(dstY1*dstScaleY), - GL_COLOR_BUFFER_BIT, GL_LINEAR + GL_COLOR_BUFFER_BIT, filter ); } } diff --git a/windows/GLFunctions.cpp b/windows/GLFunctions.cpp index c216dfb3..5f52ca7c 100644 --- a/windows/GLFunctions.cpp +++ b/windows/GLFunctions.cpp @@ -42,6 +42,7 @@ PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; @@ -99,6 +100,7 @@ void initGLFunctions() glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress( "glDeleteFramebuffers" ); glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress( "glGenFramebuffers" ); glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress( "glFramebufferTexture2D" ); + glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)wglGetProcAddress("glTexImage2DMultisample"); glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress( "glGenRenderbuffers" ); glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress( "glBindRenderbuffer" ); glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress( "glRenderbufferStorage" ); diff --git a/windows/GLFunctions.h b/windows/GLFunctions.h index 021e731f..61c23141 100644 --- a/windows/GLFunctions.h +++ b/windows/GLFunctions.h @@ -40,6 +40,7 @@ extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;