mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 15:47:02 +02:00
Revert "Remove _compositeFramebuffer from display plugins"
This reverts commit cb311408c6
.
This commit is contained in:
parent
451b2eb391
commit
44fc0d21db
22 changed files with 211 additions and 181 deletions
|
@ -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;
|
||||||
|
|
|
@ -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 {};
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue