diff options
Diffstat (limited to 'src/adaptationlayers')
-rw-r--r-- | src/adaptationlayers/adaptationlayers.pri | 9 | ||||
-rw-r--r-- | src/adaptationlayers/mactexturemanager.cpp | 47 | ||||
-rw-r--r-- | src/adaptationlayers/mactexturemanager.h | 14 | ||||
-rw-r--r-- | src/adaptationlayers/threadedtexturemanager.cpp | 2 |
4 files changed, 70 insertions, 2 deletions
diff --git a/src/adaptationlayers/adaptationlayers.pri b/src/adaptationlayers/adaptationlayers.pri index 514e32d..bbba835 100644 --- a/src/adaptationlayers/adaptationlayers.pri +++ b/src/adaptationlayers/adaptationlayers.pri @@ -6,7 +6,7 @@ HEADERS += \ $$PWD/default/default_rectanglenode.h \ $$PWD/default/default_glyphnode.h \ $$PWD/default/default_glyphnode_p.h \ - $$PWD/adaptationlayers/threadedtexturemanager.h + $$PWD/threadedtexturemanager.h \ SOURCES += \ $$PWD/adaptationlayer.cpp \ @@ -14,4 +14,9 @@ SOURCES += \ $$PWD/default/default_rectanglenode.cpp \ $$PWD/default/default_glyphnode.cpp \ $$PWD/default/default_glyphnode_p.cpp \ - $$PWD/threadedtexturemanager.cpp + $$PWD/threadedtexturemanager.cpp \ + +macx:{ + SOURCES += adaptationlayers/mactexturemanager.cpp + HEADERS += adaptationlayers/mactexturemanager.h +} diff --git a/src/adaptationlayers/mactexturemanager.cpp b/src/adaptationlayers/mactexturemanager.cpp new file mode 100644 index 0000000..dec66c6 --- /dev/null +++ b/src/adaptationlayers/mactexturemanager.cpp @@ -0,0 +1,47 @@ +#include "mactexturemanager.h" + +/*! + Since we are using client storage which means asynchronous DMA + uploads, we need to keep the bits around for the duration + of the texture id. So we keep the image in along in the reference + */ +class QSGMacTextureReference : public TextureReference +{ +public: + QImage image; +}; + + +QSGMacTextureManager::QSGMacTextureManager() +{ +} + + +const TextureReference *QSGMacTextureManager::requestUploadedTexture(const QImage &image, UploadHints hints, QObject *listener, const char *slot) +{ + // Client storage will most likely fail when mipmapping is used.. + if (hints & TextureManager::GenerateMipmapUploadHint) + return TextureManager::requestUploadedTexture(image, hints, listener, slot); + + GLuint id; + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + + glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_SHARED_APPLE); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_BGRA, + GL_UNSIGNED_INT_8_8_8_8_REV, image.constBits()); + + glBindTexture(GL_TEXTURE_2D, 0); + + QSGMacTextureReference *texture = new QSGMacTextureReference; + texture->image = image; + texture->setTextureId(id); + texture->setTextureSize(image.size()); + texture->setStatus(TextureReference::Uploaded); + + return texture; +} diff --git a/src/adaptationlayers/mactexturemanager.h b/src/adaptationlayers/mactexturemanager.h new file mode 100644 index 0000000..89cba85 --- /dev/null +++ b/src/adaptationlayers/mactexturemanager.h @@ -0,0 +1,14 @@ +#ifndef MACTEXTUREMANAGER_H +#define MACTEXTUREMANAGER_H + +#include "adaptationlayer.h" + +class QT_SCENEGRAPH_EXPORT QSGMacTextureManager : public TextureManager +{ +public: + QSGMacTextureManager(); + + const TextureReference *requestUploadedTexture(const QImage &image, UploadHints hints, QObject *listener, const char *slot); +}; + +#endif // MACTEXTUREMANAGER_H diff --git a/src/adaptationlayers/threadedtexturemanager.cpp b/src/adaptationlayers/threadedtexturemanager.cpp index 2522733..4df4d6c 100644 --- a/src/adaptationlayers/threadedtexturemanager.cpp +++ b/src/adaptationlayers/threadedtexturemanager.cpp @@ -8,6 +8,7 @@ #include <QPaintDevice> #include <QGLWidget> +#include <qdatetime.h> struct TextureToUpload { @@ -114,6 +115,7 @@ const TextureReference *QSGThreadedTextureManager::requestUploadedTexture(const QObject::connect(work.texture, SIGNAL(statusChanged(int)), listener, slot); d->thread.mutex.lock(); + d->thread.requests << work; d->thread.condition.wakeOne(); d->thread.mutex.unlock(); |