fixed ui flipping issue

This commit is contained in:
Anna 2019-07-01 10:52:03 -07:00
parent 9b85c7f1ac
commit 787359fdfb
18 changed files with 31 additions and 79 deletions

View file

@ -392,13 +392,11 @@ void OpenGLDisplayPlugin::customizeContext() {
_drawTexturePipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTexture), scissorState); _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); _hudPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureSRGBToLinear), blendState);
_mirrorHUDPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTextureMirroredX), blendState);
_cursorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTransformedTexture), blendState); _cursorPipeline = gpu::Pipeline::create(gpu::Shader::createProgram(DrawTransformedTexture), blendState);
} }
@ -413,7 +411,6 @@ void OpenGLDisplayPlugin::uncustomizeContext() {
_SRGBToLinearPipeline.reset(); _SRGBToLinearPipeline.reset();
_cursorPipeline.reset(); _cursorPipeline.reset();
_hudPipeline.reset(); _hudPipeline.reset();
_mirrorHUDPipeline.reset();
_compositeFramebuffer.reset(); _compositeFramebuffer.reset();
withPresentThreadLock([&] { 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 hudPipeline = _hudPipeline;
auto hudMirrorPipeline = _mirrorHUDPipeline;
auto hudStereo = isStereo(); auto hudStereo = isStereo();
auto hudCompositeFramebufferSize = _compositeFramebuffer->getSize(); auto hudCompositeFramebufferSize = _compositeFramebuffer->getSize();
std::array<glm::ivec4, 2> hudEyeViewports; std::array<glm::ivec4, 2> hudEyeViewports;
for_each_eye([&](Eye eye) { for_each_eye([&](Eye eye) {
hudEyeViewports[eye] = eyeViewport(eye); hudEyeViewports[eye] = eyeViewport(eye);
}); });
return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) { return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture) {
auto pipeline = mirror ? hudMirrorPipeline : hudPipeline; auto pipeline = hudPipeline;
if (pipeline && hudTexture) { if (pipeline && hudTexture) {
batch.enableStereo(false); batch.enableStereo(false);
batch.setPipeline(pipeline); batch.setPipeline(pipeline);

View file

@ -80,7 +80,7 @@ public:
// Three threads, one for rendering, one for texture transfers, one reserved for the GL driver // Three threads, one for rendering, one for texture transfers, one reserved for the GL driver
int getRequiredThreadCount() const override { return 3; } 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, void copyTextureToQuickFramebuffer(NetworkTexturePointer source,
QOpenGLFramebufferObject* target, QOpenGLFramebufferObject* target,
GLsync* fenceSync) override; GLsync* fenceSync) override;

View file

@ -175,7 +175,7 @@ float HmdDisplayPlugin::getLeftCenterPixel() const {
} }
gpu::PipelinePointer HmdDisplayPlugin::getRenderTexturePipeline() { gpu::PipelinePointer HmdDisplayPlugin::getRenderTexturePipeline() {
return _SRGBToLinearPipeline; return _drawTexturePipeline;
} }
void HmdDisplayPlugin::internalPresent() { void HmdDisplayPlugin::internalPresent() {
@ -417,7 +417,7 @@ void HmdDisplayPlugin::HUDRenderer::build() {
pipeline = gpu::Pipeline::create(program, state); 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 hudPipeline = pipeline;
auto hudFormat = format; auto hudFormat = format;
auto hudVertices = vertices; auto hudVertices = vertices;
@ -425,7 +425,7 @@ std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDis
auto hudUniformBuffer = uniformsBuffer; auto hudUniformBuffer = uniformsBuffer;
auto hudUniforms = uniforms; auto hudUniforms = uniforms;
auto hudIndexCount = indexCount; auto hudIndexCount = indexCount;
return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) { return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture) {
if (hudPipeline && hudTexture) { if (hudPipeline && hudTexture) {
batch.setPipeline(hudPipeline); batch.setPipeline(hudPipeline);
@ -440,9 +440,6 @@ std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDis
auto compositorHelper = DependencyManager::get<CompositorHelper>(); auto compositorHelper = DependencyManager::get<CompositorHelper>();
glm::mat4 modelTransform = compositorHelper->getUiTransform(); glm::mat4 modelTransform = compositorHelper->getUiTransform();
if (mirror) {
modelTransform = glm::scale(modelTransform, glm::vec3(-1, 1, 1));
}
batch.setModelTransform(modelTransform); batch.setModelTransform(modelTransform);
batch.setResourceTexture(0, hudTexture); 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(); return _hudRenderer.render();
} }

View file

@ -48,7 +48,7 @@ public:
void pluginUpdate() override {}; 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 StencilMaskMode getStencilMaskMode() const override { return StencilMaskMode::PAINT; }
virtual gpu::PipelinePointer getRenderTexturePipeline() override; virtual gpu::PipelinePointer getRenderTexturePipeline() override;
@ -125,6 +125,6 @@ private:
static const int VERTEX_STRIDE { sizeof(Vertex) }; static const int VERTEX_STRIDE { sizeof(Vertex) };
void build(); void build();
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> render(); std::function<void(gpu::Batch&, const gpu::TexturePointer&)> render();
} _hudRenderer; } _hudRenderer;
}; };

View file

@ -2,7 +2,7 @@
<$VERSION_HEADER$> <$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$> // Generated on <$_SCRIBE_DATE$>
// //
// DrawTextureGammaLinearToSRGB.frag // DrawTextureLinearToSRGB.frag
// //
// Draw texture 0 fetched at texcoord.xy, and apply linear to sRGB color space conversion // Draw texture 0 fetched at texcoord.xy, and apply linear to sRGB color space conversion
// //

View file

@ -2,7 +2,7 @@
<$VERSION_HEADER$> <$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$> // Generated on <$_SCRIBE_DATE$>
// //
// DrawTextureMirroredX.frag // DrawTextureSRGBToLinearMirroredX.frag
// //
// Draw texture 0 fetched at (1.0 - texcoord.x, texcoord.y) // 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 // 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; LAYOUT(binding=0) uniform sampler2D colorMap;
@ -20,5 +21,5 @@ layout(location=0) in vec2 varTexCoord0;
layout(location=0) out vec4 outFragColor; layout(location=0) out vec4 outFragColor;
void main(void) { 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);
} }

View file

@ -1 +1 @@
VERTEX DrawUnitQuadTexcoord VERTEX DrawTransformUnitQuad

View file

@ -14,8 +14,6 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // 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(binding=0) uniform sampler2D colorMap;
layout(location=0) in vec2 varTexCoord0; layout(location=0) in vec2 varTexCoord0;

View file

@ -2,7 +2,7 @@
<$VERSION_HEADER$> <$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$> // Generated on <$_SCRIBE_DATE$>
// //
// DrawTextureGammaSRGBToLinear.frag // DrawTextureSRGBToLinear.frag
// //
// Draw texture 0 fetched at texcoord.xy, and apply sRGB to Linear color space conversion // Draw texture 0 fetched at texcoord.xy, and apply sRGB to Linear color space conversion
// //

View file

@ -210,7 +210,7 @@ public:
// for updating plugin-related commands. Mimics the input plugin. // for updating plugin-related commands. Mimics the input plugin.
virtual void pluginUpdate() = 0; 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; } virtual StencilMaskMode getStencilMaskMode() const { return StencilMaskMode::NONE; }
using StencilMaskMeshOperator = std::function<void(gpu::Batch&)>; using StencilMaskMeshOperator = std::function<void(gpu::Batch&)>;
virtual StencilMaskMeshOperator getStencilMaskMeshOperator() { return nullptr; } virtual StencilMaskMeshOperator getStencilMaskMeshOperator() { return nullptr; }

View file

@ -128,52 +128,11 @@ void Blit::run(const RenderContextPointer& renderContext, const gpu::Framebuffer
gpu::doInBatch("Blit", renderArgs->_context, [&](gpu::Batch& batch) { gpu::doInBatch("Blit", renderArgs->_context, [&](gpu::Batch& batch) {
batch.setFramebuffer(blitFbo); batch.setFramebuffer(blitFbo);
if (renderArgs->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { gpu::Vec4i rect;
if (renderArgs->isStereo()) { rect.z = width;
gpu::Vec4i srcRectLeft; rect.w = height;
srcRectLeft.z = width / 2;
srcRectLeft.w = height;
gpu::Vec4i srcRectRight; batch.blit(primaryFbo, rect, blitFbo, rect);
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);
}
}); });
} }

View file

@ -144,9 +144,9 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
// Just resolve the msaa // Just resolve the msaa
const auto resolveInputs = ResolveFramebuffer::Inputs(scaledPrimaryFramebuffer, static_cast<gpu::FramebufferPointer>(nullptr)).asVarying(); 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 #else
const auto newResolvedFramebuffer = task.addJob<NewOrDefaultFramebuffer>("MakeResolvingFramebuffer"); const auto newResolvedFramebuffer = task.addJob<NewOrDefaultFramebuffer>("MakeResolvingFramebuffer");

View file

@ -34,7 +34,7 @@ void CompositeHUD::run(const RenderContextPointer& renderContext, const gpu::Fra
batch.setFramebuffer(inputs); batch.setFramebuffer(inputs);
} }
if (renderContext->args->_hudOperator) { 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 #endif

View file

@ -12,6 +12,7 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
<@include render-utils/ShaderConstants.h@> <@include render-utils/ShaderConstants.h@>
<@include gpu/Color.slh@>
LAYOUT(binding=0) uniform sampler2D hudTexture; LAYOUT(binding=0) uniform sampler2D hudTexture;
@ -36,5 +37,5 @@ void main() {
discard; discard;
} }
fragColor0 = color; fragColor0 = color_sRGBAToLinear(color);
} }

View file

@ -136,7 +136,7 @@ namespace render {
render::ScenePointer _scene; render::ScenePointer _scene;
int8_t _cameraMode { -1 }; 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 }; gpu::TexturePointer _hudTexture { nullptr };
bool _takingSnapshot { false }; bool _takingSnapshot { false };

View file

@ -163,7 +163,7 @@ void OculusDisplayPlugin::hmdPresent() {
batch.setStateScissorRect(ivec4(uvec2(), _outputFramebuffer->getSize())); batch.setStateScissorRect(ivec4(uvec2(), _outputFramebuffer->getSize()));
batch.resetViewTransform(); batch.resetViewTransform();
batch.setProjectionTransform(mat4()); batch.setProjectionTransform(mat4());
batch.setPipeline(_SRGBToLinearPipeline); batch.setPipeline(_drawTexturePipeline);
batch.setResourceTexture(0, _compositeFramebuffer->getRenderBuffer(0)); batch.setResourceTexture(0, _compositeFramebuffer->getRenderBuffer(0));
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
}); });