From 787359fdfb45ebc639158c00e385a6ba1c30adea Mon Sep 17 00:00:00 2001
From: Anna <anna@highfidelity.io>
Date: Mon, 1 Jul 2019 10:52:03 -0700
Subject: [PATCH] fixed ui flipping issue

---
 .../display-plugins/OpenGLDisplayPlugin.cpp   | 16 +++---
 .../src/display-plugins/OpenGLDisplayPlugin.h |  2 +-
 .../display-plugins/hmd/HmdDisplayPlugin.cpp  | 11 ++---
 .../display-plugins/hmd/HmdDisplayPlugin.h    |  4 +-
 ...ToSRGB.slf => DrawTextureLinearToSRGB.slf} |  2 +-
 ...ToSRGB.slp => DrawTextureLinearToSRGB.slp} |  0
 .../gpu/src/gpu/DrawTextureMirroredX.slf      |  5 +-
 .../gpu/src/gpu/DrawTextureMirroredX.slp      |  2 +-
 libraries/gpu/src/gpu/DrawTextureOpaque.slf   |  2 -
 ...Linear.slf => DrawTextureSRGBToLinear.slf} |  2 +-
 ...Linear.slp => DrawTextureSRGBToLinear.slp} |  0
 libraries/plugins/src/plugins/DisplayPlugin.h |  2 +-
 .../render-utils/src/RenderCommonTask.cpp     | 49 ++-----------------
 .../render-utils/src/RenderForwardTask.cpp    |  4 +-
 .../render-utils/src/RenderHUDLayerTask.cpp   |  2 +-
 libraries/render-utils/src/hmd_ui.slf         |  3 +-
 libraries/render/src/render/Args.h            |  2 +-
 plugins/oculus/src/OculusDisplayPlugin.cpp    |  2 +-
 18 files changed, 31 insertions(+), 79 deletions(-)
 rename libraries/gpu/src/gpu/{DrawTextureGammaLinearToSRGB.slf => DrawTextureLinearToSRGB.slf} (94%)
 rename libraries/gpu/src/gpu/{DrawTextureGammaLinearToSRGB.slp => DrawTextureLinearToSRGB.slp} (100%)
 rename libraries/gpu/src/gpu/{DrawTextureGammaSRGBToLinear.slf => DrawTextureSRGBToLinear.slf} (94%)
 rename libraries/gpu/src/gpu/{DrawTextureGammaSRGBToLinear.slp => DrawTextureSRGBToLinear.slp} (100%)

diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index 7ae24a9238..83380b18d0 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -392,13 +392,11 @@ void OpenGLDisplayPlugin::customizeContext() {
 
         _drawTexturePipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTexture), scissorState);
 
-        _linearToSRGBPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureGammaLinearToSRGB), scissorState);
+        _linearToSRGBPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureLinearToSRGB), scissorState);
 
-        _SRGBToLinearPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureGammaSRGBToLinear), scissorState);
+        _SRGBToLinearPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureSRGBToLinear), scissorState);
 
-        _hudPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTexture), blendState);
-
-        _mirrorHUDPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureMirroredX), blendState);
+        _hudPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureSRGBToLinear), blendState);
 
         _cursorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTransformedTexture), blendState);
     }
@@ -413,7 +411,6 @@ void OpenGLDisplayPlugin::uncustomizeContext() {
     _SRGBToLinearPipeline.reset();
     _cursorPipeline.reset();
     _hudPipeline.reset();
-    _mirrorHUDPipeline.reset();
     _compositeFramebuffer.reset();
 
     withPresentThreadLock([&] {
@@ -582,17 +579,16 @@ void OpenGLDisplayPlugin::updateFrameData() {
     });
 }
 
-std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> OpenGLDisplayPlugin::getHUDOperator() {
+std::function<void(gpu::Batch&, const gpu::TexturePointer&)> OpenGLDisplayPlugin::getHUDOperator() {
     auto hudPipeline = _hudPipeline;
-    auto hudMirrorPipeline = _mirrorHUDPipeline;
     auto hudStereo = isStereo();
     auto hudCompositeFramebufferSize = _compositeFramebuffer->getSize();
     std::array<glm::ivec4, 2> hudEyeViewports;
     for_each_eye([&](Eye eye) {
         hudEyeViewports[eye] = eyeViewport(eye);
     });
-    return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
-        auto pipeline = mirror ? hudMirrorPipeline : hudPipeline;
+    return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture) {
+        auto pipeline = hudPipeline;
         if (pipeline && hudTexture) {
             batch.enableStereo(false);
             batch.setPipeline(pipeline);
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
index 85ba235e7a..6fb36bff90 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
@@ -80,7 +80,7 @@ public:
     // Three threads, one for rendering, one for texture transfers, one reserved for the GL driver
     int getRequiredThreadCount() const override { return 3; }
 
-    virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() override;
+    virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&)> getHUDOperator() override;
     void copyTextureToQuickFramebuffer(NetworkTexturePointer source,
                                        QOpenGLFramebufferObject* target,
                                        GLsync* fenceSync) override;
diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
index 0c7d83cdd8..2eb22723a5 100644
--- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
@@ -175,7 +175,7 @@ float HmdDisplayPlugin::getLeftCenterPixel() const {
 }
 
 gpu::PipelinePointer HmdDisplayPlugin::getRenderTexturePipeline() {
-    return _SRGBToLinearPipeline;
+    return _drawTexturePipeline;
 }
 
 void HmdDisplayPlugin::internalPresent() {
@@ -417,7 +417,7 @@ void HmdDisplayPlugin::HUDRenderer::build() {
     pipeline = gpu::Pipeline::create(program, state);
 }
 
-std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::HUDRenderer::render() {
+std::function<void(gpu::Batch&, const gpu::TexturePointer&)> HmdDisplayPlugin::HUDRenderer::render() {
     auto hudPipeline = pipeline;
     auto hudFormat = format;
     auto hudVertices = vertices;
@@ -425,7 +425,7 @@ std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDis
     auto hudUniformBuffer = uniformsBuffer;
     auto hudUniforms = uniforms;
     auto hudIndexCount = indexCount;
-    return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
+    return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture) {
         if (hudPipeline && hudTexture) {
             batch.setPipeline(hudPipeline);
 
@@ -440,9 +440,6 @@ std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDis
 
             auto compositorHelper = DependencyManager::get<CompositorHelper>();
             glm::mat4 modelTransform = compositorHelper->getUiTransform();
-            if (mirror) {
-                modelTransform = glm::scale(modelTransform, glm::vec3(-1, 1, 1));
-            }
             batch.setModelTransform(modelTransform);
             batch.setResourceTexture(0, hudTexture);
 
@@ -475,7 +472,7 @@ void HmdDisplayPlugin::compositePointer() {
     });
 }
 
-std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::getHUDOperator() {
+std::function<void(gpu::Batch&, const gpu::TexturePointer&)> HmdDisplayPlugin::getHUDOperator() {
     return _hudRenderer.render();
 }
 
diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h
index 1f34e1b52a..e475da0818 100644
--- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h
@@ -48,7 +48,7 @@ public:
 
     void pluginUpdate() override {};
 
-    std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() override;
+    std::function<void(gpu::Batch&, const gpu::TexturePointer&)> getHUDOperator() override;
     virtual StencilMaskMode getStencilMaskMode() const override { return StencilMaskMode::PAINT; }
 
     virtual gpu::PipelinePointer getRenderTexturePipeline() override;
@@ -125,6 +125,6 @@ private:
         static const int VERTEX_STRIDE { sizeof(Vertex) };
 
         void build();
-        std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> render();
+        std::function<void(gpu::Batch&, const gpu::TexturePointer&)> render();
     } _hudRenderer;
 };
diff --git a/libraries/gpu/src/gpu/DrawTextureGammaLinearToSRGB.slf b/libraries/gpu/src/gpu/DrawTextureLinearToSRGB.slf
similarity index 94%
rename from libraries/gpu/src/gpu/DrawTextureGammaLinearToSRGB.slf
rename to libraries/gpu/src/gpu/DrawTextureLinearToSRGB.slf
index 3ca3a92f01..9d78e7286b 100644
--- a/libraries/gpu/src/gpu/DrawTextureGammaLinearToSRGB.slf
+++ b/libraries/gpu/src/gpu/DrawTextureLinearToSRGB.slf
@@ -2,7 +2,7 @@
 <$VERSION_HEADER$>
 //  Generated on <$_SCRIBE_DATE$>
 //
-//  DrawTextureGammaLinearToSRGB.frag
+//  DrawTextureLinearToSRGB.frag
 //
 //  Draw texture 0 fetched at texcoord.xy, and apply linear to sRGB color space conversion
 //
diff --git a/libraries/gpu/src/gpu/DrawTextureGammaLinearToSRGB.slp b/libraries/gpu/src/gpu/DrawTextureLinearToSRGB.slp
similarity index 100%
rename from libraries/gpu/src/gpu/DrawTextureGammaLinearToSRGB.slp
rename to libraries/gpu/src/gpu/DrawTextureLinearToSRGB.slp
diff --git a/libraries/gpu/src/gpu/DrawTextureMirroredX.slf b/libraries/gpu/src/gpu/DrawTextureMirroredX.slf
index abb52cbe7f..acb93fa5ca 100644
--- a/libraries/gpu/src/gpu/DrawTextureMirroredX.slf
+++ b/libraries/gpu/src/gpu/DrawTextureMirroredX.slf
@@ -2,7 +2,7 @@
 <$VERSION_HEADER$>
 //  Generated on <$_SCRIBE_DATE$>
 //
-//  DrawTextureMirroredX.frag
+//  DrawTextureSRGBToLinearMirroredX.frag
 //
 //  Draw texture 0 fetched at (1.0 - texcoord.x, texcoord.y)
 //
@@ -13,6 +13,7 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 
+<@include gpu/Color.slh@>
 
 LAYOUT(binding=0) uniform sampler2D colorMap;
 
@@ -20,5 +21,5 @@ layout(location=0) in vec2 varTexCoord0;
 layout(location=0) out vec4 outFragColor;
 
 void main(void) {
-    outFragColor = texture(colorMap, vec2(1.0 - varTexCoord0.x, varTexCoord0.y));
+    outFragColor =  vec4(texture(colorMap, vec2(1.0 - varTexCoord0.x, varTexCoord0.y)).xyz, 1.0);
 }
diff --git a/libraries/gpu/src/gpu/DrawTextureMirroredX.slp b/libraries/gpu/src/gpu/DrawTextureMirroredX.slp
index db9a4a4fac..e18f38ec1b 100644
--- a/libraries/gpu/src/gpu/DrawTextureMirroredX.slp
+++ b/libraries/gpu/src/gpu/DrawTextureMirroredX.slp
@@ -1 +1 @@
-VERTEX DrawUnitQuadTexcoord
\ No newline at end of file
+VERTEX DrawTransformUnitQuad
\ No newline at end of file
diff --git a/libraries/gpu/src/gpu/DrawTextureOpaque.slf b/libraries/gpu/src/gpu/DrawTextureOpaque.slf
index e23529e851..458eff75ed 100755
--- a/libraries/gpu/src/gpu/DrawTextureOpaque.slf
+++ b/libraries/gpu/src/gpu/DrawTextureOpaque.slf
@@ -14,8 +14,6 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 
-<@include gpu/ShaderConstants.h@>
-
 LAYOUT(binding=0) uniform sampler2D colorMap;
 
 layout(location=0) in vec2 varTexCoord0;
diff --git a/libraries/gpu/src/gpu/DrawTextureGammaSRGBToLinear.slf b/libraries/gpu/src/gpu/DrawTextureSRGBToLinear.slf
similarity index 94%
rename from libraries/gpu/src/gpu/DrawTextureGammaSRGBToLinear.slf
rename to libraries/gpu/src/gpu/DrawTextureSRGBToLinear.slf
index 870967ec3a..772d45131a 100644
--- a/libraries/gpu/src/gpu/DrawTextureGammaSRGBToLinear.slf
+++ b/libraries/gpu/src/gpu/DrawTextureSRGBToLinear.slf
@@ -2,7 +2,7 @@
 <$VERSION_HEADER$>
 //  Generated on <$_SCRIBE_DATE$>
 //
-//  DrawTextureGammaSRGBToLinear.frag
+//  DrawTextureSRGBToLinear.frag
 //
 //  Draw texture 0 fetched at texcoord.xy, and apply sRGB to Linear color space conversion
 //
diff --git a/libraries/gpu/src/gpu/DrawTextureGammaSRGBToLinear.slp b/libraries/gpu/src/gpu/DrawTextureSRGBToLinear.slp
similarity index 100%
rename from libraries/gpu/src/gpu/DrawTextureGammaSRGBToLinear.slp
rename to libraries/gpu/src/gpu/DrawTextureSRGBToLinear.slp
diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h
index ca4e3bc392..2315f6e4ba 100644
--- a/libraries/plugins/src/plugins/DisplayPlugin.h
+++ b/libraries/plugins/src/plugins/DisplayPlugin.h
@@ -210,7 +210,7 @@ public:
     // for updating plugin-related commands. Mimics the input plugin.
     virtual void pluginUpdate() = 0;
 
-    virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() { return nullptr; }
+    virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&)> getHUDOperator() { return nullptr; }
     virtual StencilMaskMode getStencilMaskMode() const { return StencilMaskMode::NONE; }
     using StencilMaskMeshOperator = std::function<void(gpu::Batch&)>;
     virtual StencilMaskMeshOperator getStencilMaskMeshOperator() { return nullptr; }
diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp
index e5de6ccd27..54e43abc07 100644
--- a/libraries/render-utils/src/RenderCommonTask.cpp
+++ b/libraries/render-utils/src/RenderCommonTask.cpp
@@ -128,52 +128,11 @@ void Blit::run(const RenderContextPointer& renderContext, const gpu::Framebuffer
     gpu::doInBatch("Blit", renderArgs->_context, [&](gpu::Batch& batch) {
         batch.setFramebuffer(blitFbo);
 
-        if (renderArgs->_renderMode == RenderArgs::MIRROR_RENDER_MODE) {
-            if (renderArgs->isStereo()) {
-                gpu::Vec4i srcRectLeft;
-                srcRectLeft.z = width / 2;
-                srcRectLeft.w = height;
+        gpu::Vec4i rect;
+        rect.z = width;
+        rect.w = height;
 
-                gpu::Vec4i srcRectRight;
-                srcRectRight.x = width / 2;
-                srcRectRight.z = width;
-                srcRectRight.w = height;
-
-                gpu::Vec4i destRectLeft;
-                destRectLeft.x = srcRectLeft.z;
-                destRectLeft.z = srcRectLeft.x;
-                destRectLeft.y = srcRectLeft.y;
-                destRectLeft.w = srcRectLeft.w;
-
-                gpu::Vec4i destRectRight;
-                destRectRight.x = srcRectRight.z;
-                destRectRight.z = srcRectRight.x;
-                destRectRight.y = srcRectRight.y;
-                destRectRight.w = srcRectRight.w;
-
-                // Blit left to right and right to left in stereo
-                batch.blit(primaryFbo, srcRectRight, blitFbo, destRectLeft);
-                batch.blit(primaryFbo, srcRectLeft, blitFbo, destRectRight);
-            } else {
-                gpu::Vec4i srcRect;
-                srcRect.z = width;
-                srcRect.w = height;
-
-                gpu::Vec4i destRect;
-                destRect.x = width;
-                destRect.y = 0;
-                destRect.z = 0;
-                destRect.w = height;
-
-                batch.blit(primaryFbo, srcRect, blitFbo, destRect);
-            }
-        } else {
-            gpu::Vec4i rect;
-            rect.z = width;
-            rect.w = height;
-
-            batch.blit(primaryFbo, rect, blitFbo, rect);
-        }
+        batch.blit(primaryFbo, rect, blitFbo, rect);
     });
 }
 
diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp
index d65ad18aa1..ef3dcee15f 100755
--- a/libraries/render-utils/src/RenderForwardTask.cpp
+++ b/libraries/render-utils/src/RenderForwardTask.cpp
@@ -144,9 +144,9 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
 
     // Just resolve the msaa
     const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast<gpu::FramebufferPointer>(nullptr)).asVarying();
-     const auto resolvedFramebuffer = task.addJob<ResolveFramebuffer>("Resolve", resolveInputs);
+    const auto resolvedFramebuffer = task.addJob<ResolveFramebuffer>("Resolve", resolveInputs);
 
-     const auto toneMappedBuffer = resolvedFramebuffer;
+    const auto toneMappedBuffer = resolvedFramebuffer;
 #else
     const auto newResolvedFramebuffer = task.addJob<NewOrDefaultFramebuffer>("MakeResolvingFramebuffer");
 
diff --git a/libraries/render-utils/src/RenderHUDLayerTask.cpp b/libraries/render-utils/src/RenderHUDLayerTask.cpp
index ac7a867366..840d9e8002 100644
--- a/libraries/render-utils/src/RenderHUDLayerTask.cpp
+++ b/libraries/render-utils/src/RenderHUDLayerTask.cpp
@@ -34,7 +34,7 @@ void CompositeHUD::run(const RenderContextPointer& renderContext, const gpu::Fra
             batch.setFramebuffer(inputs);
         }
         if (renderContext->args->_hudOperator) {
-            renderContext->args->_hudOperator(batch, renderContext->args->_hudTexture, renderContext->args->_renderMode == RenderArgs::RenderMode::MIRROR_RENDER_MODE);
+            renderContext->args->_hudOperator(batch, renderContext->args->_hudTexture);
         }
     });
 #endif
diff --git a/libraries/render-utils/src/hmd_ui.slf b/libraries/render-utils/src/hmd_ui.slf
index 6895a90f9e..af19ef1c06 100644
--- a/libraries/render-utils/src/hmd_ui.slf
+++ b/libraries/render-utils/src/hmd_ui.slf
@@ -12,6 +12,7 @@
 //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
 //
 <@include render-utils/ShaderConstants.h@>
+<@include gpu/Color.slh@>
 
 LAYOUT(binding=0) uniform sampler2D hudTexture;
 
@@ -36,5 +37,5 @@ void main() {
         discard;
     }
 
-    fragColor0 = color;
+    fragColor0 = color_sRGBAToLinear(color);
 }
\ No newline at end of file
diff --git a/libraries/render/src/render/Args.h b/libraries/render/src/render/Args.h
index 1798208981..cb1ca668a7 100644
--- a/libraries/render/src/render/Args.h
+++ b/libraries/render/src/render/Args.h
@@ -136,7 +136,7 @@ namespace render {
         render::ScenePointer _scene;
         int8_t _cameraMode { -1 };
 
-        std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> _hudOperator { nullptr };
+        std::function<void(gpu::Batch&, const gpu::TexturePointer&)> _hudOperator { nullptr };
         gpu::TexturePointer _hudTexture { nullptr };
 
         bool _takingSnapshot { false };
diff --git a/plugins/oculus/src/OculusDisplayPlugin.cpp b/plugins/oculus/src/OculusDisplayPlugin.cpp
index 161266c4af..bd0c77ae57 100644
--- a/plugins/oculus/src/OculusDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusDisplayPlugin.cpp
@@ -163,7 +163,7 @@ void OculusDisplayPlugin::hmdPresent() {
             batch.setStateScissorRect(ivec4(uvec2(), _outputFramebuffer->getSize()));
             batch.resetViewTransform();
             batch.setProjectionTransform(mat4());
-            batch.setPipeline(_SRGBToLinearPipeline);
+            batch.setPipeline(_drawTexturePipeline);
             batch.setResourceTexture(0, _compositeFramebuffer->getRenderBuffer(0));
             batch.draw(gpu::TRIANGLE_STRIP, 4);
         });