mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Implement FBO multisampling.
This commit is contained in:
parent
61414cd1c6
commit
10c4fb801c
|
@ -123,6 +123,14 @@ void DepthBuffer::initDepthBufferTexture(FrameBuffer * _pBuffer)
|
||||||
#else
|
#else
|
||||||
const GLenum format = GL_DEPTH_COMPONENT24_OES;
|
const GLenum format = GL_DEPTH_COMPONENT24_OES;
|
||||||
#endif
|
#endif
|
||||||
|
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);
|
glBindTexture(GL_TEXTURE_2D, m_pDepthBufferTexture->glName);
|
||||||
if (_pBuffer != NULL)
|
if (_pBuffer != NULL)
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, format, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, format, _pBuffer->m_pTexture->realWidth, _pBuffer->m_pTexture->realHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
|
||||||
|
@ -131,11 +139,15 @@ void DepthBuffer::initDepthBufferTexture(FrameBuffer * _pBuffer)
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
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_MIN_FILTER, GL_NEAREST);
|
||||||
|
}
|
||||||
glBindTexture( GL_TEXTURE_2D, 0);
|
glBindTexture( GL_TEXTURE_2D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DepthBuffer::setDepthAttachment() {
|
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() {
|
void DepthBuffer::activateDepthBufferTexture() {
|
||||||
|
|
|
@ -263,6 +263,14 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
|
||||||
buffer.m_pTexture->textureBytes = buffer.m_pTexture->realWidth * buffer.m_pTexture->realHeight * 4;
|
buffer.m_pTexture->textureBytes = buffer.m_pTexture->realWidth * buffer.m_pTexture->realHeight * 4;
|
||||||
textureCache().addFrameBufferTextureSize(buffer.m_pTexture->textureBytes);
|
textureCache().addFrameBufferTextureSize(buffer.m_pTexture->textureBytes);
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, buffer.m_FBO);
|
||||||
|
|
||||||
|
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);
|
glBindTexture(GL_TEXTURE_2D, buffer.m_pTexture->glName);
|
||||||
if (_size > G_IM_SIZ_8b)
|
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);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
@ -270,9 +278,9 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, monohromeInternalformat, buffer.m_pTexture->realWidth, buffer.m_pTexture->realHeight, 0, monohromeformat, GL_UNSIGNED_BYTE, NULL);
|
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_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer.m_pTexture->glName, 0);
|
||||||
|
}
|
||||||
m_pCurrent = &buffer;
|
m_pCurrent = &buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,9 +413,8 @@ void FrameBufferList::renderBuffer(u32 _address)
|
||||||
srcY1 = srcY0 + VI.real_height;
|
srcY1 = srcY0 + VI.real_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
PostProcessor::get().process(pBuffer);
|
PostProcessor::get().process(pBuffer);
|
||||||
#endif
|
|
||||||
// glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD
|
// glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD
|
||||||
glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight());
|
glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight());
|
||||||
glDisable(GL_SCISSOR_TEST);
|
glDisable(GL_SCISSOR_TEST);
|
||||||
|
@ -419,12 +426,14 @@ void FrameBufferList::renderBuffer(u32 _address)
|
||||||
const float srcScaleY = ogl.getScaleY();
|
const float srcScaleY = ogl.getScaleY();
|
||||||
const GLint hOffset = (ogl.getScreenWidth() - ogl.getWidth()) / 2;
|
const GLint hOffset = (ogl.getScreenWidth() - ogl.getWidth()) / 2;
|
||||||
GLint vOffset = (ogl.getScreenHeight() - ogl.getHeight()) / 2;
|
GLint vOffset = (ogl.getScreenHeight() - ogl.getHeight()) / 2;
|
||||||
|
const GLenum filter = config.video.multisampling != 0 ? GL_NEAREST : GL_LINEAR;
|
||||||
|
|
||||||
if (!ogl.isFullscreen())
|
if (!ogl.isFullscreen())
|
||||||
vOffset += ogl.getHeightOffset();
|
vOffset += ogl.getHeightOffset();
|
||||||
glBlitFramebuffer(
|
glBlitFramebuffer(
|
||||||
0, (GLint)(srcY0*srcScaleY), ogl.getWidth(), (GLint)(srcY1*srcScaleY),
|
0, (GLint)(srcY0*srcScaleY), ogl.getWidth(), (GLint)(srcY1*srcScaleY),
|
||||||
hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + ogl.getWidth(), vOffset + (GLint)(dstY1*dstScaleY),
|
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) {
|
if (dstPartHeight > 0) {
|
||||||
|
@ -439,7 +448,7 @@ void FrameBufferList::renderBuffer(u32 _address)
|
||||||
glBlitFramebuffer(
|
glBlitFramebuffer(
|
||||||
0, (GLint)(srcY0*srcScaleY), ogl.getWidth(), (GLint)(srcY1*srcScaleY),
|
0, (GLint)(srcY0*srcScaleY), ogl.getWidth(), (GLint)(srcY1*srcScaleY),
|
||||||
hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + ogl.getWidth(), vOffset + (GLint)(dstY1*dstScaleY),
|
hOffset, vOffset + (GLint)(dstY0*dstScaleY), hOffset + ogl.getWidth(), vOffset + (GLint)(dstY1*dstScaleY),
|
||||||
GL_COLOR_BUFFER_BIT, GL_LINEAR
|
GL_COLOR_BUFFER_BIT, filter
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
||||||
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
||||||
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
||||||
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
||||||
|
PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
|
||||||
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
|
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
|
||||||
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
|
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
|
||||||
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
|
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
|
||||||
|
@ -99,6 +100,7 @@ void initGLFunctions()
|
||||||
glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress( "glDeleteFramebuffers" );
|
glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress( "glDeleteFramebuffers" );
|
||||||
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress( "glGenFramebuffers" );
|
glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress( "glGenFramebuffers" );
|
||||||
glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress( "glFramebufferTexture2D" );
|
glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress( "glFramebufferTexture2D" );
|
||||||
|
glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)wglGetProcAddress("glTexImage2DMultisample");
|
||||||
glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress( "glGenRenderbuffers" );
|
glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress( "glGenRenderbuffers" );
|
||||||
glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress( "glBindRenderbuffer" );
|
glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress( "glBindRenderbuffer" );
|
||||||
glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress( "glRenderbufferStorage" );
|
glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress( "glRenderbufferStorage" );
|
||||||
|
|
|
@ -40,6 +40,7 @@ extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
||||||
extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
||||||
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
||||||
extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
||||||
|
extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
|
||||||
extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
|
extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
|
||||||
extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
|
extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
|
||||||
extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
|
extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user