From 31190140c3aa11570f4c07ca2cb62b2bfe96a131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 21 Aug 2017 22:36:27 +0200 Subject: iOS: Remove support for OpenGL-backed QBackingStore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The default on iOS has been raster for two years now, as of 3e892e4a97, and we haven't seen any major performance regressions that would warrant keeping the OpenGL based code-path alive. This includes the default surface format, which was ony set so that QPainter clip regions would work when using the GL backed backing store. Change-Id: I37b880a758b9c3fad1f23ae60268629ffbe9bc3e Reviewed-by: Richard Moe Gustavsen Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/ios/qiosbackingstore.h | 9 -- src/plugins/platforms/ios/qiosbackingstore.mm | 139 +++----------------------- src/plugins/platforms/ios/qiosintegration.mm | 5 - 3 files changed, 12 insertions(+), 141 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/ios/qiosbackingstore.h b/src/plugins/platforms/ios/qiosbackingstore.h index 1c072c0935..3954347471 100644 --- a/src/plugins/platforms/ios/qiosbackingstore.h +++ b/src/plugins/platforms/ios/qiosbackingstore.h @@ -54,19 +54,10 @@ public: QIOSBackingStore(QWindow *window); ~QIOSBackingStore(); - QPaintDevice *paintDevice() Q_DECL_OVERRIDE; - - void beginPaint(const QRegion &) Q_DECL_OVERRIDE; - void endPaint() Q_DECL_OVERRIDE; - void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) Q_DECL_OVERRIDE; - void resize(const QSize &size, const QRegion &staticContents) Q_DECL_OVERRIDE; - - void makeCurrent(); private: QOpenGLContext *m_context; - QOpenGLPaintDevice *m_glDevice; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosbackingstore.mm b/src/plugins/platforms/ios/qiosbackingstore.mm index 96be28af81..74229684e3 100644 --- a/src/plugins/platforms/ios/qiosbackingstore.mm +++ b/src/plugins/platforms/ios/qiosbackingstore.mm @@ -41,79 +41,31 @@ #include "qioswindow.h" #include -#include -#include -#include -#include #include #include QT_BEGIN_NAMESPACE -class QIOSPaintDevice : public QOpenGLPaintDevice -{ -public: - QIOSPaintDevice(QIOSBackingStore *backingStore) : m_backingStore(backingStore) { } - void ensureActiveTarget() Q_DECL_OVERRIDE; - -private: - QIOSBackingStore *m_backingStore; -}; - -void QIOSPaintDevice::ensureActiveTarget() -{ - m_backingStore->makeCurrent(); -} - /*! \class QIOSBackingStore - \brief The QPlatformBackingStore on iOS. - QBackingStore enables the use of QPainter to paint on a QWindow, as opposed to rendering to a QWindow through the use of OpenGL with QOpenGLContext. - - Historically, the iOS port initially implemented the backing store by using - an QOpenGLPaintDevice as its paint device, triggering the use of the OpenGL - paint engine for QPainter based drawing. This was due to raster drawing - operations being too slow when not being NEON-optimized, and got the port - up and running quickly. - - As of 3e892e4a97, released in Qt 5.7, the backing store now uses a QImage, - for its paint device, giving normal raster-based QPainter operations, and - enabling features such as antialiased drawing. - - To account for regressions in performance, the old code path is still - available by setting the surface type of the QWindow to OpenGLSurface. - This surface type is normally used when rendering though QOpenGLContext, - but will in the case of QIOSBackingStore trigger the old OpenGL based - painter. - - This fallback path is not too intrusive, as the QImage based path still - uses OpenGL to composite the image at flush() time using composeAndFlush. */ QIOSBackingStore::QIOSBackingStore(QWindow *window) : QRasterBackingStore(window) , m_context(new QOpenGLContext) - , m_glDevice(nullptr) { - QSurfaceFormat fmt = window->requestedFormat(); - - // Due to sharing QIOSContext redirects our makeCurrent on window() attempts to - // the global share context. Hence it is essential to have a compatible format. - fmt.setDepthBufferSize(QSurfaceFormat::defaultFormat().depthBufferSize()); - fmt.setStencilBufferSize(QSurfaceFormat::defaultFormat().stencilBufferSize()); - - if (fmt.depthBufferSize() == 0) - qWarning("No depth in default format, expect rendering errors"); - // We use the surface both for raster operations and for GL drawing (when // we blit the raster image), so the type needs to cover both use cases. if (window->surfaceType() == QSurface::RasterSurface) window->setSurfaceType(QSurface::RasterGLSurface); - m_context->setFormat(fmt); + Q_ASSERT_X(window->surfaceType() != QSurface::OpenGLSurface, "QIOSBackingStore", + "QBackingStore on iOS can only be used with raster-enabled surfaces."); + + m_context->setFormat(window->requestedFormat()); m_context->setScreen(window->screen()); Q_ASSERT(QOpenGLContext::globalShareContext()); m_context->setShareContext(QOpenGLContext::globalShareContext()); @@ -122,54 +74,12 @@ QIOSBackingStore::QIOSBackingStore(QWindow *window) QIOSBackingStore::~QIOSBackingStore() { - if (window()->surfaceType() == QSurface::RasterGLSurface) { - // We're using composeAndFlush from QPlatformBackingStore, which - // need to clean up any textures in its destructor, so make the - // context current and keep it alive until QPlatformBackingStore - // has cleaned up everything. - makeCurrent(); - m_context->deleteLater(); - } else { - delete m_context; - } - - delete m_glDevice; -} - -void QIOSBackingStore::makeCurrent() -{ - if (!m_context->makeCurrent(window())) - qWarning("QIOSBackingStore: makeCurrent() failed"); -} - -void QIOSBackingStore::beginPaint(const QRegion ®ion) -{ - makeCurrent(); - - if (!m_glDevice) - m_glDevice = new QIOSPaintDevice(this); - - if (window()->surfaceType() == QSurface::RasterGLSurface) - QRasterBackingStore::beginPaint(region); -} - -void QIOSBackingStore::endPaint() -{ -} - -QPaintDevice *QIOSBackingStore::paintDevice() -{ - Q_ASSERT(m_glDevice); - - // Keep paint device size and device pixel ratio in sync with window - qreal devicePixelRatio = window()->devicePixelRatio(); - m_glDevice->setSize(window()->size() * devicePixelRatio); - m_glDevice->setDevicePixelRatio(devicePixelRatio); - - if (window()->surfaceType() == QSurface::RasterGLSurface) - return QRasterBackingStore::paintDevice(); - else - return m_glDevice; + // We're using composeAndFlush from QPlatformBackingStore, which + // need to clean up any textures in its destructor, so make the + // context current and keep it alive until QPlatformBackingStore + // has cleaned up everything. + m_context->makeCurrent(window()); + m_context->deleteLater(); } void QIOSBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoint &offset) @@ -187,33 +97,8 @@ void QIOSBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoin return; } - if (window->surfaceType() == QSurface::RasterGLSurface) { - static QPlatformTextureList emptyTextureList; - composeAndFlush(window, region, offset, &emptyTextureList, m_context, false); - } else { - m_context->makeCurrent(window); - m_context->swapBuffers(window); - } -} - -void QIOSBackingStore::resize(const QSize &size, const QRegion &staticContents) -{ - Q_UNUSED(staticContents); - - if (window()->surfaceType() == QSurface::OpenGLSurface) { - // Resizing the backing store would in this case mean resizing the QWindow, - // as we use an QOpenGLPaintDevice that we target at the window. That's - // probably not what the user intended, so we ignore resizes of the backing - // store and always keep the paint device's size in sync with the window - // size in beginPaint(). - - if (size != window()->size() && !window()->inherits("QWidgetWindow")) - qWarning("QIOSBackingStore needs to have the same size as its window"); - - return; - } - - QRasterBackingStore::resize(size, staticContents); + static QPlatformTextureList emptyTextureList; + composeAndFlush(window, region, offset, &emptyTextureList, m_context, false); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index 5c42828885..482f996943 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -97,11 +97,6 @@ QIOSIntegration::QIOSIntegration() // The backingstore needs a global share context in order to support composition in // QPlatformBackingStore. qApp->setAttribute(Qt::AA_ShareOpenGLContexts, true); - // And that context must match the format used for the backingstore's context. - QSurfaceFormat fmt = QSurfaceFormat::defaultFormat(); - fmt.setDepthBufferSize(16); - fmt.setStencilBufferSize(8); - QSurfaceFormat::setDefaultFormat(fmt); // Set current directory to app bundle folder QDir::setCurrent(QString::fromUtf8([[[NSBundle mainBundle] bundlePath] UTF8String])); -- cgit v1.2.3