diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2018-08-20 10:40:03 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-10-11 11:35:37 +0000 |
commit | e2e8ecab8c71f3ef6932cd361da99127c2a79f57 (patch) | |
tree | 649c48cf9cd7ea3d4f8d756339c8d55af8a4bf6c | |
parent | b4e52d6a8deef3d268ea97cb5e4ea14948117aad (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.cpp | 11 | ||||
-rw-r--r-- | src/render/renderers/opengl/renderer/renderer_p.h | 2 | ||||
-rw-r--r-- | src/render/texture/texture.cpp | 54 | ||||
-rw-r--r-- | src/render/texture/texture_p.h | 9 | ||||
-rw-r--r-- | tests/manual/texture_property_updates/main.cpp | 2 | ||||
-rw-r--r-- | tests/manual/texture_property_updates/main.qml | 4 |
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 } } } } |