From 8becc0e78dbb53d9df660c0c440ce7e5c29bfb2b Mon Sep 17 00:00:00 2001 From: Christopher Bruns Date: Tue, 26 Feb 2019 21:15:13 -0800 Subject: [PATCH] Enable menu blur in stereo 3d. Use more blitting to avoid confusing framebuffer state management in stereo 3D. --- src/rendering/gl/renderer/gl_postprocess.cpp | 25 +++++++++++++------ .../gl/renderer/gl_renderbuffers.cpp | 24 +++++++++++++----- src/rendering/gl/renderer/gl_renderbuffers.h | 2 +- src/rendering/gl/system/gl_framebuffer.cpp | 4 +-- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/rendering/gl/renderer/gl_postprocess.cpp b/src/rendering/gl/renderer/gl_postprocess.cpp index d08443c574..6b8c5c2e64 100644 --- a/src/rendering/gl/renderer/gl_postprocess.cpp +++ b/src/rendering/gl/renderer/gl_postprocess.cpp @@ -120,7 +120,22 @@ void FGLRenderer::BlurScene(float gameinfobluramount) mBuffers->CompileEffectShaders(); mBuffers->UpdateEffectTextures(); - mBuffers->RenderEffect("BlurScene"); + auto vrmode = VRMode::GetVRMode(true); + if (vrmode->mEyeCount == 1) + { + mBuffers->RenderEffect("BlurScene"); + } + else + { + for (int eye_ix = 0; eye_ix < vrmode->mEyeCount; ++eye_ix) + { + FGLDebug::PushGroup("EyeBlur"); + mBuffers->BlitFromEyeTexture(eye_ix); + mBuffers->RenderEffect("BlurScene"); + mBuffers->BlitToEyeTexture(eye_ix); + FGLDebug::PopGroup(); + } + } } void FGLRenderer::ClearTonemapPalette() @@ -137,9 +152,6 @@ void FGLRenderer::ClearTonemapPalette() void FGLRenderer::Flush() { auto vrmode = VRMode::GetVRMode(true); - const auto &mSceneViewport = screen->mSceneViewport; - const auto &mScreenViewport = screen->mScreenViewport; - if (vrmode->mEyeCount == 1) { CopyToBackbuffer(nullptr, true); @@ -150,10 +162,9 @@ void FGLRenderer::Flush() for (int eye_ix = 0; eye_ix < vrmode->mEyeCount; ++eye_ix) { FGLDebug::PushGroup("Eye2D"); - mBuffers->BindEyeFB(eye_ix); - glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); - glScissor(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); + mBuffers->BlitFromEyeTexture(eye_ix); screen->Draw2D(); + mBuffers->BlitToEyeTexture(eye_ix); FGLDebug::PopGroup(); } screen->Clear2D(); diff --git a/src/rendering/gl/renderer/gl_renderbuffers.cpp b/src/rendering/gl/renderer/gl_renderbuffers.cpp index 67d083a31c..4dd9f95be3 100644 --- a/src/rendering/gl/renderer/gl_renderbuffers.cpp +++ b/src/rendering/gl/renderer/gl_renderbuffers.cpp @@ -550,6 +550,24 @@ void FGLRenderBuffers::BlitToEyeTexture(int eye) glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } +void FGLRenderBuffers::BlitFromEyeTexture(int eye) +{ + CreateEyeBuffers(eye); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mPipelineFB[mCurrentPipelineTexture].handle); + glBindFramebuffer(GL_READ_FRAMEBUFFER, mEyeFBs[eye].handle); + glBlitFramebuffer(0, 0, mWidth, mHeight, 0, 0, mWidth, mHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); + + if ((gl.flags & RFL_INVALIDATE_BUFFER) != 0) + { + GLenum attachments[2] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_STENCIL_ATTACHMENT }; + glInvalidateFramebuffer(GL_READ_FRAMEBUFFER, 2, attachments); + } + + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); +} + void FGLRenderBuffers::BindEyeTexture(int eye, int texunit) { CreateEyeBuffers(eye); @@ -557,12 +575,6 @@ void FGLRenderBuffers::BindEyeTexture(int eye, int texunit) glBindTexture(GL_TEXTURE_2D, mEyeTextures[eye].handle); } -void FGLRenderBuffers::BindEyeFB(int eye, bool readBuffer) -{ - CreateEyeBuffers(eye); - glBindFramebuffer(readBuffer ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER, mEyeFBs[eye].handle); -} - void FGLRenderBuffers::BindDitherTexture(int texunit) { if (!mDitherTexture) diff --git a/src/rendering/gl/renderer/gl_renderbuffers.h b/src/rendering/gl/renderer/gl_renderbuffers.h index 10c4e37ed3..b4b0185169 100644 --- a/src/rendering/gl/renderer/gl_renderbuffers.h +++ b/src/rendering/gl/renderer/gl_renderbuffers.h @@ -88,8 +88,8 @@ public: void BindOutputFB(); void BlitToEyeTexture(int eye); + void BlitFromEyeTexture(int eye); void BindEyeTexture(int eye, int texunit); - void BindEyeFB(int eye, bool readBuffer = false); void BindDitherTexture(int texunit); diff --git a/src/rendering/gl/system/gl_framebuffer.cpp b/src/rendering/gl/system/gl_framebuffer.cpp index 22e5c5fb32..6697c89d5e 100644 --- a/src/rendering/gl/system/gl_framebuffer.cpp +++ b/src/rendering/gl/system/gl_framebuffer.cpp @@ -448,9 +448,7 @@ void OpenGLFrameBuffer::Draw2D() if (GLRenderer != nullptr) { FGLDebug::PushGroup("Draw2D"); - if (VRMode::GetVRMode(true)->mEyeCount == 1) - GLRenderer->mBuffers->BindCurrentFB(); - + GLRenderer->mBuffers->BindCurrentFB(); ::Draw2D(&m2DDrawer, gl_RenderState); FGLDebug::PopGroup(); }