summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2018-08-20 10:40:03 +0200
committerPaul Lemire <paul.lemire@kdab.com>2018-10-11 11:35:37 +0000
commite2e8ecab8c71f3ef6932cd361da99127c2a79f57 (patch)
tree649c48cf9cd7ea3d4f8d756339c8d55af8a4bf6c
parentb4e52d6a8deef3d268ea97cb5e4ea14948117aad (diff)
Texture: update renderer to send handle and handle type on frontend textures
Change-Id: I78047f354a9f7cdbb56bd2b5dee79cb77e6cb749 Task-number: QTBUG-70055 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp11
-rw-r--r--src/render/renderers/opengl/renderer/renderer_p.h2
-rw-r--r--src/render/texture/texture.cpp54
-rw-r--r--src/render/texture/texture_p.h9
-rw-r--r--tests/manual/texture_property_updates/main.cpp2
-rw-r--r--tests/manual/texture_property_updates/main.qml4
6 files changed, 57 insertions, 25 deletions
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp
index 8f5205c34..79afda1cc 100644
--- a/src/render/renderers/opengl/renderer/renderer.cpp
+++ b/src/render/renderers/opengl/renderer/renderer.cpp
@@ -1175,7 +1175,7 @@ void Renderer::reloadDirtyShaders()
// Executed in a job
void Renderer::sendTextureChangesToFrontend()
{
- const QVector<QPair<TextureProperties, Qt3DCore::QNodeIdVector>> updateTextureProperties = std::move(m_updatedTextureProperties);
+ const QVector<QPair<Texture::TextureUpdateInfo, Qt3DCore::QNodeIdVector>> updateTextureProperties = std::move(m_updatedTextureProperties);
for (const auto &pair : updateTextureProperties) {
// Prepare change notification
@@ -1272,8 +1272,13 @@ void Renderer::updateGLResources()
// Gather these information and store them to be distributed by a change next frame
const QNodeIdVector referenceTextureIds = glTextureManager->referencedTextureIds(glTexture);
// Store properties and referenceTextureIds
- if (info.wasUpdated)
- m_updatedTextureProperties.push_back({info.properties, referenceTextureIds});
+ if (info.wasUpdated) {
+ Texture::TextureUpdateInfo updateInfo;
+ updateInfo.properties = info.properties;
+ updateInfo.handleType = QAbstractTexture::OpenGLTextureId;
+ updateInfo.handle = info.texture ? QVariant(info.texture->textureId()) : QVariant();
+ m_updatedTextureProperties.push_back({updateInfo, referenceTextureIds});
+ }
}
}
}
diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h
index 23708e3e8..5bd03142f 100644
--- a/src/render/renderers/opengl/renderer/renderer_p.h
+++ b/src/render/renderers/opengl/renderer/renderer_p.h
@@ -391,7 +391,7 @@ private:
QVector<HBuffer> m_downloadableBuffers;
QVector<HShader> m_dirtyShaders;
QVector<HTexture> m_dirtyTextures;
- QVector<QPair<TextureProperties, Qt3DCore::QNodeIdVector>> m_updatedTextureProperties;
+ QVector<QPair<Texture::TextureUpdateInfo, Qt3DCore::QNodeIdVector>> m_updatedTextureProperties;
bool m_ownedContext;
diff --git a/src/render/texture/texture.cpp b/src/render/texture/texture.cpp
index 5a45d2bc9..17fd47be3 100644
--- a/src/render/texture/texture.cpp
+++ b/src/render/texture/texture.cpp
@@ -223,7 +223,7 @@ void Texture::setDataGenerator(const QTextureGeneratorPtr &generator)
// Called by sendTextureChangesToFrontendJob once GLTexture and sharing
// has been performed
-void Texture::updatePropertiesAndNotify(const TextureProperties &properties)
+void Texture::updatePropertiesAndNotify(const TextureUpdateInfo &updateInfo)
{
// If we are Dirty, some property has changed and the properties we have
// received are potentially already outdated
@@ -232,57 +232,73 @@ void Texture::updatePropertiesAndNotify(const TextureProperties &properties)
// Note we don't update target has it is constant for frontend nodes
- if (properties.width != m_properties.width) {
- m_properties.width = properties.width;
+ if (updateInfo.properties.width != m_properties.width) {
+ m_properties.width = updateInfo.properties.width;
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
change->setPropertyName("width");
- change->setValue(properties.width);
+ change->setValue(updateInfo.properties.width);
notifyObservers(change);
}
- if (properties.height != m_properties.height) {
- m_properties.height = properties.height;
+ if (updateInfo.properties.height != m_properties.height) {
+ m_properties.height = updateInfo.properties.height;
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
change->setPropertyName("height");
- change->setValue(properties.height);
+ change->setValue(updateInfo.properties.height);
notifyObservers(change);
}
- if (properties.depth != m_properties.depth) {
- m_properties.depth = properties.depth;
+ if (updateInfo.properties.depth != m_properties.depth) {
+ m_properties.depth = updateInfo.properties.depth;
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
change->setPropertyName("depth");
- change->setValue(properties.depth);
+ change->setValue(updateInfo.properties.depth);
notifyObservers(change);
}
- if (properties.layers != m_properties.layers) {
- m_properties.layers = properties.layers;
+ if (updateInfo.properties.layers != m_properties.layers) {
+ m_properties.layers = updateInfo.properties.layers;
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
change->setPropertyName("layers");
- change->setValue(properties.layers);
+ change->setValue(updateInfo.properties.layers);
notifyObservers(change);
}
- if (properties.format != m_properties.format) {
- m_properties.format = properties.format;
+ if (updateInfo.properties.format != m_properties.format) {
+ m_properties.format = updateInfo.properties.format;
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
change->setPropertyName("format");
- change->setValue(properties.format);
+ change->setValue(updateInfo.properties.format);
notifyObservers(change);
}
- if (properties.status != m_properties.status) {
- m_properties.status = properties.status;
+ if (updateInfo.properties.status != m_properties.status) {
+ m_properties.status = updateInfo.properties.status;
auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
change->setPropertyName("status");
- change->setValue(properties.status);
+ change->setValue(updateInfo.properties.status);
+ notifyObservers(change);
+ }
+
+ {
+ auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
+ change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
+ change->setPropertyName("handleType");
+ change->setValue(updateInfo.handleType);
+ notifyObservers(change);
+ }
+
+ {
+ auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId());
+ change->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
+ change->setPropertyName("handle");
+ change->setValue(updateInfo.handle);
notifyObservers(change);
}
}
diff --git a/src/render/texture/texture_p.h b/src/render/texture/texture_p.h
index d48e35b0c..705d86e68 100644
--- a/src/render/texture/texture_p.h
+++ b/src/render/texture/texture_p.h
@@ -142,6 +142,13 @@ public:
};
Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
+ struct TextureUpdateInfo
+ {
+ TextureProperties properties;
+ QVariant handle;
+ QAbstractTexture::HandleType handleType;
+ };
+
void addDirtyFlag(DirtyFlags flags);
DirtyFlags dirtyFlags();
void unsetDirty();
@@ -159,7 +166,7 @@ public:
inline int sharedTextureId() const { return m_sharedTextureId; }
void setDataGenerator(const QTextureGeneratorPtr &generator);
- void updatePropertiesAndNotify(const TextureProperties &propreties);
+ void updatePropertiesAndNotify(const TextureUpdateInfo &updateInfo);
bool isValid(TextureImageManager *manager) const;
private:
void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final;
diff --git a/tests/manual/texture_property_updates/main.cpp b/tests/manual/texture_property_updates/main.cpp
index e145b0a26..725c6ccc1 100644
--- a/tests/manual/texture_property_updates/main.cpp
+++ b/tests/manual/texture_property_updates/main.cpp
@@ -77,11 +77,13 @@ public:
Q_INVOKABLE QString statusName(int v) const { return m_statusMap.value(v); }
Q_INVOKABLE QString formatName(int v) const { return m_formatMap.value(v); }
Q_INVOKABLE QString targetName(int v) const { return m_targetMap.value(v); }
+ Q_INVOKABLE QString handleTypeName(int v) const { return m_handleTypeMap.value(v); }
private:
const QHash<int, QString> m_statusMap = enumToNameMap<Qt3DRender::QAbstractTexture>("Status");
const QHash<int, QString> m_formatMap = enumToNameMap<Qt3DRender::QAbstractTexture>("TextureFormat");
const QHash<int, QString> m_targetMap = enumToNameMap<Qt3DRender::QAbstractTexture>("Target");
+ const QHash<int, QString> m_handleTypeMap = enumToNameMap<Qt3DRender::QAbstractTexture>("HandleType");
};
int main(int argc, char* argv[])
diff --git a/tests/manual/texture_property_updates/main.qml b/tests/manual/texture_property_updates/main.qml
index ebefdc725..fb68862a6 100644
--- a/tests/manual/texture_property_updates/main.qml
+++ b/tests/manual/texture_property_updates/main.qml
@@ -51,7 +51,7 @@
import QtQuick 2.2 as QQ2
import QtQuick.Scene3D 2.0
import Qt3D.Core 2.0
-import Qt3D.Render 2.0
+import Qt3D.Render 2.12
import Qt3D.Input 2.0
import Qt3D.Extras 2.0
@@ -182,6 +182,8 @@ QQ2.Item {
QQ2.Text { text: "Depth: " + model.modelData.depth}
QQ2.Text { text: "Layers: " + model.modelData.layers}
QQ2.Text { text: "Status: " + nameMapper.statusName(model.modelData.status.toString()) }
+ QQ2.Text { text: "HandleType: " + nameMapper.handleTypeName(model.modelData.handleType) }
+ QQ2.Text { text: "Handle: " + model.modelData.handle }
}
}
}