Restoring preview and removing excessive GL state sync

This commit is contained in:
Brad Davis 2016-08-04 18:52:37 -07:00
parent c6848a1b55
commit 9cd1d69f1e
2 changed files with 36 additions and 26 deletions

View file

@ -386,7 +386,6 @@ void OpenGLDisplayPlugin::customizeContext() {
auto renderSize = getRecommendedRenderSize(); auto renderSize = getRecommendedRenderSize();
_compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y)); _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y));
_compositeTexture = _compositeFramebuffer->getRenderBuffer(0); _compositeTexture = _compositeFramebuffer->getRenderBuffer(0);
} }
void OpenGLDisplayPlugin::uncustomizeContext() { void OpenGLDisplayPlugin::uncustomizeContext() {
@ -545,6 +544,7 @@ void OpenGLDisplayPlugin::compositeLayers() {
PROFILE_RANGE_EX("compositeScene", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX("compositeScene", 0xff0077ff, (uint64_t)presentCount())
compositeScene(); compositeScene();
} }
{ {
PROFILE_RANGE_EX("compositeOverlay", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX("compositeOverlay", 0xff0077ff, (uint64_t)presentCount())
compositeOverlay(); compositeOverlay();
@ -554,6 +554,7 @@ void OpenGLDisplayPlugin::compositeLayers() {
PROFILE_RANGE_EX("compositePointer", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX("compositePointer", 0xff0077ff, (uint64_t)presentCount())
compositePointer(); compositePointer();
} }
{ {
PROFILE_RANGE_EX("compositeExtra", 0xff0077ff, (uint64_t)presentCount()) PROFILE_RANGE_EX("compositeExtra", 0xff0077ff, (uint64_t)presentCount())
compositeExtra(); compositeExtra();
@ -579,7 +580,6 @@ void OpenGLDisplayPlugin::present() {
incrementPresentCount(); incrementPresentCount();
if (_currentFrame) { if (_currentFrame) {
_backend->syncCache();
_backend->setStereoState(_currentFrame->stereoState); _backend->setStereoState(_currentFrame->stereoState);
{ {
PROFILE_RANGE_EX("execute", 0xff00ff00, (uint64_t)presentCount()) PROFILE_RANGE_EX("execute", 0xff00ff00, (uint64_t)presentCount())
@ -587,7 +587,6 @@ void OpenGLDisplayPlugin::present() {
for (auto& batch : _currentFrame->batches) { for (auto& batch : _currentFrame->batches) {
_backend->render(batch); _backend->render(batch);
} }
} }
// Write all layers to a local framebuffer // Write all layers to a local framebuffer

View file

@ -1,4 +1,4 @@
// //
// Created by Bradley Austin Davis on 2016/02/15 // Created by Bradley Austin Davis on 2016/02/15
// Copyright 2016 High Fidelity, Inc. // Copyright 2016 High Fidelity, Inc.
// //
@ -124,10 +124,7 @@ void HmdDisplayPlugin::uncustomizeContext() {
void HmdDisplayPlugin::internalPresent() { void HmdDisplayPlugin::internalPresent() {
PROFILE_RANGE_EX(__FUNCTION__, 0xff00ff00, (uint64_t)presentCount()) PROFILE_RANGE_EX(__FUNCTION__, 0xff00ff00, (uint64_t)presentCount())
// Composite together the scene, overlay and mouse cursor if (_enablePreview) {
hmdPresent();
if (false && _enablePreview) {
// screen preview mirroring // screen preview mirroring
auto window = _container->getPrimaryWidget(); auto window = _container->getPrimaryWidget();
auto devicePixelRatio = window->devicePixelRatio(); auto devicePixelRatio = window->devicePixelRatio();
@ -154,25 +151,39 @@ void HmdDisplayPlugin::internalPresent() {
targetViewportPosition.y = (windowSize.y - targetViewportSize.y) / 2; targetViewportPosition.y = (windowSize.y - targetViewportSize.y) / 2;
} }
render([&](gpu::Batch& batch) { if (_currentFrame && _currentFrame->framebuffer) {
batch.enableStereo(false); render([&](gpu::Batch& batch) {
batch.clearViewTransform(); batch.enableStereo(false);
batch.setFramebuffer(gpu::FramebufferPointer()); batch.clearViewTransform();
batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0)); batch.setFramebuffer(gpu::FramebufferPointer());
batch.setViewportTransform(ivec4(uvec2(0), windowSize)); batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, vec4(0));
if (_monoPreview) { batch.setViewportTransform(ivec4(uvec2(0), windowSize));
batch.setStateScissorRect(ivec4(targetViewportPosition, targetViewportSize)); if (_monoPreview) {
targetViewportSize.x *= 2; batch.setStateScissorRect(ivec4(targetViewportPosition, targetViewportSize));
batch.setViewportTransform(ivec4(targetViewportPosition, targetViewportSize)); targetViewportSize.x *= 2;
} else { batch.setViewportTransform(ivec4(targetViewportPosition, targetViewportSize));
batch.setStateScissorRect(ivec4(targetViewportPosition, targetViewportSize)); } else {
batch.setViewportTransform(ivec4(targetViewportPosition, targetViewportSize)); batch.setStateScissorRect(ivec4(targetViewportPosition, targetViewportSize));
} batch.setViewportTransform(ivec4(targetViewportPosition, targetViewportSize));
batch.setResourceTexture(0, _compositeTexture); }
batch.setPipeline(_presentPipeline); batch.setResourceTexture(0, _compositeTexture);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.setPipeline(_presentPipeline);
}); batch.draw(gpu::TRIANGLE_STRIP, 4);
});
}
}
// Composite together the scene, overlay and mouse cursor
hmdPresent();
if (_enablePreview) {
glFinish();
auto startSwapTime = usecTimestampNow();
swapBuffers(); swapBuffers();
auto swapTime = usecTimestampNow() - startSwapTime;
if (swapTime > USECS_PER_MSEC) {
qDebug() << "Swap took " << swapTime << " us";
}
} }
postPreview(); postPreview();