diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2016-02-03 12:42:52 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-03-02 12:16:05 +0000 |
commit | 6b0a577bf85845780e9a7b101260cdf72fa1d33c (patch) | |
tree | 2ce5d8b2166c50024e648c3ef61ebcee7674bfa7 /src/gui/opengl/qopenglversionfunctions.cpp | |
parent | 8f1fcb0142b26f8e12c51b6c646eca1242b35102 (diff) |
Refactor initialization/caching code for versioned opengl functions
Saves around 80k in Qt Gui.
Change-Id: I3f7068ae699136d0edf46a49694ade7e1df3c91d
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src/gui/opengl/qopenglversionfunctions.cpp')
-rw-r--r-- | src/gui/opengl/qopenglversionfunctions.cpp | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/src/gui/opengl/qopenglversionfunctions.cpp b/src/gui/opengl/qopenglversionfunctions.cpp index a5b03315e6..3fba00bc47 100644 --- a/src/gui/opengl/qopenglversionfunctions.cpp +++ b/src/gui/opengl/qopenglversionfunctions.cpp @@ -85,23 +85,59 @@ void CLASS::init() \ #define QT_OPENGL_IMPLEMENT_WIN QT_OPENGL_IMPLEMENT #endif -QOpenGLVersionFunctionsBackend *QAbstractOpenGLFunctionsPrivate::functionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v) +QOpenGLVersionFunctionsStorage::QOpenGLVersionFunctionsStorage() + : backends(0) { - Q_ASSERT(context); - return context->functionsBackend(v); } -void QAbstractOpenGLFunctionsPrivate::insertFunctionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v, - QOpenGLVersionFunctionsBackend *backend) +QOpenGLVersionFunctionsStorage::~QOpenGLVersionFunctionsStorage() { - Q_ASSERT(context); - context->insertFunctionsBackend(v, backend); + if (backends) { + for (int i = 0; i < QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount; ++i) { + if (backends[i] && !--backends[i]->refs) { + // deleting the base class is ok, as the derived classes don't have a destructor + delete backends[i]; + } + } + delete[] backends; + } +} + +QOpenGLVersionFunctionsBackend *QOpenGLVersionFunctionsStorage::backend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v) +{ +#ifdef QT_OPENGL_ES + Q_UNUSED(context); + Q_UNUSED(v); + return 0; +#else + if (!backends) { + backends = new QOpenGLVersionFunctionsBackend *[QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount]; + memset(backends, 0, sizeof(QOpenGLVersionFunctionsBackend *)*QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount); + } + if (backends[v]) + return backends[v]; + + switch(v) { +#define VERSION_ENUM(X) QOpenGLVersionFunctionsBackend::OpenGL_##X +#define CREATE_BACKEND(X) \ + case VERSION_ENUM(X): \ + backends[VERSION_ENUM(X)] = new QOpenGLFunctions_##X##Backend(context); \ + break; + QT_OPENGL_VERSIONS(CREATE_BACKEND) + case QOpenGLVersionFunctionsBackend::OpenGLVersionBackendCount: + Q_UNREACHABLE(); + } + // the storage keeps one ref + ++backends[v]->refs; + return backends[v]; +#endif } -void QAbstractOpenGLFunctionsPrivate::removeFunctionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v) +QOpenGLVersionFunctionsBackend *QAbstractOpenGLFunctionsPrivate::functionsBackend(QOpenGLContext *context, QOpenGLVersionFunctionsBackend::Version v) { Q_ASSERT(context); - context->removeFunctionsBackend(v); + QOpenGLVersionFunctionsStorage *storage = context->functionsBackendStorage(); + return storage->backend(context, v); } void QAbstractOpenGLFunctionsPrivate::insertExternalFunctions(QOpenGLContext *context, QAbstractOpenGLFunctions *f) |