summaryrefslogtreecommitdiffstats
path: root/src/adaptationlayers
diff options
context:
space:
mode:
Diffstat (limited to 'src/adaptationlayers')
-rw-r--r--src/adaptationlayers/adaptationlayers.pri9
-rw-r--r--src/adaptationlayers/mactexturemanager.cpp47
-rw-r--r--src/adaptationlayers/mactexturemanager.h14
-rw-r--r--src/adaptationlayers/threadedtexturemanager.cpp2
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();