diff options
Diffstat (limited to 'examples/quick/rendercontrol')
-rw-r--r-- | examples/quick/rendercontrol/main.cpp | 16 | ||||
-rw-r--r-- | examples/quick/rendercontrol/window_singlethreaded.cpp | 46 | ||||
-rw-r--r-- | examples/quick/rendercontrol/window_singlethreaded.h | 2 |
3 files changed, 54 insertions, 10 deletions
diff --git a/examples/quick/rendercontrol/main.cpp b/examples/quick/rendercontrol/main.cpp index c9c7eeb525..71903045cc 100644 --- a/examples/quick/rendercontrol/main.cpp +++ b/examples/quick/rendercontrol/main.cpp @@ -49,6 +49,8 @@ ****************************************************************************/ #include <QGuiApplication> +#include <QCommandLineParser> +#include <QCommandLineOption> #include "window_singlethreaded.h" #include "window_multithreaded.h" @@ -56,8 +58,20 @@ int main(int argc, char **argv) { QGuiApplication app(argc, argv); + QCoreApplication::setApplicationName("Qt Render Control Example"); + QCoreApplication::setOrganizationName("QtProject"); + QCoreApplication::setApplicationVersion(QT_VERSION_STR); + QCommandLineParser parser; + parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption threadedOption("threaded", "Threaded Rendering"); + parser.addOption(threadedOption); + + parser.process(app); + QScopedPointer<QWindow> window; - if (QCoreApplication::arguments().contains(QLatin1String("--threaded"))) { + if (parser.isSet(threadedOption)) { qWarning("Using separate Qt Quick render thread"); window.reset(new WindowMultiThreaded); } else { diff --git a/examples/quick/rendercontrol/window_singlethreaded.cpp b/examples/quick/rendercontrol/window_singlethreaded.cpp index 1dee8b9f74..7a7b4f57e9 100644 --- a/examples/quick/rendercontrol/window_singlethreaded.cpp +++ b/examples/quick/rendercontrol/window_singlethreaded.cpp @@ -92,6 +92,10 @@ WindowSingleThreaded::WindowSingleThreaded() { setSurfaceType(QSurface::OpenGLSurface); + // The rendercontrol does not necessarily need an FBO. Demonstrate this + // when requested. + m_onscreen = QCoreApplication::arguments().contains(QStringLiteral("--onscreen")); + QSurfaceFormat format; // Qt Quick may need a depth and stencil buffer. Always make sure these are available. format.setDepthBufferSize(16); @@ -174,8 +178,14 @@ void WindowSingleThreaded::createFbo() // The scene graph has been initialized. It is now time to create an FBO and associate // it with the QQuickWindow. m_dpr = devicePixelRatio(); - m_fbo = new QOpenGLFramebufferObject(size() * m_dpr, QOpenGLFramebufferObject::CombinedDepthStencil); - m_quickWindow->setRenderTarget(m_fbo); + if (!m_onscreen) { + m_fbo = new QOpenGLFramebufferObject(size() * m_dpr, QOpenGLFramebufferObject::CombinedDepthStencil); + m_quickWindow->setRenderTarget(m_fbo); + } else { + // Special case: No FBO. Render directly to the window's default framebuffer. + m_onscreenSize = size() * m_dpr; + m_quickWindow->setRenderTarget(0, m_onscreenSize); + } } void WindowSingleThreaded::destroyFbo() @@ -186,7 +196,10 @@ void WindowSingleThreaded::destroyFbo() void WindowSingleThreaded::render() { - if (!m_context->makeCurrent(m_offscreenSurface)) + QSurface *surface = m_offscreenSurface; + if (m_onscreen) + surface = this; + if (!m_context->makeCurrent(surface)) return; // Polish, synchronize and render the next frame (into our fbo). In this example @@ -205,7 +218,10 @@ void WindowSingleThreaded::render() m_quickReady = true; // Get something onto the screen. - m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0); + if (!m_onscreen) + m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0); + else + m_context->swapBuffers(this); } void WindowSingleThreaded::requestUpdate() @@ -247,7 +263,10 @@ void WindowSingleThreaded::run() updateSizes(); // Initialize the render control and our OpenGL resources. - m_context->makeCurrent(m_offscreenSurface); + QSurface *surface = m_offscreenSurface; + if (m_onscreen) + surface = this; + m_context->makeCurrent(surface); m_renderControl->initialize(m_context); m_quickInitialized = true; } @@ -276,7 +295,8 @@ void WindowSingleThreaded::exposeEvent(QExposeEvent *) { if (isExposed()) { if (!m_quickInitialized) { - m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0); + if (!m_onscreen) + m_cubeRenderer->render(this, m_context, m_quickReady ? m_fbo->texture() : 0); startQuick(QStringLiteral("qrc:/rendercontrol/demo.qml")); } } @@ -284,7 +304,10 @@ void WindowSingleThreaded::exposeEvent(QExposeEvent *) void WindowSingleThreaded::resizeFbo() { - if (m_rootItem && m_context->makeCurrent(m_offscreenSurface)) { + QSurface *surface = m_offscreenSurface; + if (m_onscreen) + surface = this; + if (m_rootItem && m_context->makeCurrent(surface)) { delete m_fbo; createFbo(); m_context->doneCurrent(); @@ -297,8 +320,13 @@ void WindowSingleThreaded::resizeEvent(QResizeEvent *) { // If this is a resize after the scene is up and running, recreate the fbo and the // Quick item and scene. - if (m_fbo && m_fbo->size() != size() * devicePixelRatio()) - resizeFbo(); + if (!m_onscreen) { + if (m_fbo && m_fbo->size() != size() * devicePixelRatio()) + resizeFbo(); + } else { + if (m_onscreenSize != size() * devicePixelRatio()) + resizeFbo(); + } } void WindowSingleThreaded::handleScreenChange() diff --git a/examples/quick/rendercontrol/window_singlethreaded.h b/examples/quick/rendercontrol/window_singlethreaded.h index dadd9daf7e..8ec64eb6f5 100644 --- a/examples/quick/rendercontrol/window_singlethreaded.h +++ b/examples/quick/rendercontrol/window_singlethreaded.h @@ -107,6 +107,8 @@ private: QTimer m_updateTimer; CubeRenderer *m_cubeRenderer; qreal m_dpr; + bool m_onscreen; + QSize m_onscreenSize; }; #endif |