From 330603e2b67c5aacdfd8388e614fb50168409254 Mon Sep 17 00:00:00 2001 From: gonetz Date: Wed, 23 Dec 2015 16:21:55 +0600 Subject: [PATCH] PostProcessor refactor: - rename process() to doBlur(). - move Blur() init and destroy to separate functions. --- src/FrameBuffer.cpp | 8 ++++---- src/FrameBuffer.h | 2 +- src/OpenGL.cpp | 3 +-- src/PostProcessor.cpp | 22 +++++++++++++++++----- src/PostProcessor.h | 6 +++++- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index 523d0b0c..d54045f8 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -97,7 +97,7 @@ FrameBuffer::FrameBuffer() : m_scaleX(0), m_scaleY(0), m_copiedToRdram(false), m_fingerprint(false), m_cleared(false), m_changed(false), m_cfb(false), m_isDepthBuffer(false), m_isPauseScreen(false), m_isOBScreen(false), m_needHeightCorrection(false), - m_postProcessed(false), m_pLoadTile(NULL), + m_postProcessed(0), m_pLoadTile(NULL), m_pDepthBuffer(NULL), m_pResolveTexture(NULL), m_resolveFBO(0), m_resolved(false) { m_pTexture = textureCache().addFrameBufferTexture(); @@ -545,7 +545,7 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt m_pCurrent->m_isDepthBuffer = _address == gDP.depthImageAddress; m_pCurrent->m_isPauseScreen = m_pCurrent->m_isOBScreen = false; - m_pCurrent->m_postProcessed = false; + m_pCurrent->m_postProcessed = 0; } void FrameBufferList::copyAux() @@ -739,7 +739,7 @@ void FrameBufferList::renderBuffer(u32 _address) #endif // GLESX render.updateScissor(pBuffer); - PostProcessor::get().process(pBuffer); + PostProcessor::get().doBlur(pBuffer); // glDisable(GL_SCISSOR_TEST) does not affect glBlitFramebuffer, at least on AMD glScissor(0, 0, ogl.getScreenWidth(), ogl.getScreenHeight() + ogl.getHeightOffset()); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); @@ -804,7 +804,7 @@ void FrameBufferList::renderBuffer(u32 _address) OGLVideo & ogl = video(); ogl.getRender().updateScissor(pBuffer); - PostProcessor::get().process(pBuffer); + PostProcessor::get().doBlur(pBuffer); ogl.getRender().dropRenderState(); gSP.changed = gDP.changed = 0; diff --git a/src/FrameBuffer.h b/src/FrameBuffer.h index c146e5ac..b6903fb0 100644 --- a/src/FrameBuffer.h +++ b/src/FrameBuffer.h @@ -36,7 +36,7 @@ struct FrameBuffer bool m_isPauseScreen; bool m_isOBScreen; bool m_needHeightCorrection; - bool m_postProcessed; + u32 m_postProcessed; GLuint m_FBO; gDPTile *m_pLoadTile; diff --git a/src/OpenGL.cpp b/src/OpenGL.cpp index aa59e054..3c67ec97 100644 --- a/src/OpenGL.cpp +++ b/src/OpenGL.cpp @@ -1393,8 +1393,7 @@ void OGLRender::_initData() Combiner_Init(); TextDrawer::get().init(); TFH.init(); - if (config.bloomFilter.enable != 0) - PostProcessor::get().init(); + PostProcessor::get().init(); m_renderState = rsNone; gSP.changed = gDP.changed = 0xFFFFFFFF; diff --git a/src/PostProcessor.cpp b/src/PostProcessor.cpp index 1279c0e4..f1f8b867 100644 --- a/src/PostProcessor.cpp +++ b/src/PostProcessor.cpp @@ -297,7 +297,7 @@ GLuint _createFBO(CachedTexture * _pTexture) return FBO; } -void PostProcessor::init() +void PostProcessor::_initBlur() { m_pTextureOriginal = _createTexture(); m_FBO_original = _createFBO(m_pTextureOriginal); @@ -362,7 +362,13 @@ void PostProcessor::init() glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } -void PostProcessor::destroy() +void PostProcessor::init() +{ + if (config.bloomFilter.enable != 0) + _initBlur(); +} + +void PostProcessor::_destroyBlur() { if (m_copyProgram != 0) glDeleteProgram(m_copyProgram); @@ -401,6 +407,12 @@ void PostProcessor::destroy() m_pTextureBlur = NULL; } + +void PostProcessor::destroy() +{ + _destroyBlur(); +} + PostProcessor & PostProcessor::get() { static PostProcessor processor; @@ -431,15 +443,15 @@ void _setGLState() { gDP.changed |= CHANGED_RENDERMODE; } -void PostProcessor::process(FrameBuffer * _pBuffer) +void PostProcessor::doBlur(FrameBuffer * _pBuffer) { if (config.bloomFilter.enable == 0) return; - if (_pBuffer == NULL || _pBuffer->m_postProcessed) + if (_pBuffer == NULL || (_pBuffer->m_postProcessed&PostProcessor::postEffectBlur) == PostProcessor::postEffectBlur) return; - _pBuffer->m_postProcessed = true; + _pBuffer->m_postProcessed |= PostProcessor::postEffectBlur; _setGLState(); OGLVideo & ogl = video(); diff --git a/src/PostProcessor.h b/src/PostProcessor.h index 130b1b20..3b8eb00a 100644 --- a/src/PostProcessor.h +++ b/src/PostProcessor.h @@ -10,16 +10,20 @@ public: void init(); void destroy(); - void process(FrameBuffer * _pBuffer); + void doBlur(FrameBuffer * _pBuffer); static PostProcessor & get(); + static const u32 postEffectBlur = 1U; + private: PostProcessor() : m_extractBloomProgram(0), m_seperableBlurProgram(0), m_glowProgram(0), m_bloomProgram(0), m_copyProgram(0), m_FBO_original(0), m_FBO_glowMap(0), m_FBO_blur(0), m_pTextureOriginal(NULL), m_pTextureGlowMap(NULL), m_pTextureBlur(NULL) {} PostProcessor(const PostProcessor & _other); + void _initBlur(); + void _destroyBlur(); GLuint m_extractBloomProgram; GLuint m_seperableBlurProgram;