Revert "Remove _compositeFramebuffer from display plugins"

This reverts commit cb311408c6.
This commit is contained in:
Brad Davis 2019-04-03 13:43:39 -07:00
parent 451b2eb391
commit 44fc0d21db
22 changed files with 211 additions and 181 deletions

View file

@ -109,7 +109,7 @@ bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() {
return Parent::internalActivate(); return Parent::internalActivate();
} }
void Basic2DWindowOpenGLDisplayPlugin::compositeExtra(const gpu::FramebufferPointer& compositeFramebuffer) { void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() {
#if defined(Q_OS_ANDROID) #if defined(Q_OS_ANDROID)
auto& virtualPadManager = VirtualPad::Manager::instance(); auto& virtualPadManager = VirtualPad::Manager::instance();
if(virtualPadManager.getLeftVirtualPad()->isShown()) { if(virtualPadManager.getLeftVirtualPad()->isShown()) {
@ -121,7 +121,7 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra(const gpu::FramebufferPoin
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
batch.enableStereo(false); batch.enableStereo(false);
batch.setFramebuffer(compositeFramebuffer); batch.setFramebuffer(_compositeFramebuffer);
batch.resetViewTransform(); batch.resetViewTransform();
batch.setProjectionTransform(mat4()); batch.setProjectionTransform(mat4());
batch.setPipeline(_cursorPipeline); batch.setPipeline(_cursorPipeline);
@ -140,7 +140,7 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra(const gpu::FramebufferPoin
}); });
} }
#endif #endif
Parent::compositeExtra(compositeFramebuffer); Parent::compositeExtra();
} }
static const uint32_t MIN_THROTTLE_CHECK_FRAMES = 60; static const uint32_t MIN_THROTTLE_CHECK_FRAMES = 60;

View file

@ -33,7 +33,7 @@ public:
virtual bool isThrottled() const override; virtual bool isThrottled() const override;
virtual void compositeExtra(const gpu::FramebufferPointer&) override; virtual void compositeExtra() override;
virtual void pluginUpdate() override {}; virtual void pluginUpdate() override {};

View file

@ -379,6 +379,14 @@ void OpenGLDisplayPlugin::customizeContext() {
scissorState->setDepthTest(gpu::State::DepthTest(false)); scissorState->setDepthTest(gpu::State::DepthTest(false));
scissorState->setScissorEnable(true); scissorState->setScissorEnable(true);
{
#ifdef Q_OS_ANDROID
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB);
#else
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
#endif
_simplePipeline = gpu::Pipeline::create(program, scissorState);
}
{ {
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB); gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB);
@ -388,59 +396,29 @@ void OpenGLDisplayPlugin::customizeContext() {
_presentPipeline = gpu::Pipeline::create(program, scissorState); _presentPipeline = gpu::Pipeline::create(program, scissorState);
} }
// HUD operator
{ {
gpu::PipelinePointer hudPipeline; gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
{ _hudPipeline = gpu::Pipeline::create(program, blendState);
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture); }
hudPipeline = gpu::Pipeline::create(program, blendState); {
} gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureMirroredX);
_mirrorHUDPipeline = gpu::Pipeline::create(program, blendState);
gpu::PipelinePointer hudMirrorPipeline;
{
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureMirroredX);
hudMirrorPipeline = gpu::Pipeline::create(program, blendState);
}
_hudOperator = [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, const gpu::FramebufferPointer& compositeFramebuffer, bool mirror) {
auto hudStereo = isStereo();
auto hudCompositeFramebufferSize = compositeFramebuffer->getSize();
std::array<glm::ivec4, 2> hudEyeViewports;
for_each_eye([&](Eye eye) {
hudEyeViewports[eye] = eyeViewport(eye);
});
if (hudPipeline && hudTexture) {
batch.enableStereo(false);
batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline);
batch.setResourceTexture(0, hudTexture);
if (hudStereo) {
for_each_eye([&](Eye eye) {
batch.setViewportTransform(hudEyeViewports[eye]);
batch.draw(gpu::TRIANGLE_STRIP, 4);
});
} else {
batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize));
batch.draw(gpu::TRIANGLE_STRIP, 4);
}
}
};
} }
{ {
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTransformedTexture); gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTransformedTexture);
_cursorPipeline = gpu::Pipeline::create(program, blendState); _cursorPipeline = gpu::Pipeline::create(program, blendState);
} }
} }
updateCompositeFramebuffer();
} }
void OpenGLDisplayPlugin::uncustomizeContext() { void OpenGLDisplayPlugin::uncustomizeContext() {
_presentPipeline.reset(); _presentPipeline.reset();
_cursorPipeline.reset(); _cursorPipeline.reset();
_hudOperator = DEFAULT_HUD_OPERATOR; _hudPipeline.reset();
_mirrorHUDPipeline.reset();
_compositeFramebuffer.reset();
withPresentThreadLock([&] { withPresentThreadLock([&] {
_currentFrame.reset(); _currentFrame.reset();
_lastFrame = nullptr; _lastFrame = nullptr;
@ -532,16 +510,24 @@ void OpenGLDisplayPlugin::captureFrame(const std::string& filename) const {
}); });
} }
void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor) {
renderFromTexture(batch, texture, viewport, scissor, nullptr);
}
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()*/) { void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor, const gpu::FramebufferPointer& copyFbo /*=gpu::FramebufferPointer()*/) {
auto fbo = gpu::FramebufferPointer();
batch.enableStereo(false); batch.enableStereo(false);
batch.resetViewTransform(); batch.resetViewTransform();
batch.setFramebuffer(destFbo); batch.setFramebuffer(fbo);
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0)); batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0));
batch.setStateScissorRect(scissor); batch.setStateScissorRect(scissor);
batch.setViewportTransform(viewport); batch.setViewportTransform(viewport);
batch.setResourceTexture(0, texture); batch.setResourceTexture(0, texture);
#ifndef USE_GLES
batch.setPipeline(_presentPipeline); batch.setPipeline(_presentPipeline);
#else
batch.setPipeline(_simplePipeline);
#endif
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
if (copyFbo) { if (copyFbo) {
gpu::Vec4i copyFboRect(0, 0, copyFbo->getWidth(), copyFbo->getHeight()); gpu::Vec4i copyFboRect(0, 0, copyFbo->getWidth(), copyFbo->getHeight());
@ -567,7 +553,7 @@ void OpenGLDisplayPlugin::renderFromTexture(gpu::Batch& batch, const gpu::Textur
batch.setViewportTransform(copyFboRect); batch.setViewportTransform(copyFboRect);
batch.setStateScissorRect(copyFboRect); batch.setStateScissorRect(copyFboRect);
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, {0.0f, 0.0f, 0.0f, 1.0f}); batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, {0.0f, 0.0f, 0.0f, 1.0f});
batch.blit(destFbo, sourceRect, copyFbo, copyRect); batch.blit(fbo, sourceRect, copyFbo, copyRect);
} }
} }
@ -595,14 +581,41 @@ void OpenGLDisplayPlugin::updateFrameData() {
}); });
} }
void OpenGLDisplayPlugin::compositePointer(const gpu::FramebufferPointer& compositeFramebuffer) { std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> 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) {
if (hudPipeline && hudTexture) {
batch.enableStereo(false);
batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline);
batch.setResourceTexture(0, hudTexture);
if (hudStereo) {
for_each_eye([&](Eye eye) {
batch.setViewportTransform(hudEyeViewports[eye]);
batch.draw(gpu::TRIANGLE_STRIP, 4);
});
} else {
batch.setViewportTransform(ivec4(uvec2(0), hudCompositeFramebufferSize));
batch.draw(gpu::TRIANGLE_STRIP, 4);
}
}
};
}
void OpenGLDisplayPlugin::compositePointer() {
auto& cursorManager = Cursor::Manager::instance(); auto& cursorManager = Cursor::Manager::instance();
const auto& cursorData = _cursorsData[cursorManager.getCursor()->getIcon()]; const auto& cursorData = _cursorsData[cursorManager.getCursor()->getIcon()];
auto cursorTransform = DependencyManager::get<CompositorHelper>()->getReticleTransform(glm::mat4()); auto cursorTransform = DependencyManager::get<CompositorHelper>()->getReticleTransform(glm::mat4());
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
batch.enableStereo(false); batch.enableStereo(false);
batch.setProjectionTransform(mat4()); batch.setProjectionTransform(mat4());
batch.setFramebuffer(compositeFramebuffer); batch.setFramebuffer(_compositeFramebuffer);
batch.setPipeline(_cursorPipeline); batch.setPipeline(_cursorPipeline);
batch.setResourceTexture(0, cursorData.texture); batch.setResourceTexture(0, cursorData.texture);
batch.resetViewTransform(); batch.resetViewTransform();
@ -613,13 +626,34 @@ void OpenGLDisplayPlugin::compositePointer(const gpu::FramebufferPointer& compos
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
}); });
} else { } else {
batch.setViewportTransform(ivec4(uvec2(0), compositeFramebuffer->getSize())); batch.setViewportTransform(ivec4(uvec2(0), _compositeFramebuffer->getSize()));
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
} }
}); });
} }
void OpenGLDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& compositeFramebuffer) { void OpenGLDisplayPlugin::compositeScene() {
render([&](gpu::Batch& batch) {
batch.enableStereo(false);
batch.setFramebuffer(_compositeFramebuffer);
batch.setViewportTransform(ivec4(uvec2(), _compositeFramebuffer->getSize()));
batch.setStateScissorRect(ivec4(uvec2(), _compositeFramebuffer->getSize()));
batch.resetViewTransform();
batch.setProjectionTransform(mat4());
batch.setPipeline(_simplePipeline);
batch.setResourceTexture(0, _currentFrame->framebuffer->getRenderBuffer(0));
batch.draw(gpu::TRIANGLE_STRIP, 4);
});
}
void OpenGLDisplayPlugin::compositeLayers() {
updateCompositeFramebuffer();
{
PROFILE_RANGE_EX(render_detail, "compositeScene", 0xff0077ff, (uint64_t)presentCount())
compositeScene();
}
#ifdef HIFI_ENABLE_NSIGHT_DEBUG #ifdef HIFI_ENABLE_NSIGHT_DEBUG
if (false) // do not draw the HUD if running nsight debug if (false) // do not draw the HUD if running nsight debug
#endif #endif
@ -633,35 +667,23 @@ void OpenGLDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& composi
{ {
PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount())
compositeExtra(compositeFramebuffer); compositeExtra();
} }
// Draw the pointer last so it's on top of everything // Draw the pointer last so it's on top of everything
auto compositorHelper = DependencyManager::get<CompositorHelper>(); auto compositorHelper = DependencyManager::get<CompositorHelper>();
if (compositorHelper->getReticleVisible()) { if (compositorHelper->getReticleVisible()) {
PROFILE_RANGE_EX(render_detail, "compositePointer", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX(render_detail, "compositePointer", 0xff0077ff, (uint64_t)presentCount())
compositePointer(compositeFramebuffer); compositePointer();
} }
} }
void OpenGLDisplayPlugin::internalPresent(const gpu::FramebufferPointer& compositeFramebuffer) { void OpenGLDisplayPlugin::internalPresent() {
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
// Note: _displayTexture must currently be the same size as the display. // Note: _displayTexture must currently be the same size as the display.
uvec2 dims = _displayTexture ? uvec2(_displayTexture->getDimensions()) : getSurfacePixels(); uvec2 dims = _displayTexture ? uvec2(_displayTexture->getDimensions()) : getSurfacePixels();
auto viewport = ivec4(uvec2(0), dims); auto viewport = ivec4(uvec2(0), dims);
renderFromTexture(batch, _displayTexture ? _displayTexture : _compositeFramebuffer->getRenderBuffer(0), viewport, viewport);
gpu::TexturePointer finalTexture;
if (_displayTexture) {
finalTexture = _displayTexture;
} else if (compositeFramebuffer) {
finalTexture = compositeFramebuffer->getRenderBuffer(0);
} else {
qCWarning(displayPlugins) << "No valid texture for output";
}
if (finalTexture) {
renderFromTexture(batch, finalTexture, viewport, viewport);
}
}); });
swapBuffers(); swapBuffers();
_presentRate.increment(); _presentRate.increment();
@ -678,7 +700,7 @@ void OpenGLDisplayPlugin::present() {
} }
incrementPresentCount(); incrementPresentCount();
if (_currentFrame && _currentFrame->framebuffer) { if (_currentFrame) {
auto correction = getViewCorrection(); auto correction = getViewCorrection();
getGLBackend()->setCameraCorrection(correction, _prevRenderView); getGLBackend()->setCameraCorrection(correction, _prevRenderView);
_prevRenderView = correction * _currentFrame->view; _prevRenderView = correction * _currentFrame->view;
@ -698,18 +720,18 @@ void OpenGLDisplayPlugin::present() {
// Write all layers to a local framebuffer // Write all layers to a local framebuffer
{ {
PROFILE_RANGE_EX(render, "composite", 0xff00ffff, frameId) PROFILE_RANGE_EX(render, "composite", 0xff00ffff, frameId)
compositeLayers(_currentFrame->framebuffer); compositeLayers();
} }
// Take the composite framebuffer and send it to the output device // Take the composite framebuffer and send it to the output device
{ {
PROFILE_RANGE_EX(render, "internalPresent", 0xff00ffff, frameId) PROFILE_RANGE_EX(render, "internalPresent", 0xff00ffff, frameId)
internalPresent(_currentFrame->framebuffer); internalPresent();
} }
gpu::Backend::freeGPUMemSize.set(gpu::gl::getFreeDedicatedMemory()); gpu::Backend::freeGPUMemSize.set(gpu::gl::getFreeDedicatedMemory());
} else if (alwaysPresent()) { } else if (alwaysPresent()) {
internalPresent(nullptr); internalPresent();
} }
_movingAveragePresent.addSample((float)(usecTimestampNow() - startPresent)); _movingAveragePresent.addSample((float)(usecTimestampNow() - startPresent));
} }
@ -766,12 +788,7 @@ bool OpenGLDisplayPlugin::setDisplayTexture(const QString& name) {
} }
QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const { QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const {
if (!_currentFrame || !_currentFrame->framebuffer) { auto size = _compositeFramebuffer->getSize();
return QImage();
}
auto compositeFramebuffer = _currentFrame->framebuffer;
auto size = compositeFramebuffer->getSize();
if (isHmd()) { if (isHmd()) {
size.x /= 2; size.x /= 2;
} }
@ -789,7 +806,7 @@ QImage OpenGLDisplayPlugin::getScreenshot(float aspectRatio) const {
auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend(); auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend();
QImage screenshot(bestSize.x, bestSize.y, QImage::Format_ARGB32); QImage screenshot(bestSize.x, bestSize.y, QImage::Format_ARGB32);
withOtherThreadContext([&] { withOtherThreadContext([&] {
glBackend->downloadFramebuffer(compositeFramebuffer, ivec4(corner, bestSize), screenshot); glBackend->downloadFramebuffer(_compositeFramebuffer, ivec4(corner, bestSize), screenshot);
}); });
return screenshot.mirrored(false, true); return screenshot.mirrored(false, true);
} }
@ -841,7 +858,7 @@ bool OpenGLDisplayPlugin::beginFrameRender(uint32_t frameIndex) {
} }
ivec4 OpenGLDisplayPlugin::eyeViewport(Eye eye) const { ivec4 OpenGLDisplayPlugin::eyeViewport(Eye eye) const {
auto vpSize = glm::uvec2(getRecommendedRenderSize()); uvec2 vpSize = _compositeFramebuffer->getSize();
vpSize.x /= 2; vpSize.x /= 2;
uvec2 vpPos; uvec2 vpPos;
if (eye == Eye::Right) { if (eye == Eye::Right) {
@ -874,6 +891,14 @@ void OpenGLDisplayPlugin::render(std::function<void(gpu::Batch& batch)> f) {
OpenGLDisplayPlugin::~OpenGLDisplayPlugin() { OpenGLDisplayPlugin::~OpenGLDisplayPlugin() {
} }
void OpenGLDisplayPlugin::updateCompositeFramebuffer() {
auto renderSize = glm::uvec2(getRecommendedRenderSize());
if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) {
_compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y));
// _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_SRGBA_32, renderSize.x, renderSize.y));
}
}
void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer networkTexture, QOpenGLFramebufferObject* target, GLsync* fenceSync) { void OpenGLDisplayPlugin::copyTextureToQuickFramebuffer(NetworkTexturePointer networkTexture, QOpenGLFramebufferObject* target, GLsync* fenceSync) {
#if !defined(USE_GLES) #if !defined(USE_GLES)
auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend(); auto glBackend = const_cast<OpenGLDisplayPlugin&>(*this).getGLBackend();

View file

@ -94,10 +94,14 @@ protected:
// is not populated // is not populated
virtual bool alwaysPresent() const { return false; } virtual bool alwaysPresent() const { return false; }
void updateCompositeFramebuffer();
virtual QThread::Priority getPresentPriority() { return QThread::HighPriority; } virtual QThread::Priority getPresentPriority() { return QThread::HighPriority; }
virtual void compositeLayers(const gpu::FramebufferPointer&); virtual void compositeLayers();
virtual void compositePointer(const gpu::FramebufferPointer&); virtual void compositeScene();
virtual void compositeExtra(const gpu::FramebufferPointer&) {}; virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator();
virtual void compositePointer();
virtual void compositeExtra() {};
// These functions must only be called on the presentation thread // These functions must only be called on the presentation thread
virtual void customizeContext(); virtual void customizeContext();
@ -112,10 +116,10 @@ protected:
virtual void deactivateSession() {} virtual void deactivateSession() {}
// Plugin specific functionality to send the composed scene to the output window or device // Plugin specific functionality to send the composed scene to the output window or device
virtual void internalPresent(const gpu::FramebufferPointer&); virtual void internalPresent();
void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor, const gpu::FramebufferPointer& fbo);
void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor, const gpu::FramebufferPointer& destFbo = nullptr, const gpu::FramebufferPointer& copyFbo = nullptr); void renderFromTexture(gpu::Batch& batch, const gpu::TexturePointer& texture, const glm::ivec4& viewport, const glm::ivec4& scissor);
virtual void updateFrameData(); virtual void updateFrameData();
virtual glm::mat4 getViewCorrection() { return glm::mat4(); } virtual glm::mat4 getViewCorrection() { return glm::mat4(); }
@ -138,8 +142,14 @@ protected:
gpu::FramePointer _currentFrame; gpu::FramePointer _currentFrame;
gpu::Frame* _lastFrame { nullptr }; gpu::Frame* _lastFrame { nullptr };
mat4 _prevRenderView; mat4 _prevRenderView;
gpu::FramebufferPointer _compositeFramebuffer;
gpu::PipelinePointer _hudPipeline;
gpu::PipelinePointer _mirrorHUDPipeline;
gpu::ShaderPointer _mirrorHUDPS;
gpu::PipelinePointer _simplePipeline;
gpu::PipelinePointer _presentPipeline;
gpu::PipelinePointer _cursorPipeline; gpu::PipelinePointer _cursorPipeline;
gpu::TexturePointer _displayTexture; gpu::TexturePointer _displayTexture{};
float _compositeHUDAlpha { 1.0f }; float _compositeHUDAlpha { 1.0f };
struct CursorData { struct CursorData {
@ -175,9 +185,5 @@ protected:
// be serialized through this mutex // be serialized through this mutex
mutable Mutex _presentMutex; mutable Mutex _presentMutex;
float _hudAlpha{ 1.0f }; float _hudAlpha{ 1.0f };
private:
gpu::PipelinePointer _presentPipeline;
}; };

View file

@ -24,7 +24,7 @@ public:
protected: protected:
void updatePresentPose() override; void updatePresentPose() override;
void hmdPresent(const gpu::FramebufferPointer&) override {} void hmdPresent() override {}
bool isHmdMounted() const override { return true; } bool isHmdMounted() const override { return true; }
bool internalActivate() override; bool internalActivate() override;
private: private:

View file

@ -114,23 +114,20 @@ void HmdDisplayPlugin::internalDeactivate() {
void HmdDisplayPlugin::customizeContext() { void HmdDisplayPlugin::customizeContext() {
Parent::customizeContext(); Parent::customizeContext();
_hudOperator = _hudRenderer.build(); _hudRenderer.build();
} }
void HmdDisplayPlugin::uncustomizeContext() { void HmdDisplayPlugin::uncustomizeContext() {
// This stops the weirdness where if the preview was disabled, on switching back to 2D, // This stops the weirdness where if the preview was disabled, on switching back to 2D,
// the vsync was stuck in the disabled state. No idea why that happens though. // the vsync was stuck in the disabled state. No idea why that happens though.
_disablePreview = false; _disablePreview = false;
if (_currentFrame && _currentFrame->framebuffer) { render([&](gpu::Batch& batch) {
render([&](gpu::Batch& batch) { batch.enableStereo(false);
batch.enableStereo(false); batch.resetViewTransform();
batch.resetViewTransform(); batch.setFramebuffer(_compositeFramebuffer);
batch.setFramebuffer(_currentFrame->framebuffer); batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0));
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0)); });
}); _hudRenderer = HUDRenderer();
}
_hudRenderer = {};
_previewTexture.reset(); _previewTexture.reset();
Parent::uncustomizeContext(); Parent::uncustomizeContext();
} }
@ -177,11 +174,11 @@ float HmdDisplayPlugin::getLeftCenterPixel() const {
return leftCenterPixel; return leftCenterPixel;
} }
void HmdDisplayPlugin::internalPresent(const gpu::FramebufferPointer& compositeFramebuffer) { void HmdDisplayPlugin::internalPresent() {
PROFILE_RANGE_EX(render, __FUNCTION__, 0xff00ff00, (uint64_t)presentCount()) PROFILE_RANGE_EX(render, __FUNCTION__, 0xff00ff00, (uint64_t)presentCount())
// Composite together the scene, hud and mouse cursor // Composite together the scene, hud and mouse cursor
hmdPresent(compositeFramebuffer); hmdPresent();
if (_displayTexture) { if (_displayTexture) {
// Note: _displayTexture must currently be the same size as the display. // Note: _displayTexture must currently be the same size as the display.
@ -263,7 +260,7 @@ void HmdDisplayPlugin::internalPresent(const gpu::FramebufferPointer& compositeF
viewport.z *= 2; viewport.z *= 2;
} }
renderFromTexture(batch, compositeFramebuffer->getRenderBuffer(0), viewport, scissor, nullptr, fbo); renderFromTexture(batch, _compositeFramebuffer->getRenderBuffer(0), viewport, scissor, fbo);
}); });
swapBuffers(); swapBuffers();
@ -348,7 +345,7 @@ glm::mat4 HmdDisplayPlugin::getViewCorrection() {
} }
} }
DisplayPlugin::HUDOperator HmdDisplayPlugin::HUDRenderer::build() { void HmdDisplayPlugin::HUDRenderer::build() {
vertices = std::make_shared<gpu::Buffer>(); vertices = std::make_shared<gpu::Buffer>();
indices = std::make_shared<gpu::Buffer>(); indices = std::make_shared<gpu::Buffer>();
@ -383,7 +380,7 @@ DisplayPlugin::HUDOperator HmdDisplayPlugin::HUDRenderer::build() {
indexCount = numberOfRectangles * TRIANGLE_PER_RECTANGLE * VERTEX_PER_TRANGLE; indexCount = numberOfRectangles * TRIANGLE_PER_RECTANGLE * VERTEX_PER_TRANGLE;
// Compute indices order // Compute indices order
std::vector<GLushort> indexData; std::vector<GLushort> indices;
for (int i = 0; i < stacks - 1; i++) { for (int i = 0; i < stacks - 1; i++) {
for (int j = 0; j < slices - 1; j++) { for (int j = 0; j < slices - 1; j++) {
GLushort bottomLeftIndex = i * slices + j; GLushort bottomLeftIndex = i * slices + j;
@ -391,21 +388,24 @@ DisplayPlugin::HUDOperator HmdDisplayPlugin::HUDRenderer::build() {
GLushort topLeftIndex = bottomLeftIndex + slices; GLushort topLeftIndex = bottomLeftIndex + slices;
GLushort topRightIndex = topLeftIndex + 1; GLushort topRightIndex = topLeftIndex + 1;
// FIXME make a z-order curve for better vertex cache locality // FIXME make a z-order curve for better vertex cache locality
indexData.push_back(topLeftIndex); indices.push_back(topLeftIndex);
indexData.push_back(bottomLeftIndex); indices.push_back(bottomLeftIndex);
indexData.push_back(topRightIndex); indices.push_back(topRightIndex);
indexData.push_back(topRightIndex); indices.push_back(topRightIndex);
indexData.push_back(bottomLeftIndex); indices.push_back(bottomLeftIndex);
indexData.push_back(bottomRightIndex); indices.push_back(bottomRightIndex);
} }
} }
indices->append(indexData); this->indices->append(indices);
format = std::make_shared<gpu::Stream::Format>(); // 1 for everyone format = std::make_shared<gpu::Stream::Format>(); // 1 for everyone
format->setAttribute(gpu::Stream::POSITION, gpu::Stream::POSITION, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); format->setAttribute(gpu::Stream::POSITION, gpu::Stream::POSITION, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0);
format->setAttribute(gpu::Stream::TEXCOORD, gpu::Stream::TEXCOORD, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV)); format->setAttribute(gpu::Stream::TEXCOORD, gpu::Stream::TEXCOORD, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV));
uniformsBuffer = std::make_shared<gpu::Buffer>(sizeof(Uniforms), nullptr); uniformsBuffer = std::make_shared<gpu::Buffer>(sizeof(Uniforms), nullptr);
updatePipeline();
}
void HmdDisplayPlugin::HUDRenderer::updatePipeline() {
if (!pipeline) { if (!pipeline) {
auto program = gpu::Shader::createProgram(shader::render_utils::program::hmd_ui); auto program = gpu::Shader::createProgram(shader::render_utils::program::hmd_ui);
gpu::StatePointer state = gpu::StatePointer(new gpu::State()); gpu::StatePointer state = gpu::StatePointer(new gpu::State());
@ -416,6 +416,10 @@ DisplayPlugin::HUDOperator 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(HmdDisplayPlugin& plugin) {
updatePipeline();
auto hudPipeline = pipeline; auto hudPipeline = pipeline;
auto hudFormat = format; auto hudFormat = format;
@ -424,9 +428,9 @@ DisplayPlugin::HUDOperator HmdDisplayPlugin::HUDRenderer::build() {
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, const gpu::FramebufferPointer&, const bool mirror) { return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) {
if (pipeline && hudTexture) { if (hudPipeline && hudTexture) {
batch.setPipeline(pipeline); batch.setPipeline(hudPipeline);
batch.setInputFormat(hudFormat); batch.setInputFormat(hudFormat);
gpu::BufferView posView(hudVertices, VERTEX_OFFSET, hudVertices->getSize(), VERTEX_STRIDE, hudFormat->getAttributes().at(gpu::Stream::POSITION)._element); gpu::BufferView posView(hudVertices, VERTEX_OFFSET, hudVertices->getSize(), VERTEX_STRIDE, hudFormat->getAttributes().at(gpu::Stream::POSITION)._element);
@ -450,7 +454,7 @@ DisplayPlugin::HUDOperator HmdDisplayPlugin::HUDRenderer::build() {
}; };
} }
void HmdDisplayPlugin::compositePointer(const gpu::FramebufferPointer& compositeFramebuffer) { void HmdDisplayPlugin::compositePointer() {
auto& cursorManager = Cursor::Manager::instance(); auto& cursorManager = Cursor::Manager::instance();
const auto& cursorData = _cursorsData[cursorManager.getCursor()->getIcon()]; const auto& cursorData = _cursorsData[cursorManager.getCursor()->getIcon()];
auto compositorHelper = DependencyManager::get<CompositorHelper>(); auto compositorHelper = DependencyManager::get<CompositorHelper>();
@ -459,7 +463,7 @@ void HmdDisplayPlugin::compositePointer(const gpu::FramebufferPointer& composite
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
// FIXME use standard gpu stereo rendering for this. // FIXME use standard gpu stereo rendering for this.
batch.enableStereo(false); batch.enableStereo(false);
batch.setFramebuffer(compositeFramebuffer); batch.setFramebuffer(_compositeFramebuffer);
batch.setPipeline(_cursorPipeline); batch.setPipeline(_cursorPipeline);
batch.setResourceTexture(0, cursorData.texture); batch.setResourceTexture(0, cursorData.texture);
batch.resetViewTransform(); batch.resetViewTransform();
@ -474,6 +478,10 @@ void HmdDisplayPlugin::compositePointer(const gpu::FramebufferPointer& composite
}); });
} }
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::getHUDOperator() {
return _hudRenderer.render(*this);
}
HmdDisplayPlugin::~HmdDisplayPlugin() { HmdDisplayPlugin::~HmdDisplayPlugin() {
} }

View file

@ -53,15 +53,16 @@ signals:
void hmdVisibleChanged(bool visible); void hmdVisibleChanged(bool visible);
protected: protected:
virtual void hmdPresent(const gpu::FramebufferPointer&) = 0; virtual void hmdPresent() = 0;
virtual bool isHmdMounted() const = 0; virtual bool isHmdMounted() const = 0;
virtual void postPreview() {}; virtual void postPreview() {};
virtual void updatePresentPose(); virtual void updatePresentPose();
bool internalActivate() override; bool internalActivate() override;
void internalDeactivate() override; void internalDeactivate() override;
void compositePointer(const gpu::FramebufferPointer&) override; std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() override;
void internalPresent(const gpu::FramebufferPointer&) override; void compositePointer() override;
void internalPresent() override;
void customizeContext() override; void customizeContext() override;
void uncustomizeContext() override; void uncustomizeContext() override;
void updateFrameData() override; void updateFrameData() override;
@ -119,6 +120,8 @@ private:
static const size_t TEXTURE_OFFSET { offsetof(Vertex, uv) }; static const size_t TEXTURE_OFFSET { offsetof(Vertex, uv) };
static const int VERTEX_STRIDE { sizeof(Vertex) }; static const int VERTEX_STRIDE { sizeof(Vertex) };
HUDOperator build(); void build();
void updatePipeline();
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> render(HmdDisplayPlugin& plugin);
} _hudRenderer; } _hudRenderer;
}; };

View file

@ -37,13 +37,13 @@ glm::uvec2 InterleavedStereoDisplayPlugin::getRecommendedRenderSize() const {
return result; return result;
} }
void InterleavedStereoDisplayPlugin::internalPresent(const gpu::FramebufferPointer& compositeFramebuffer) { void InterleavedStereoDisplayPlugin::internalPresent() {
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
batch.enableStereo(false); batch.enableStereo(false);
batch.resetViewTransform(); batch.resetViewTransform();
batch.setFramebuffer(gpu::FramebufferPointer()); batch.setFramebuffer(gpu::FramebufferPointer());
batch.setViewportTransform(ivec4(uvec2(0), getSurfacePixels())); batch.setViewportTransform(ivec4(uvec2(0), getSurfacePixels()));
batch.setResourceTexture(0, compositeFramebuffer->getRenderBuffer(0)); batch.setResourceTexture(0, _currentFrame->framebuffer->getRenderBuffer(0));
batch.setPipeline(_interleavedPresentPipeline); batch.setPipeline(_interleavedPresentPipeline);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
}); });

View file

@ -21,7 +21,7 @@ protected:
// initialize OpenGL context settings needed by the plugin // initialize OpenGL context settings needed by the plugin
void customizeContext() override; void customizeContext() override;
void uncustomizeContext() override; void uncustomizeContext() override;
void internalPresent(const gpu::FramebufferPointer&) override; void internalPresent() override;
private: private:
static const QString NAME; static const QString NAME;

View file

@ -245,7 +245,7 @@ void OculusMobileDisplayPlugin::updatePresentPose() {
}); });
} }
void OculusMobileDisplayPlugin::internalPresent(const gpu::FramebufferPointer& compsiteFramebuffer) { void OculusMobileDisplayPlugin::internalPresent() {
VrHandler::pollTask(); VrHandler::pollTask();
if (!vrActive()) { if (!vrActive()) {
@ -253,12 +253,8 @@ void OculusMobileDisplayPlugin::internalPresent(const gpu::FramebufferPointer& c
return; return;
} }
GLuint sourceTexture = 0; auto sourceTexture = getGLBackend()->getTextureID(_compositeFramebuffer->getRenderBuffer(0));
glm::uvec2 sourceSize; glm::uvec2 sourceSize{ _compositeFramebuffer->getWidth(), _compositeFramebuffer->getHeight() };
if (compsiteFramebuffer) {
sourceTexture = getGLBackend()->getTextureID(compsiteFramebuffer->getRenderBuffer(0));
sourceSize = { compsiteFramebuffer->getWidth(), compsiteFramebuffer->getHeight() };
}
VrHandler::presentFrame(sourceTexture, sourceSize, presentTracking); VrHandler::presentFrame(sourceTexture, sourceSize, presentTracking);
_presentRate.increment(); _presentRate.increment();
} }

View file

@ -54,8 +54,8 @@ protected:
void uncustomizeContext() override; void uncustomizeContext() override;
void updatePresentPose() override; void updatePresentPose() override;
void internalPresent(const gpu::FramebufferPointer&) override; void internalPresent() override;
void hmdPresent(const gpu::FramebufferPointer&) override { throw std::runtime_error("Unused"); } void hmdPresent() override { throw std::runtime_error("Unused"); }
bool isHmdMounted() const override; bool isHmdMounted() const override;
bool alwaysPresent() const override { return true; } bool alwaysPresent() const override { return true; }

View file

@ -2,12 +2,6 @@
#include <NumericalConstants.h> #include <NumericalConstants.h>
const DisplayPlugin::HUDOperator DisplayPlugin::DEFAULT_HUD_OPERATOR{ std::function<void(gpu::Batch&, const gpu::TexturePointer&, const gpu::FramebufferPointer&, bool mirror)>() };
DisplayPlugin::DisplayPlugin() : _hudOperator{ DEFAULT_HUD_OPERATOR } {
}
int64_t DisplayPlugin::getPaintDelayUsecs() const { int64_t DisplayPlugin::getPaintDelayUsecs() const {
std::lock_guard<std::mutex> lock(_paintDelayMutex); std::lock_guard<std::mutex> lock(_paintDelayMutex);
return _paintDelayTimer.isValid() ? _paintDelayTimer.nsecsElapsed() / NSECS_PER_USEC : 0; return _paintDelayTimer.isValid() ? _paintDelayTimer.nsecsElapsed() / NSECS_PER_USEC : 0;
@ -41,8 +35,8 @@ void DisplayPlugin::waitForPresent() {
} }
} }
std::function<void(gpu::Batch&, const gpu::TexturePointer&, const gpu::FramebufferPointer& compositeFramebuffer, bool mirror)> DisplayPlugin::getHUDOperator() { std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> DisplayPlugin::getHUDOperator() {
HUDOperator hudOperator; std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> hudOperator;
{ {
QMutexLocker locker(&_presentMutex); QMutexLocker locker(&_presentMutex);
hudOperator = _hudOperator; hudOperator = _hudOperator;
@ -54,5 +48,3 @@ glm::mat4 HmdDisplay::getEyeToHeadTransform(Eye eye) const {
static const glm::mat4 xform; static const glm::mat4 xform;
return xform; return xform;
} }

View file

@ -121,8 +121,6 @@ class DisplayPlugin : public Plugin, public HmdDisplay {
Q_OBJECT Q_OBJECT
using Parent = Plugin; using Parent = Plugin;
public: public:
DisplayPlugin();
virtual int getRequiredThreadCount() const { return 0; } virtual int getRequiredThreadCount() const { return 0; }
virtual bool isHmd() const { return false; } virtual bool isHmd() const { return false; }
virtual int getHmdScreen() const { return -1; } virtual int getHmdScreen() const { return -1; }
@ -216,8 +214,7 @@ public:
void waitForPresent(); void waitForPresent();
float getAveragePresentTime() { return _movingAveragePresent.average / (float)USECS_PER_MSEC; } // in msec float getAveragePresentTime() { return _movingAveragePresent.average / (float)USECS_PER_MSEC; } // in msec
using HUDOperator = std::function<void(gpu::Batch&, const gpu::TexturePointer&, const gpu::FramebufferPointer&, bool mirror)>; std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator();
virtual HUDOperator getHUDOperator() final;
static const QString& MENU_PATH(); static const QString& MENU_PATH();
@ -234,8 +231,7 @@ protected:
gpu::ContextPointer _gpuContext; gpu::ContextPointer _gpuContext;
static const HUDOperator DEFAULT_HUD_OPERATOR; std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> _hudOperator { std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)>() };
HUDOperator _hudOperator;
MovingAverage<float, 10> _movingAveragePresent; MovingAverage<float, 10> _movingAveragePresent;

View file

@ -126,8 +126,8 @@ void CompositeHUD::run(const RenderContextPointer& renderContext, const gpu::Fra
if (inputs) { if (inputs) {
batch.setFramebuffer(inputs); batch.setFramebuffer(inputs);
} }
if (renderContext->args->_hudOperator && renderContext->args->_blitFramebuffer) { if (renderContext->args->_hudOperator) {
renderContext->args->_hudOperator(batch, renderContext->args->_hudTexture, renderContext->args->_blitFramebuffer, renderContext->args->_renderMode == RenderArgs::RenderMode::MIRROR_RENDER_MODE); renderContext->args->_hudOperator(batch, renderContext->args->_hudTexture, renderContext->args->_renderMode == RenderArgs::RenderMode::MIRROR_RENDER_MODE);
} }
}); });
#endif #endif

View file

@ -131,7 +131,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&, const gpu::FramebufferPointer&, bool mirror)> _hudOperator; std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> _hudOperator;
gpu::TexturePointer _hudTexture; gpu::TexturePointer _hudTexture;
}; };

View file

@ -16,7 +16,7 @@ public:
bool isSupported() const override; bool isSupported() const override;
protected: protected:
void hmdPresent(const gpu::FramebufferPointer&) override {} void hmdPresent() override {}
bool isHmdMounted() const override { return true; } bool isHmdMounted() const override { return true; }
private: private:

View file

@ -108,16 +108,13 @@ void OculusDisplayPlugin::customizeContext() {
} }
void OculusDisplayPlugin::uncustomizeContext() { void OculusDisplayPlugin::uncustomizeContext() {
#if 0 #if 0
if (_currentFrame && _currentFrame->framebuffer) { // Present a final black frame to the HMD
// Present a final black frame to the HMD _compositeFramebuffer->Bound(FramebufferTarget::Draw, [] {
_currentFrame->framebuffer->Bound(FramebufferTarget::Draw, [] { Context::ClearColor(0, 0, 0, 1);
Context::ClearColor(0, 0, 0, 1); Context::Clear().ColorBuffer();
Context::Clear().ColorBuffer(); });
}); hmdPresent();
hmdPresent();
}
#endif #endif
ovr_DestroyTextureSwapChain(_session, _textureSwapChain); ovr_DestroyTextureSwapChain(_session, _textureSwapChain);
@ -130,7 +127,7 @@ void OculusDisplayPlugin::uncustomizeContext() {
static const uint64_t FRAME_BUDGET = (11 * USECS_PER_MSEC); static const uint64_t FRAME_BUDGET = (11 * USECS_PER_MSEC);
static const uint64_t FRAME_OVER_BUDGET = (15 * USECS_PER_MSEC); static const uint64_t FRAME_OVER_BUDGET = (15 * USECS_PER_MSEC);
void OculusDisplayPlugin::hmdPresent(const gpu::FramebufferPointer& compositeFramebuffer) { void OculusDisplayPlugin::hmdPresent() {
static uint64_t lastSubmitEnd = 0; static uint64_t lastSubmitEnd = 0;
if (!_customized) { if (!_customized) {
@ -160,8 +157,15 @@ void OculusDisplayPlugin::hmdPresent(const gpu::FramebufferPointer& compositeFra
auto fbo = getGLBackend()->getFramebufferID(_outputFramebuffer); auto fbo = getGLBackend()->getFramebufferID(_outputFramebuffer);
glNamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0, curTexId, 0); glNamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0, curTexId, 0);
render([&](gpu::Batch& batch) { render([&](gpu::Batch& batch) {
auto viewport = ivec4(uvec2(), _outputFramebuffer->getSize()); batch.enableStereo(false);
renderFromTexture(batch, compositeFramebuffer->getRenderBuffer(0), viewport, viewport, _outputFramebuffer); batch.setFramebuffer(_outputFramebuffer);
batch.setViewportTransform(ivec4(uvec2(), _outputFramebuffer->getSize()));
batch.setStateScissorRect(ivec4(uvec2(), _outputFramebuffer->getSize()));
batch.resetViewTransform();
batch.setProjectionTransform(mat4());
batch.setPipeline(_presentPipeline);
batch.setResourceTexture(0, _compositeFramebuffer->getRenderBuffer(0));
batch.draw(gpu::TRIANGLE_STRIP, 4);
}); });
glNamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0, 0, 0); glNamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0, 0, 0);
} }

View file

@ -28,7 +28,7 @@ protected:
QThread::Priority getPresentPriority() override { return QThread::TimeCriticalPriority; } QThread::Priority getPresentPriority() override { return QThread::TimeCriticalPriority; }
bool internalActivate() override; bool internalActivate() override;
void hmdPresent(const gpu::FramebufferPointer&) override; void hmdPresent() override;
bool isHmdMounted() const override; bool isHmdMounted() const override;
void customizeContext() override; void customizeContext() override;
void uncustomizeContext() override; void uncustomizeContext() override;

View file

@ -237,7 +237,7 @@ void OculusLegacyDisplayPlugin::uncustomizeContext() {
Parent::uncustomizeContext(); Parent::uncustomizeContext();
} }
void OculusLegacyDisplayPlugin::hmdPresent(const gpu::FramebufferPointer& compositeFramebuffer) { void OculusLegacyDisplayPlugin::hmdPresent() {
if (!_hswDismissed) { if (!_hswDismissed) {
ovrHSWDisplayState hswState; ovrHSWDisplayState hswState;
ovrHmd_GetHSWDisplayState(_hmd, &hswState); ovrHmd_GetHSWDisplayState(_hmd, &hswState);
@ -252,7 +252,7 @@ void OculusLegacyDisplayPlugin::hmdPresent(const gpu::FramebufferPointer& compos
memset(eyePoses, 0, sizeof(ovrPosef) * 2); memset(eyePoses, 0, sizeof(ovrPosef) * 2);
eyePoses[0].Orientation = eyePoses[1].Orientation = ovrRotation; eyePoses[0].Orientation = eyePoses[1].Orientation = ovrRotation;
GLint texture = getGLBackend()->getTextureID(compositeFramebuffer->getRenderBuffer(0)); GLint texture = getGLBackend()->getTextureID(_compositeFramebuffer->getRenderBuffer(0));
auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush(); glFlush();
if (_hmdWindow->makeCurrent()) { if (_hmdWindow->makeCurrent()) {

View file

@ -39,7 +39,7 @@ protected:
void customizeContext() override; void customizeContext() override;
void uncustomizeContext() override; void uncustomizeContext() override;
void hmdPresent(const gpu::FramebufferPointer&) override; void hmdPresent() override;
bool isHmdMounted() const override { return true; } bool isHmdMounted() const override { return true; }
private: private:

View file

@ -511,13 +511,13 @@ void OpenVrDisplayPlugin::customizeContext() {
Parent::customizeContext(); Parent::customizeContext();
if (_threadedSubmit) { if (_threadedSubmit) {
// _compositeInfos[0].texture = _compositeFramebuffer->getRenderBuffer(0); _compositeInfos[0].texture = _compositeFramebuffer->getRenderBuffer(0);
for (size_t i = 0; i < COMPOSITING_BUFFER_SIZE; ++i) { for (size_t i = 0; i < COMPOSITING_BUFFER_SIZE; ++i) {
// if (0 != i) { if (0 != i) {
_compositeInfos[i].texture = gpu::Texture::createRenderBuffer(gpu::Element::COLOR_RGBA_32, _renderTargetSize.x, _compositeInfos[i].texture = gpu::Texture::createRenderBuffer(gpu::Element::COLOR_RGBA_32, _renderTargetSize.x,
_renderTargetSize.y, gpu::Texture::SINGLE_MIP, _renderTargetSize.y, gpu::Texture::SINGLE_MIP,
gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT)); gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT));
// } }
_compositeInfos[i].textureID = getGLBackend()->getTextureID(_compositeInfos[i].texture); _compositeInfos[i].textureID = getGLBackend()->getTextureID(_compositeInfos[i].texture);
} }
_submitThread->_canvas = _submitCanvas; _submitThread->_canvas = _submitCanvas;
@ -613,17 +613,17 @@ bool OpenVrDisplayPlugin::beginFrameRender(uint32_t frameIndex) {
return Parent::beginFrameRender(frameIndex); return Parent::beginFrameRender(frameIndex);
} }
void OpenVrDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& compositeFramebuffer) { void OpenVrDisplayPlugin::compositeLayers() {
if (_threadedSubmit) { if (_threadedSubmit) {
++_renderingIndex; ++_renderingIndex;
_renderingIndex %= COMPOSITING_BUFFER_SIZE; _renderingIndex %= COMPOSITING_BUFFER_SIZE;
auto& newComposite = _compositeInfos[_renderingIndex]; auto& newComposite = _compositeInfos[_renderingIndex];
newComposite.pose = _currentPresentFrameInfo.presentPose; newComposite.pose = _currentPresentFrameInfo.presentPose;
compositeFramebuffer->setRenderBuffer(0, newComposite.texture); _compositeFramebuffer->setRenderBuffer(0, newComposite.texture);
} }
Parent::compositeLayers(compositeFramebuffer); Parent::compositeLayers();
if (_threadedSubmit) { if (_threadedSubmit) {
auto& newComposite = _compositeInfos[_renderingIndex]; auto& newComposite = _compositeInfos[_renderingIndex];
@ -645,13 +645,13 @@ void OpenVrDisplayPlugin::compositeLayers(const gpu::FramebufferPointer& composi
} }
} }
void OpenVrDisplayPlugin::hmdPresent(const gpu::FramebufferPointer& compositeFramebuffer) { void OpenVrDisplayPlugin::hmdPresent() {
PROFILE_RANGE_EX(render, __FUNCTION__, 0xff00ff00, (uint64_t)_currentFrame->frameIndex) PROFILE_RANGE_EX(render, __FUNCTION__, 0xff00ff00, (uint64_t)_currentFrame->frameIndex)
if (_threadedSubmit) { if (_threadedSubmit) {
_submitThread->waitForPresent(); _submitThread->waitForPresent();
} else { } else {
GLuint glTexId = getGLBackend()->getTextureID(compositeFramebuffer->getRenderBuffer(0)); GLuint glTexId = getGLBackend()->getTextureID(_compositeFramebuffer->getRenderBuffer(0));
vr::Texture_t vrTexture{ (void*)(uintptr_t)glTexId, vr::TextureType_OpenGL, vr::ColorSpace_Auto }; vr::Texture_t vrTexture{ (void*)(uintptr_t)glTexId, vr::TextureType_OpenGL, vr::ColorSpace_Auto };
vr::VRCompositor()->Submit(vr::Eye_Left, &vrTexture, &OPENVR_TEXTURE_BOUNDS_LEFT); vr::VRCompositor()->Submit(vr::Eye_Left, &vrTexture, &OPENVR_TEXTURE_BOUNDS_LEFT);
vr::VRCompositor()->Submit(vr::Eye_Right, &vrTexture, &OPENVR_TEXTURE_BOUNDS_RIGHT); vr::VRCompositor()->Submit(vr::Eye_Right, &vrTexture, &OPENVR_TEXTURE_BOUNDS_RIGHT);

View file

@ -72,8 +72,8 @@ protected:
void internalDeactivate() override; void internalDeactivate() override;
void updatePresentPose() override; void updatePresentPose() override;
void compositeLayers(const gpu::FramebufferPointer&) override; void compositeLayers() override;
void hmdPresent(const gpu::FramebufferPointer&) override; void hmdPresent() override;
bool isHmdMounted() const override; bool isHmdMounted() const override;
void postPreview() override; void postPreview() override;