iOS: Remove support for OpenGL-backed QBackingStore

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 <richard.gustavsen@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Tor Arne Vestbø 2017-08-21 22:36:27 +02:00
parent 7b1a3ba027
commit 31190140c3
3 changed files with 12 additions and 141 deletions

View File

@ -54,19 +54,10 @@ public:
QIOSBackingStore(QWindow *window); QIOSBackingStore(QWindow *window);
~QIOSBackingStore(); ~QIOSBackingStore();
QPaintDevice *paintDevice() Q_DECL_OVERRIDE;
void beginPaint(const QRegion &) Q_DECL_OVERRIDE;
void endPaint() Q_DECL_OVERRIDE;
void flush(QWindow *window, const QRegion &region, const QPoint &offset) Q_DECL_OVERRIDE; void flush(QWindow *window, const QRegion &region, const QPoint &offset) Q_DECL_OVERRIDE;
void resize(const QSize &size, const QRegion &staticContents) Q_DECL_OVERRIDE;
void makeCurrent();
private: private:
QOpenGLContext *m_context; QOpenGLContext *m_context;
QOpenGLPaintDevice *m_glDevice;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -41,79 +41,31 @@
#include "qioswindow.h" #include "qioswindow.h"
#include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLPaintDevice>
#include <QtGui/QOpenGLFramebufferObject>
#include <QtGui/QOffscreenSurface>
#include <QtGui/qpainter.h>
#include <QtGui/private/qwindow_p.h> #include <QtGui/private/qwindow_p.h>
#include <QtDebug> #include <QtDebug>
QT_BEGIN_NAMESPACE 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 \class QIOSBackingStore
\brief The QPlatformBackingStore on iOS.
QBackingStore enables the use of QPainter to paint on a QWindow, as opposed 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. 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) QIOSBackingStore::QIOSBackingStore(QWindow *window)
: QRasterBackingStore(window) : QRasterBackingStore(window)
, m_context(new QOpenGLContext) , 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 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. // we blit the raster image), so the type needs to cover both use cases.
if (window->surfaceType() == QSurface::RasterSurface) if (window->surfaceType() == QSurface::RasterSurface)
window->setSurfaceType(QSurface::RasterGLSurface); 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()); m_context->setScreen(window->screen());
Q_ASSERT(QOpenGLContext::globalShareContext()); Q_ASSERT(QOpenGLContext::globalShareContext());
m_context->setShareContext(QOpenGLContext::globalShareContext()); m_context->setShareContext(QOpenGLContext::globalShareContext());
@ -122,54 +74,12 @@ QIOSBackingStore::QIOSBackingStore(QWindow *window)
QIOSBackingStore::~QIOSBackingStore() QIOSBackingStore::~QIOSBackingStore()
{ {
if (window()->surfaceType() == QSurface::RasterGLSurface) { // We're using composeAndFlush from QPlatformBackingStore, which
// We're using composeAndFlush from QPlatformBackingStore, which // need to clean up any textures in its destructor, so make the
// need to clean up any textures in its destructor, so make the // context current and keep it alive until QPlatformBackingStore
// context current and keep it alive until QPlatformBackingStore // has cleaned up everything.
// has cleaned up everything. m_context->makeCurrent(window());
makeCurrent(); m_context->deleteLater();
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 &region)
{
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;
} }
void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset) void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
@ -187,33 +97,8 @@ void QIOSBackingStore::flush(QWindow *window, const QRegion &region, const QPoin
return; return;
} }
if (window->surfaceType() == QSurface::RasterGLSurface) { static QPlatformTextureList emptyTextureList;
static QPlatformTextureList emptyTextureList; composeAndFlush(window, region, offset, &emptyTextureList, m_context, false);
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);
} }
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -97,11 +97,6 @@ QIOSIntegration::QIOSIntegration()
// The backingstore needs a global share context in order to support composition in // The backingstore needs a global share context in order to support composition in
// QPlatformBackingStore. // QPlatformBackingStore.
qApp->setAttribute(Qt::AA_ShareOpenGLContexts, true); 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 // Set current directory to app bundle folder
QDir::setCurrent(QString::fromUtf8([[[NSBundle mainBundle] bundlePath] UTF8String])); QDir::setCurrent(QString::fromUtf8([[[NSBundle mainBundle] bundlePath] UTF8String]));