1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-04 10:03:36 +00:00

PostProcessor: do not copy original texture if AA is off.

This commit is contained in:
Sergey Lipskiy 2016-04-02 18:21:03 +06:00
parent 427806ac23
commit fcf7c051a2
2 changed files with 28 additions and 58 deletions

View File

@ -42,27 +42,6 @@ SHADER_VERSION
"} \n" "} \n"
; ;
static const char* copyShader =
SHADER_VERSION
"#if (__VERSION__ > 120) \n"
"# define IN in \n"
"# define OUT out \n"
"# define texture2D texture \n"
"#else \n"
"# define IN varying \n"
"# define OUT \n"
"#endif // __VERSION __ \n"
"IN mediump vec2 vTexCoord; \n"
"uniform sampler2D Sample0; \n"
"OUT lowp vec4 fragColor; \n"
" \n"
"void main() \n"
"{ \n"
" fragColor = texture2D(Sample0, vTexCoord); \n"
FRAGMENT_SHADER_END
"} \n"
;
static const char* extractBloomShader = static const char* extractBloomShader =
SHADER_VERSION SHADER_VERSION
"#if (__VERSION__ > 120) \n" "#if (__VERSION__ > 120) \n"
@ -337,35 +316,28 @@ PostProcessor::PostProcessor()
, m_seperableBlurProgram(0) , m_seperableBlurProgram(0)
, m_glowProgram(0) , m_glowProgram(0)
, m_bloomProgram(0) , m_bloomProgram(0)
, m_copyProgram(0)
, m_gammaCorrectionProgram(0) , m_gammaCorrectionProgram(0)
, m_pResultBuffer(nullptr) , m_pResultBuffer(nullptr)
, m_FBO_original(0) , m_FBO_resolved(0)
, m_FBO_glowMap(0) , m_FBO_glowMap(0)
, m_FBO_blur(0) , m_FBO_blur(0)
, m_pTextureOriginal(nullptr) , m_pTextureOriginal(nullptr)
, m_pTextureResolved(nullptr)
, m_pTextureGlowMap(nullptr) , m_pTextureGlowMap(nullptr)
, m_pTextureBlur(nullptr) , m_pTextureBlur(nullptr)
{} {}
void PostProcessor::_initCommon() void PostProcessor::_initCommon()
{ {
m_pTextureOriginal = _createTexture(); if (config.video.multisampling != 0) {
m_FBO_original = _createFBO(m_pTextureOriginal); m_pTextureResolved = _createTexture();
m_FBO_resolved = _createFBO(m_pTextureResolved);
}
m_pResultBuffer = new FrameBuffer(); m_pResultBuffer = new FrameBuffer();
_initTexture(m_pResultBuffer->m_pTexture); _initTexture(m_pResultBuffer->m_pTexture);
_initFBO(m_pResultBuffer->m_FBO, m_pResultBuffer->m_pTexture); _initFBO(m_pResultBuffer->m_FBO, m_pResultBuffer->m_pTexture);
#ifdef GLES2
m_copyProgram = _createShaderProgram(vertexShader, copyShader);
glUseProgram(m_copyProgram);
int loc = glGetUniformLocation(m_copyProgram, "Sample0");
assert(loc >= 0);
glUniform1i(loc, 0);
glUseProgram(0);
#endif
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
} }
@ -446,20 +418,18 @@ void PostProcessor::init()
void PostProcessor::_destroyCommon() void PostProcessor::_destroyCommon()
{ {
if (m_copyProgram != 0) if (m_FBO_resolved != 0)
glDeleteProgram(m_copyProgram); glDeleteFramebuffers(1, &m_FBO_resolved);
m_copyProgram = 0; m_FBO_resolved = 0;
if (m_FBO_original != 0) if (m_pTextureResolved != nullptr)
glDeleteFramebuffers(1, &m_FBO_original); textureCache().removeFrameBufferTexture(m_pTextureResolved);
m_FBO_original = 0; m_pTextureResolved = nullptr;
if (m_pTextureOriginal != nullptr)
textureCache().removeFrameBufferTexture(m_pTextureOriginal);
m_pTextureOriginal = nullptr;
delete m_pResultBuffer; delete m_pResultBuffer;
m_pResultBuffer = nullptr; m_pResultBuffer = nullptr;
m_pTextureOriginal = nullptr;
} }
void PostProcessor::_destroyGammaCorrection() void PostProcessor::_destroyGammaCorrection()
@ -554,19 +524,19 @@ void PostProcessor::_preDraw(FrameBuffer * _pBuffer)
m_pResultBuffer->m_height = _pBuffer->m_height; m_pResultBuffer->m_height = _pBuffer->m_height;
m_pResultBuffer->m_scaleX = _pBuffer->m_scaleX; m_pResultBuffer->m_scaleX = _pBuffer->m_scaleX;
m_pResultBuffer->m_scaleY = _pBuffer->m_scaleY; m_pResultBuffer->m_scaleY = _pBuffer->m_scaleY;
m_pTextureOriginal = _pBuffer->m_pTexture;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_original);
textureCache().activateTexture(0, _pBuffer->m_pTexture);
glUseProgram(m_copyProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
#else #else
glBindFramebuffer(GL_READ_FRAMEBUFFER, _pBuffer->m_FBO); if (config.video.multisampling != 0) {
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_original); glBindFramebuffer(GL_READ_FRAMEBUFFER, _pBuffer->m_FBO);
glBlitFramebuffer( glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_resolved);
0, 0, ogl.getWidth(), ogl.getHeight(), glBlitFramebuffer(
0, 0, ogl.getWidth(), ogl.getHeight(), 0, 0, ogl.getWidth(), ogl.getHeight(),
GL_COLOR_BUFFER_BIT, GL_LINEAR 0, 0, ogl.getWidth(), ogl.getHeight(),
); GL_COLOR_BUFFER_BIT, GL_LINEAR
);
m_pTextureOriginal = m_pTextureResolved;
} else
m_pTextureOriginal = _pBuffer->m_pTexture;
#endif #endif
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);

View File

@ -34,17 +34,17 @@ private:
GLuint m_seperableBlurProgram; GLuint m_seperableBlurProgram;
GLuint m_glowProgram; GLuint m_glowProgram;
GLuint m_bloomProgram; GLuint m_bloomProgram;
GLuint m_copyProgram;
GLuint m_gammaCorrectionProgram; GLuint m_gammaCorrectionProgram;
FrameBuffer * m_pResultBuffer; FrameBuffer * m_pResultBuffer;
GLuint m_FBO_original; GLuint m_FBO_resolved;
GLuint m_FBO_glowMap; GLuint m_FBO_glowMap;
GLuint m_FBO_blur; GLuint m_FBO_blur;
CachedTexture * m_pTextureOriginal; CachedTexture * m_pTextureOriginal;
CachedTexture * m_pTextureResolved;
CachedTexture * m_pTextureGlowMap; CachedTexture * m_pTextureGlowMap;
CachedTexture * m_pTextureBlur; CachedTexture * m_pTextureBlur;
}; };