@@ -379,6 +379,14 @@ void OpenGLDisplayPlugin::customizeContext() {
379
379
scissorState->setDepthTest (gpu::State::DepthTest (false ));
380
380
scissorState->setScissorEnable (true );
381
381
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
+ }
382
390
{
383
391
#ifdef Q_OS_ANDROID
384
392
gpu::ShaderPointer program = gpu::Shader::createProgram (shader::gpu::program::DrawTextureGammaLinearToSRGB);
@@ -388,59 +396,29 @@ void OpenGLDisplayPlugin::customizeContext() {
388
396
_presentPipeline = gpu::Pipeline::create (program, scissorState);
389
397
}
390
398
391
-
392
- // HUD operator
393
399
{
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);
430
406
}
431
-
432
407
433
408
{
434
409
gpu::ShaderPointer program = gpu::Shader::createProgram (shader::gpu::program::DrawTransformedTexture);
435
410
_cursorPipeline = gpu::Pipeline::create (program, blendState);
436
411
}
437
412
}
413
+ updateCompositeFramebuffer ();
438
414
}
439
415
440
416
void OpenGLDisplayPlugin::uncustomizeContext () {
441
417
_presentPipeline.reset ();
442
418
_cursorPipeline.reset ();
443
- _hudOperator = DEFAULT_HUD_OPERATOR;
419
+ _hudPipeline.reset ();
420
+ _mirrorHUDPipeline.reset ();
421
+ _compositeFramebuffer.reset ();
444
422
withPresentThreadLock ([&] {
445
423
_currentFrame.reset ();
446
424
_lastFrame = nullptr ;
@@ -532,16 +510,24 @@ void OpenGLDisplayPlugin::captureFrame(const std::string& filename) const {
532
510
});
533
511
}
534
512
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
+ }
535
516
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 ();
537
519
batch.enableStereo (false );
538
520
batch.resetViewTransform ();
539
- batch.setFramebuffer (destFbo );
521
+ batch.setFramebuffer (fbo );
540
522
batch.clearColorFramebuffer (gpu::Framebuffer::BUFFER_COLOR0, vec4 (0 ));
541
523
batch.setStateScissorRect (scissor);
542
524
batch.setViewportTransform (viewport);
543
525
batch.setResourceTexture (0 , texture);
526
+ #ifndef USE_GLES
544
527
batch.setPipeline (_presentPipeline);
528
+ #else
529
+ batch.setPipeline (_simplePipeline);
530
+ #endif
545
531
batch.draw (gpu::TRIANGLE_STRIP, 4 );
546
532
if (copyFbo) {
547
533
gpu::Vec4i copyFboRect (0 , 0 , copyFbo->getWidth (), copyFbo->getHeight ());
@@ -567,7 +553,7 @@ void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::Textur
567
553
batch.setViewportTransform (copyFboRect);
568
554
batch.setStateScissorRect (copyFboRect);
569
555
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);
571
557
}
572
558
}
573
559
@@ -595,14 +581,41 @@ void OpenGLDisplayPlugin::updateFrameData() {
595
581
});
596
582
}
597
583
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 () {
599
612
auto & cursorManager = Cursor::Manager::instance ();
600
613
const auto & cursorData = _cursorsData[cursorManager.getCursor ()->getIcon ()];
601
614
auto cursorTransform = DependencyManager::get<CompositorHelper>()->getReticleTransform (glm::mat4 ());
602
615
render ([&](gpu::Batch& batch) {
603
616
batch.enableStereo (false );
604
617
batch.setProjectionTransform (mat4 ());
605
- batch.setFramebuffer (compositeFramebuffer );
618
+ batch.setFramebuffer (_compositeFramebuffer );
606
619
batch.setPipeline (_cursorPipeline);
607
620
batch.setResourceTexture (0 , cursorData.texture );
608
621
batch.resetViewTransform ();
@@ -613,13 +626,34 @@ void OpenGLDisplayPlugin::compositePointer(const gpu::FramebufferPointer& compos
613
626
batch.draw (gpu::TRIANGLE_STRIP, 4 );
614
627
});
615
628
} else {
616
- batch.setViewportTransform (ivec4 (uvec2 (0 ), compositeFramebuffer ->getSize ()));
629
+ batch.setViewportTransform (ivec4 (uvec2 (0 ), _compositeFramebuffer ->getSize ()));
617
630
batch.draw (gpu::TRIANGLE_STRIP, 4 );
618
631
}
619
632
});
620
633
}
621
634
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
+
623
657
#ifdef HIFI_ENABLE_NSIGHT_DEBUG
624
658
if (false ) // do not draw the HUD if running nsight debug
625
659
#endif
@@ -633,35 +667,23 @@ void OpenGLDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& composi
633
667
634
668
{
635
669
PROFILE_RANGE_EX (render_detail, " compositeExtra" , 0xff0077ff , (uint64_t )presentCount ())
636
- compositeExtra (compositeFramebuffer );
670
+ compositeExtra ();
637
671
}
638
672
639
673
// Draw the pointer last so it's on top of everything
640
674
auto compositorHelper = DependencyManager::get<CompositorHelper>();
641
675
if (compositorHelper->getReticleVisible ()) {
642
676
PROFILE_RANGE_EX (render_detail, " compositePointer" , 0xff0077ff , (uint64_t )presentCount ())
643
- compositePointer (compositeFramebuffer );
677
+ compositePointer ();
644
678
}
645
679
}
646
680
647
- void OpenGLDisplayPlugin::internalPresent (const gpu::FramebufferPointer& compositeFramebuffer ) {
681
+ void OpenGLDisplayPlugin::internalPresent () {
648
682
render ([&](gpu::Batch& batch) {
649
683
// Note: _displayTexture must currently be the same size as the display.
650
684
uvec2 dims = _displayTexture ? uvec2 (_displayTexture->getDimensions ()) : getSurfacePixels ();
651
685
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);
665
687
});
666
688
swapBuffers ();
667
689
_presentRate.increment ();
@@ -678,7 +700,7 @@ void OpenGLDisplayPlugin::present() {
678
700
}
679
701
incrementPresentCount ();
680
702
681
- if (_currentFrame && _currentFrame-> framebuffer ) {
703
+ if (_currentFrame) {
682
704
auto correction = getViewCorrection ();
683
705
getGLBackend ()->setCameraCorrection (correction, _prevRenderView);
684
706
_prevRenderView = correction * _currentFrame->view ;
@@ -698,18 +720,18 @@ void OpenGLDisplayPlugin::present() {
698
720
// Write all layers to a local framebuffer
699
721
{
700
722
PROFILE_RANGE_EX (render, " composite" , 0xff00ffff , frameId)
701
- compositeLayers (_currentFrame-> framebuffer );
723
+ compositeLayers ();
702
724
}
703
725
704
726
// Take the composite framebuffer and send it to the output device
705
727
{
706
728
PROFILE_RANGE_EX (render, " internalPresent" , 0xff00ffff , frameId)
707
- internalPresent (_currentFrame-> framebuffer );
729
+ internalPresent ();
708
730
}
709
731
710
732
gpu::Backend::freeGPUMemSize.set (gpu::gl::getFreeDedicatedMemory ());
711
733
} else if (alwaysPresent ()) {
712
- internalPresent (nullptr );
734
+ internalPresent ();
713
735
}
714
736
_movingAveragePresent.addSample ((float )(usecTimestampNow () - startPresent));
715
737
}
@@ -766,12 +788,7 @@ bool OpenGLDisplayPlugin::setDisplayTexture(const QString& name) {
766
788
}
767
789
768
790
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 ();
775
792
if (isHmd ()) {
776
793
size.x /= 2 ;
777
794
}
@@ -789,7 +806,7 @@ QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const {
789
806
auto glBackend = const_cast <OpenGLDisplayPlugin&>(*this ).getGLBackend ();
790
807
QImage screenshot (bestSize.x , bestSize.y , QImage::Format_ARGB32);
791
808
withOtherThreadContext ([&] {
792
- glBackend->downloadFramebuffer (compositeFramebuffer , ivec4 (corner, bestSize), screenshot);
809
+ glBackend->downloadFramebuffer (_compositeFramebuffer , ivec4 (corner, bestSize), screenshot);
793
810
});
794
811
return screenshot.mirrored (false , true );
795
812
}
@@ -841,7 +858,7 @@ bool OpenGLDisplayPlugin::beginFrameRender(uint32_t frameIndex) {
841
858
}
842
859
843
860
ivec4 OpenGLDisplayPlugin::eyeViewport (Eye eye) const {
844
- auto vpSize = glm::uvec2 ( getRecommendedRenderSize () );
861
+ uvec2 vpSize = _compositeFramebuffer-> getSize ( );
845
862
vpSize.x /= 2 ;
846
863
uvec2 vpPos;
847
864
if (eye == Eye::Right) {
@@ -874,6 +891,14 @@ void OpenGLDisplayPlugin::render(std::function<void(gpu::Batch& batch)> f) {
874
891
OpenGLDisplayPlugin::~OpenGLDisplayPlugin () {
875
892
}
876
893
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
+
877
902
void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer (NetworkTexturePointer networkTexture, QOpenGLFramebufferObject* target, GLsync* fenceSync) {
878
903
#if !defined(USE_GLES)
879
904
auto glBackend = const_cast <OpenGLDisplayPlugin&>(*this ).getGLBackend ();
0 commit comments