Skip to content

Commit 44fc0d2

Browse files
committed
Revert "Remove _compositeFramebuffer from display plugins"
This reverts commit cb31140.
1 parent 451b2eb commit 44fc0d2

22 files changed

+211
-181
lines changed

libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() {
109109
return Parent::internalActivate();
110110
}
111111

112-
void Basic2DWindowOpenGLDisplayPlugin::compositeExtra(const gpu::FramebufferPointer& compositeFramebuffer) {
112+
void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() {
113113
#if defined(Q_OS_ANDROID)
114114
auto& virtualPadManager = VirtualPad::Manager::instance();
115115
if(virtualPadManager.getLeftVirtualPad()->isShown()) {
@@ -121,7 +121,7 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra(const gpu::FramebufferPoin
121121

122122
render([&](gpu::Batch& batch) {
123123
batch.enableStereo(false);
124-
batch.setFramebuffer(compositeFramebuffer);
124+
batch.setFramebuffer(_compositeFramebuffer);
125125
batch.resetViewTransform();
126126
batch.setProjectionTransform(mat4());
127127
batch.setPipeline(_cursorPipeline);
@@ -140,7 +140,7 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra(const gpu::FramebufferPoin
140140
});
141141
}
142142
#endif
143-
Parent::compositeExtra(compositeFramebuffer);
143+
Parent::compositeExtra();
144144
}
145145

146146
static const uint32_t MIN_THROTTLE_CHECK_FRAMES = 60;

libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Basic2DWindowOpenGLDisplayPlugin : public OpenGLDisplayPlugin {
3333

3434
virtual bool isThrottled() const override;
3535

36-
virtual void compositeExtra(const gpu::FramebufferPointer&) override;
36+
virtual void compositeExtra() override;
3737

3838
virtual void pluginUpdate() override {};
3939

libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp

Lines changed: 100 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,14 @@ void OpenGLDisplayPlugin::customizeContext() {
379379
scissorState->setDepthTest(gpu::State::DepthTest(false));
380380
scissorState->setScissorEnable(true);
381381

382+
{
383+
#ifdef Q_OS_ANDROID
384+
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB);
385+
#else
386+
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
387+
#endif
388+
_simplePipeline = gpu::Pipeline::create(program, scissorState);
389+
}
382390
{
383391
#ifdef Q_OS_ANDROID
384392
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB);
@@ -388,59 +396,29 @@ void OpenGLDisplayPlugin::customizeContext() {
388396
_presentPipeline = gpu::Pipeline::create(program, scissorState);
389397
}
390398

391-
392-
// HUD operator
393399
{
394-
gpu::PipelinePointer hudPipeline;
395-
{
396-
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
397-
hudPipeline = gpu::Pipeline::create(program, blendState);
398-
}
399-
400-
gpu::PipelinePointer hudMirrorPipeline;
401-
{
402-
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureMirroredX);
403-
hudMirrorPipeline = gpu::Pipeline::create(program, blendState);
404-
}
405-
406-
407-
_hudOperator = [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, const gpu::FramebufferPointer& compositeFramebuffer, bool mirror) {
408-
auto hudStereo = isStereo();
409-
auto hudCompositeFramebufferSize = compositeFramebuffer->getSize();
410-
std::array<glm::ivec4, 2> hudEyeViewports;
411-
for_each_eye([&](Eye eye) {
412-
hudEyeViewports[eye] = eyeViewport(eye);
413-
});
414-
if (hudPipeline && hudTexture) {
415-
batch.enableStereo(false);
416-
batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline);
417-
batch.setResourceTexture(0, hudTexture);
418-
if (hudStereo) {
419-
for_each_eye([&](Eye eye) {
420-
batch.setViewportTransform(hudEyeViewports[eye]);
421-
batch.draw(gpu::TRIANGLE_STRIP, 4);
422-
});
423-
} else {
424-
batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize));
425-
batch.draw(gpu::TRIANGLE_STRIP, 4);
426-
}
427-
}
428-
};
429-
400+
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
401+
_hudPipeline = gpu::Pipeline::create(program, blendState);
402+
}
403+
{
404+
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureMirroredX);
405+
_mirrorHUDPipeline = gpu::Pipeline::create(program, blendState);
430406
}
431-
432407

433408
{
434409
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTransformedTexture);
435410
_cursorPipeline = gpu::Pipeline::create(program, blendState);
436411
}
437412
}
413+
updateCompositeFramebuffer();
438414
}
439415

440416
void OpenGLDisplayPlugin::uncustomizeContext() {
441417
_presentPipeline.reset();
442418
_cursorPipeline.reset();
443-
_hudOperator = DEFAULT_HUD_OPERATOR;
419+
_hudPipeline.reset();
420+
_mirrorHUDPipeline.reset();
421+
_compositeFramebuffer.reset();
444422
withPresentThreadLock([&] {
445423
_currentFrame.reset();
446424
_lastFrame = nullptr;
@@ -532,16 +510,24 @@ void OpenGLDisplayPlugin::captureFrame(const std::string& filename) const {
532510
});
533511
}
534512

513+
void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor) {
514+
renderFromTexture(batch, texture, viewport, scissor, nullptr);
515+
}
535516

536-
void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor, const gpu::FramebufferPointer& destFbo, const gpu::FramebufferPointer& copyFbo /*=gpu::FramebufferPointer()*/) {
517+
void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor, const gpu::FramebufferPointer& copyFbo /*=gpu::FramebufferPointer()*/) {
518+
auto fbo = gpu::FramebufferPointer();
537519
batch.enableStereo(false);
538520
batch.resetViewTransform();
539-
batch.setFramebuffer(destFbo);
521+
batch.setFramebuffer(fbo);
540522
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0));
541523
batch.setStateScissorRect(scissor);
542524
batch.setViewportTransform(viewport);
543525
batch.setResourceTexture(0, texture);
526+
#ifndef USE_GLES
544527
batch.setPipeline(_presentPipeline);
528+
#else
529+
batch.setPipeline(_simplePipeline);
530+
#endif
545531
batch.draw(gpu::TRIANGLE_STRIP, 4);
546532
if (copyFbo) {
547533
gpu::Vec4i copyFboRect(0, 0, copyFbo->getWidth(), copyFbo->getHeight());
@@ -567,7 +553,7 @@ void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::Textur
567553
batch.setViewportTransform(copyFboRect);
568554
batch.setStateScissorRect(copyFboRect);
569555
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, {0.0f, 0.0f, 0.0f, 1.0f});
570-
batch.blit(destFbo, sourceRect, copyFbo, copyRect);
556+
batch.blit(fbo, sourceRect, copyFbo, copyRect);
571557
}
572558
}
573559

@@ -595,14 +581,41 @@ void OpenGLDisplayPlugin::updateFrameData() {
595581
});
596582
}
597583

598-
void OpenGLDisplayPlugin::compositePointer(const gpu::FramebufferPointer& compositeFramebuffer) {
584+
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> OpenGLDisplayPlugin::getHUDOperator() {
585+
auto hudPipeline = _hudPipeline;
586+
auto hudMirrorPipeline = _mirrorHUDPipeline;
587+
auto hudStereo = isStereo();
588+
auto hudCompositeFramebufferSize = _compositeFramebuffer->getSize();
589+
std::array<glm::ivec4, 2> hudEyeViewports;
590+
for_each_eye([&](Eye eye) {
591+
hudEyeViewports[eye] = eyeViewport(eye);
592+
});
593+
return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
594+
if (hudPipeline && hudTexture) {
595+
batch.enableStereo(false);
596+
batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline);
597+
batch.setResourceTexture(0, hudTexture);
598+
if (hudStereo) {
599+
for_each_eye([&](Eye eye) {
600+
batch.setViewportTransform(hudEyeViewports[eye]);
601+
batch.draw(gpu::TRIANGLE_STRIP, 4);
602+
});
603+
} else {
604+
batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize));
605+
batch.draw(gpu::TRIANGLE_STRIP, 4);
606+
}
607+
}
608+
};
609+
}
610+
611+
void OpenGLDisplayPlugin::compositePointer() {
599612
auto& cursorManager = Cursor::Manager::instance();
600613
const auto& cursorData = _cursorsData[cursorManager.getCursor()->getIcon()];
601614
auto cursorTransform = DependencyManager::get<CompositorHelper>()->getReticleTransform(glm::mat4());
602615
render([&](gpu::Batch& batch) {
603616
batch.enableStereo(false);
604617
batch.setProjectionTransform(mat4());
605-
batch.setFramebuffer(compositeFramebuffer);
618+
batch.setFramebuffer(_compositeFramebuffer);
606619
batch.setPipeline(_cursorPipeline);
607620
batch.setResourceTexture(0, cursorData.texture);
608621
batch.resetViewTransform();
@@ -613,13 +626,34 @@ void OpenGLDisplayPlugin::compositePointer(const gpu::FramebufferPointer& compos
613626
batch.draw(gpu::TRIANGLE_STRIP, 4);
614627
});
615628
} else {
616-
batch.setViewportTransform(ivec4(uvec2(0), compositeFramebuffer->getSize()));
629+
batch.setViewportTransform(ivec4(uvec2(0), _compositeFramebuffer->getSize()));
617630
batch.draw(gpu::TRIANGLE_STRIP, 4);
618631
}
619632
});
620633
}
621634

622-
void OpenGLDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& compositeFramebuffer) {
635+
void OpenGLDisplayPlugin::compositeScene() {
636+
render([&](gpu::Batch& batch) {
637+
batch.enableStereo(false);
638+
batch.setFramebuffer(_compositeFramebuffer);
639+
batch.setViewportTransform(ivec4(uvec2(), _compositeFramebuffer->getSize()));
640+
batch.setStateScissorRect(ivec4(uvec2(), _compositeFramebuffer->getSize()));
641+
batch.resetViewTransform();
642+
batch.setProjectionTransform(mat4());
643+
batch.setPipeline(_simplePipeline);
644+
batch.setResourceTexture(0, _currentFrame->framebuffer->getRenderBuffer(0));
645+
batch.draw(gpu::TRIANGLE_STRIP, 4);
646+
});
647+
}
648+
649+
void OpenGLDisplayPlugin::compositeLayers() {
650+
updateCompositeFramebuffer();
651+
652+
{
653+
PROFILE_RANGE_EX(render_detail, "compositeScene", 0xff0077ff, (uint64_t)presentCount())
654+
compositeScene();
655+
}
656+
623657
#ifdef HIFI_ENABLE_NSIGHT_DEBUG
624658
if (false) // do not draw the HUD if running nsight debug
625659
#endif
@@ -633,35 +667,23 @@ void OpenGLDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& composi
633667

634668
{
635669
PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount())
636-
compositeExtra(compositeFramebuffer);
670+
compositeExtra();
637671
}
638672

639673
// Draw the pointer last so it's on top of everything
640674
auto compositorHelper = DependencyManager::get<CompositorHelper>();
641675
if (compositorHelper->getReticleVisible()) {
642676
PROFILE_RANGE_EX(render_detail, "compositePointer", 0xff0077ff, (uint64_t)presentCount())
643-
compositePointer(compositeFramebuffer);
677+
compositePointer();
644678
}
645679
}
646680

647-
void OpenGLDisplayPlugin::internalPresent(const gpu::FramebufferPointer& compositeFramebuffer) {
681+
void OpenGLDisplayPlugin::internalPresent() {
648682
render([&](gpu::Batch& batch) {
649683
// Note: _displayTexture must currently be the same size as the display.
650684
uvec2 dims = _displayTexture ? uvec2(_displayTexture->getDimensions()) : getSurfacePixels();
651685
auto viewport = ivec4(uvec2(0), dims);
652-
653-
gpu::TexturePointer finalTexture;
654-
if (_displayTexture) {
655-
finalTexture = _displayTexture;
656-
} else if (compositeFramebuffer) {
657-
finalTexture = compositeFramebuffer->getRenderBuffer(0);
658-
} else {
659-
qCWarning(displayPlugins) << "No valid texture for output";
660-
}
661-
662-
if (finalTexture) {
663-
renderFromTexture(batch, finalTexture, viewport, viewport);
664-
}
686+
renderFromTexture(batch, _displayTexture ? _displayTexture : _compositeFramebuffer->getRenderBuffer(0), viewport, viewport);
665687
});
666688
swapBuffers();
667689
_presentRate.increment();
@@ -678,7 +700,7 @@ void OpenGLDisplayPlugin::present() {
678700
}
679701
incrementPresentCount();
680702

681-
if (_currentFrame && _currentFrame->framebuffer) {
703+
if (_currentFrame) {
682704
auto correction = getViewCorrection();
683705
getGLBackend()->setCameraCorrection(correction, _prevRenderView);
684706
_prevRenderView = correction * _currentFrame->view;
@@ -698,18 +720,18 @@ void OpenGLDisplayPlugin::present() {
698720
// Write all layers to a local framebuffer
699721
{
700722
PROFILE_RANGE_EX(render, "composite", 0xff00ffff, frameId)
701-
compositeLayers(_currentFrame->framebuffer);
723+
compositeLayers();
702724
}
703725

704726
// Take the composite framebuffer and send it to the output device
705727
{
706728
PROFILE_RANGE_EX(render, "internalPresent", 0xff00ffff, frameId)
707-
internalPresent(_currentFrame->framebuffer);
729+
internalPresent();
708730
}
709731

710732
gpu::Backend::freeGPUMemSize.set(gpu::gl::getFreeDedicatedMemory());
711733
} else if (alwaysPresent()) {
712-
internalPresent(nullptr);
734+
internalPresent();
713735
}
714736
_movingAveragePresent.addSample((float)(usecTimestampNow() - startPresent));
715737
}
@@ -766,12 +788,7 @@ bool OpenGLDisplayPlugin::setDisplayTexture(const QString& name) {
766788
}
767789

768790
QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const {
769-
if (!_currentFrame || !_currentFrame->framebuffer) {
770-
return QImage();
771-
}
772-
773-
auto compositeFramebuffer = _currentFrame->framebuffer;
774-
auto size = compositeFramebuffer->getSize();
791+
auto size = _compositeFramebuffer->getSize();
775792
if (isHmd()) {
776793
size.x /= 2;
777794
}
@@ -789,7 +806,7 @@ QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const {
789806
auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend();
790807
QImage screenshot(bestSize.x, bestSize.y, QImage::Format_ARGB32);
791808
withOtherThreadContext([&] {
792-
glBackend->downloadFramebuffer(compositeFramebuffer, ivec4(corner, bestSize), screenshot);
809+
glBackend->downloadFramebuffer(_compositeFramebuffer, ivec4(corner, bestSize), screenshot);
793810
});
794811
return screenshot.mirrored(false, true);
795812
}
@@ -841,7 +858,7 @@ bool OpenGLDisplayPlugin::beginFrameRender(uint32_t frameIndex) {
841858
}
842859

843860
ivec4 OpenGLDisplayPlugin::eyeViewport(Eye eye) const {
844-
auto vpSize = glm::uvec2(getRecommendedRenderSize());
861+
uvec2 vpSize = _compositeFramebuffer->getSize();
845862
vpSize.x /= 2;
846863
uvec2 vpPos;
847864
if (eye == Eye::Right) {
@@ -874,6 +891,14 @@ void OpenGLDisplayPlugin::render(std::function<void(gpu::Batch& batch)> f) {
874891
OpenGLDisplayPlugin::~OpenGLDisplayPlugin() {
875892
}
876893

894+
void OpenGLDisplayPlugin::updateCompositeFramebuffer() {
895+
auto renderSize = glm::uvec2(getRecommendedRenderSize());
896+
if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) {
897+
_compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y));
898+
// _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_SRGBA_32, renderSize.x, renderSize.y));
899+
}
900+
}
901+
877902
void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer networkTexture, QOpenGLFramebufferObject* target, GLsync* fenceSync) {
878903
#if !defined(USE_GLES)
879904
auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend();

0 commit comments

Comments
 (0)