aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickopenglshadereffectnode.cpp
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@qt.io>2020-06-03 11:18:13 +0200
committerPaul Olav Tvete <paul.tvete@qt.io>2020-06-04 16:20:26 +0200
commit70dd5e24ce29adeab48932082863b3e3e3e4ba47 (patch)
tree40431af347a2a908d6314e2f765ed54ab9c9c0ae /src/quick/items/qquickopenglshadereffectnode.cpp
parenta2a9be9fa80c61464ef30cfcc7ceef42ddac73e2 (diff)
Remove QQuickOpenGLShaderEffect
This also removes QQuickUniformAnimator, which is not yet ported to RHI (QTBUG-83976) Task-number: QTBUG-83977 Change-Id: I3e656e6817ac991371b7f6557f050e122635d279 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/quick/items/qquickopenglshadereffectnode.cpp')
-rw-r--r--src/quick/items/qquickopenglshadereffectnode.cpp524
1 files changed, 0 insertions, 524 deletions
diff --git a/src/quick/items/qquickopenglshadereffectnode.cpp b/src/quick/items/qquickopenglshadereffectnode.cpp
deleted file mode 100644
index 019450935f..0000000000
--- a/src/quick/items/qquickopenglshadereffectnode.cpp
+++ /dev/null
@@ -1,524 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtQuick module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <private/qquickopenglshadereffectnode_p.h>
-
-#include "qquickopenglshadereffect_p.h"
-#include <QtQuick/qsgtextureprovider.h>
-#include <QtQuick/private/qsgrenderer_p.h>
-#include <QtQuick/private/qsgshadersourcebuilder_p.h>
-#include <QtQuick/private/qsgtexture_p.h>
-#include <QtCore/qmutex.h>
-#include <qopenglfunctions.h>
-
-#ifndef GL_TEXTURE_EXTERNAL_OES
-#define GL_TEXTURE_EXTERNAL_OES 0x8D65
-#endif
-
-QT_BEGIN_NAMESPACE
-
-static bool hasAtlasTexture(const QVector<QSGTextureProvider *> &textureProviders)
-{
- for (int i = 0; i < textureProviders.size(); ++i) {
- QSGTextureProvider *t = textureProviders.at(i);
- if (t && t->texture() && t->texture()->isAtlasTexture())
- return true;
- }
- return false;
-}
-
-class QQuickCustomMaterialShader : public QSGMaterialShader
-{
-public:
- QQuickCustomMaterialShader(const QQuickOpenGLShaderEffectMaterialKey &key, const QVector<QByteArray> &attributes);
- void deactivate() override;
- void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) override;
- char const *const *attributeNames() const override;
-
-protected:
- friend class QQuickOpenGLShaderEffectNode;
-
- void compile() override;
- const char *vertexShader() const override;
- const char *fragmentShader() const override;
-
- const QQuickOpenGLShaderEffectMaterialKey m_key;
- QVector<QByteArray> m_attributes;
- QVector<const char *> m_attributeNames;
- QString m_log;
- bool m_compiled;
-
- QVector<int> m_uniformLocs[QQuickOpenGLShaderEffectMaterialKey::ShaderTypeCount];
- uint m_initialized : 1;
-};
-
-QQuickCustomMaterialShader::QQuickCustomMaterialShader(const QQuickOpenGLShaderEffectMaterialKey &key, const QVector<QByteArray> &attributes)
- : m_key(key)
- , m_attributes(attributes)
- , m_compiled(false)
- , m_initialized(false)
-{
- const int attributesCount = m_attributes.count();
- m_attributeNames.reserve(attributesCount + 1);
- for (int i = 0; i < attributesCount; ++i)
- m_attributeNames.append(m_attributes.at(i).constData());
- m_attributeNames.append(0);
-}
-
-void QQuickCustomMaterialShader::deactivate()
-{
- QSGMaterialShader::deactivate();
- QOpenGLContext::currentContext()->functions()->glDisable(GL_CULL_FACE);
-}
-
-void QQuickCustomMaterialShader::updateState(const RenderState &, QSGMaterial *newEffect, QSGMaterial *)
-{
- typedef QQuickOpenGLShaderEffectMaterial::UniformData UniformData;
-
- Q_ASSERT(newEffect != nullptr);
-
- QQuickOpenGLShaderEffectMaterial *material = static_cast<QQuickOpenGLShaderEffectMaterial *>(newEffect);
- if (!material->m_emittedLogChanged && material->m_node) {
- material->m_emittedLogChanged = true;
- emit material->m_node->logAndStatusChanged(m_log, m_compiled ? QQuickShaderEffect::Compiled
- : QQuickShaderEffect::Error);
- }
-
- int textureProviderIndex = 0;
- if (!m_initialized) {
- for (int shaderType = 0; shaderType < QQuickOpenGLShaderEffectMaterialKey::ShaderTypeCount; ++shaderType) {
- Q_ASSERT(m_uniformLocs[shaderType].isEmpty());
- m_uniformLocs[shaderType].reserve(material->uniforms[shaderType].size());
- for (int i = 0; i < material->uniforms[shaderType].size(); ++i) {
- const UniformData &d = material->uniforms[shaderType].at(i);
- QByteArray name = d.name;
- if (d.specialType == UniformData::Sampler || d.specialType == UniformData::SamplerExternal) {
- program()->setUniformValue(d.name.constData(), textureProviderIndex++);
- // We don't need to store the sampler uniform locations, since their values
- // only need to be set once. Look for the "qt_SubRect_" uniforms instead.
- // These locations are used when binding the textures later.
- name = "qt_SubRect_" + name;
- }
- m_uniformLocs[shaderType].append(program()->uniformLocation(name.constData()));
- }
- }
- m_initialized = true;
- textureProviderIndex = 0;
- }
-
-#if 0
- QOpenGLFunctions *functions = state.context()->functions();
- for (int shaderType = 0; shaderType < QQuickOpenGLShaderEffectMaterialKey::ShaderTypeCount; ++shaderType) {
- for (int i = 0; i < material->uniforms[shaderType].size(); ++i) {
- const UniformData &d = material->uniforms[shaderType].at(i);
- int loc = m_uniformLocs[shaderType].at(i);
- if (d.specialType == UniformData::Sampler || d.specialType == UniformData::SamplerExternal) {
- int idx = textureProviderIndex++;
- functions->glActiveTexture(GL_TEXTURE0 + idx);
- if (QSGTextureProvider *provider = material->textureProviders.at(idx)) {
- if (QSGTexture *texture = provider->texture()) {
-
-#ifndef QT_NO_DEBUG
- if (!qsg_safeguard_texture(texture))
- continue;
-#endif
-
- if (loc >= 0) {
- QRectF r = texture->normalizedTextureSubRect();
- program()->setUniformValue(loc, r.x(), r.y(), r.width(), r.height());
- } else if (texture->isAtlasTexture() && !material->geometryUsesTextureSubRect) {
- texture = texture->removedFromAtlas();
- }
- texture->bind();
- continue;
- }
- }
- if (d.specialType == UniformData::Sampler)
- functions->glBindTexture(GL_TEXTURE_2D, 0);
- else if (d.specialType == UniformData::SamplerExternal)
- functions->glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
- } else if (d.specialType == UniformData::Opacity) {
- program()->setUniformValue(loc, state.opacity());
- } else if (d.specialType == UniformData::Matrix) {
- if (state.isMatrixDirty())
- program()->setUniformValue(loc, state.combinedMatrix());
- } else if (d.specialType == UniformData::None) {
- switch (int(d.value.userType())) {
- case QMetaType::QColor:
- program()->setUniformValue(loc, qt_premultiply_color(qvariant_cast<QColor>(d.value)));
- break;
- case QMetaType::Float:
- program()->setUniformValue(loc, qvariant_cast<float>(d.value));
- break;
- case QMetaType::Double:
- program()->setUniformValue(loc, (float) qvariant_cast<double>(d.value));
- break;
- case QMetaType::QTransform:
- program()->setUniformValue(loc, qvariant_cast<QTransform>(d.value));
- break;
- case QMetaType::Int:
- program()->setUniformValue(loc, d.value.toInt());
- break;
- case QMetaType::Bool:
- program()->setUniformValue(loc, GLint(d.value.toBool()));
- break;
- case QMetaType::QSize:
- case QMetaType::QSizeF:
- program()->setUniformValue(loc, d.value.toSizeF());
- break;
- case QMetaType::QPoint:
- case QMetaType::QPointF:
- program()->setUniformValue(loc, d.value.toPointF());
- break;
- case QMetaType::QRect:
- case QMetaType::QRectF:
- {
- QRectF r = d.value.toRectF();
- program()->setUniformValue(loc, r.x(), r.y(), r.width(), r.height());
- }
- break;
- case QMetaType::QVector2D:
- program()->setUniformValue(loc, qvariant_cast<QVector2D>(d.value));
- break;
- case QMetaType::QVector3D:
- program()->setUniformValue(loc, qvariant_cast<QVector3D>(d.value));
- break;
- case QMetaType::QVector4D:
- program()->setUniformValue(loc, qvariant_cast<QVector4D>(d.value));
- break;
- case QMetaType::QQuaternion:
- {
- QQuaternion q = qvariant_cast<QQuaternion>(d.value);
- program()->setUniformValue(loc, q.x(), q.y(), q.z(), q.scalar());
- }
- break;
- case QMetaType::QMatrix4x4:
- program()->setUniformValue(loc, qvariant_cast<QMatrix4x4>(d.value));
- break;
- default:
- break;
- }
- }
- }
- }
- functions->glActiveTexture(GL_TEXTURE0);
-
- const QQuickOpenGLShaderEffectMaterial *oldMaterial = static_cast<const QQuickOpenGLShaderEffectMaterial *>(oldEffect);
- if (oldEffect == nullptr || material->cullMode != oldMaterial->cullMode) {
- switch (material->cullMode) {
- case QQuickShaderEffect::FrontFaceCulling:
- functions->glEnable(GL_CULL_FACE);
- functions->glCullFace(GL_FRONT);
- break;
- case QQuickShaderEffect::BackFaceCulling:
- functions->glEnable(GL_CULL_FACE);
- functions->glCullFace(GL_BACK);
- break;
- default:
- functions->glDisable(GL_CULL_FACE);
- break;
- }
- }
-#endif
-}
-
-char const *const *QQuickCustomMaterialShader::attributeNames() const
-{
- return m_attributeNames.constData();
-}
-
-void QQuickCustomMaterialShader::compile()
-{
- Q_ASSERT_X(!program()->isLinked(), "QQuickCustomMaterialShader::compile()", "Compile called multiple times!");
-
- m_log.clear();
- m_compiled = true;
- if (!program()->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader())) {
- m_log += QLatin1String("*** Vertex shader ***\n") + program()->log();
- m_compiled = false;
- }
- if (!program()->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader())) {
- m_log += QLatin1String("*** Fragment shader ***\n") + program()->log();
- m_compiled = false;
- }
-
- char const *const *attr = attributeNames();
-#ifndef QT_NO_DEBUG
- int maxVertexAttribs = 0;
- QOpenGLContext::currentContext()->functions()->glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
- int attrCount = 0;
- while (attrCount < maxVertexAttribs && attr[attrCount])
- ++attrCount;
- if (attr[attrCount]) {
- qWarning("List of attribute names is too long.\n"
- "Maximum number of attributes on this hardware is %i.\n"
- "Vertex shader:\n%s\n"
- "Fragment shader:\n%s\n",
- maxVertexAttribs, vertexShader(), fragmentShader());
- }
-#endif
-
- if (m_compiled) {
-#ifndef QT_NO_DEBUG
- for (int i = 0; i < attrCount; ++i) {
-#else
- for (int i = 0; attr[i]; ++i) {
-#endif
- if (*attr[i])
- program()->bindAttributeLocation(attr[i], i);
- }
- m_compiled = program()->link();
- m_log += program()->log();
- }
-
- if (!m_compiled) {
- qWarning("QQuickCustomMaterialShader: Shader compilation failed:");
- qWarning() << program()->log();
-
- QSGShaderSourceBuilder::initializeProgramFromFiles(
- program(),
- QStringLiteral(":/qt-project.org/items/shaders/shadereffectfallback.vert"),
- QStringLiteral(":/qt-project.org/items/shaders/shadereffectfallback.frag"));
-
-#ifndef QT_NO_DEBUG
- for (int i = 0; i < attrCount; ++i) {
-#else
- for (int i = 0; attr[i]; ++i) {
-#endif
- if (qstrcmp(attr[i], qtPositionAttributeName()) == 0)
- program()->bindAttributeLocation("v", i);
- }
- program()->link();
- }
-}
-
-const char *QQuickCustomMaterialShader::vertexShader() const
-{
- return m_key.sourceCode[QQuickOpenGLShaderEffectMaterialKey::VertexShader].constData();
-}
-
-const char *QQuickCustomMaterialShader::fragmentShader() const
-{
- return m_key.sourceCode[QQuickOpenGLShaderEffectMaterialKey::FragmentShader].constData();
-}
-
-
-bool QQuickOpenGLShaderEffectMaterialKey::operator == (const QQuickOpenGLShaderEffectMaterialKey &other) const
-{
- for (int shaderType = 0; shaderType < ShaderTypeCount; ++shaderType) {
- if (sourceCode[shaderType] != other.sourceCode[shaderType])
- return false;
- }
- return true;
-}
-
-bool QQuickOpenGLShaderEffectMaterialKey::operator != (const QQuickOpenGLShaderEffectMaterialKey &other) const
-{
- return !(*this == other);
-}
-
-size_t qHash(const QQuickOpenGLShaderEffectMaterialKey &key)
-{
- size_t hash = 1;
- typedef QQuickOpenGLShaderEffectMaterialKey Key;
- for (int shaderType = 0; shaderType < Key::ShaderTypeCount; ++shaderType)
- hash = hash * 31337 + qHash(key.sourceCode[shaderType]);
- return hash;
-}
-
-class QQuickOpenGLShaderEffectMaterialCache : public QObject
-{
- Q_OBJECT
-public:
- static QQuickOpenGLShaderEffectMaterialCache *get(bool create = true) {
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- QQuickOpenGLShaderEffectMaterialCache *me = ctx->findChild<QQuickOpenGLShaderEffectMaterialCache *>(QStringLiteral("__qt_ShaderEffectCache"), Qt::FindDirectChildrenOnly);
- if (!me && create) {
- me = new QQuickOpenGLShaderEffectMaterialCache();
- me->setObjectName(QStringLiteral("__qt_ShaderEffectCache"));
- me->setParent(ctx);
- }
- return me;
- }
- QHash<QQuickOpenGLShaderEffectMaterialKey, QSGMaterialType *> cache;
-};
-
-QQuickOpenGLShaderEffectMaterial::QQuickOpenGLShaderEffectMaterial(QQuickOpenGLShaderEffectNode *node)
- : cullMode(QQuickShaderEffect::NoCulling)
- , geometryUsesTextureSubRect(false)
- , m_node(node)
- , m_emittedLogChanged(false)
-{
- setFlag(Blending | RequiresFullMatrix, true);
-}
-
-QSGMaterialType *QQuickOpenGLShaderEffectMaterial::type() const
-{
- return m_type;
-}
-
-QSGMaterialShader *QQuickOpenGLShaderEffectMaterial::createShader() const
-{
- return new QQuickCustomMaterialShader(m_source, attributes);
-}
-
-bool QQuickOpenGLShaderEffectMaterial::UniformData::operator == (const UniformData &other) const
-{
- if (specialType != other.specialType)
- return false;
- if (name != other.name)
- return false;
-
- if (specialType == UniformData::Sampler || specialType == UniformData::SamplerExternal) {
- // We can't check the source objects as these live in the GUI thread,
- // so return true here and rely on the textureProvider check for
- // equality of these..
- return true;
- } else {
- return value == other.value;
- }
-}
-
-int QQuickOpenGLShaderEffectMaterial::compare(const QSGMaterial *o) const
-{
- const QQuickOpenGLShaderEffectMaterial *other = static_cast<const QQuickOpenGLShaderEffectMaterial *>(o);
- if ((hasAtlasTexture(textureProviders) && !geometryUsesTextureSubRect) || (hasAtlasTexture(other->textureProviders) && !other->geometryUsesTextureSubRect))
- return 1;
- if (cullMode != other->cullMode)
- return 1;
- for (int shaderType = 0; shaderType < QQuickOpenGLShaderEffectMaterialKey::ShaderTypeCount; ++shaderType) {
- if (uniforms[shaderType] != other->uniforms[shaderType])
- return 1;
- }
-
- // Check the texture providers..
- if (textureProviders.size() != other->textureProviders.size())
- return 1;
- for (int i=0; i<textureProviders.size(); ++i) {
- QSGTextureProvider *tp1 = textureProviders.at(i);
- QSGTextureProvider *tp2 = other->textureProviders.at(i);
- if (!tp1 || !tp2)
- return tp1 == tp2 ? 0 : 1;
- QSGTexture *t1 = tp1->texture();
- QSGTexture *t2 = tp2->texture();
- if (!t1 || !t2)
- return t1 == t2 ? 0 : 1;
- // Check texture id's as textures may be in the same atlas.
- if (t1->textureId() != t2->textureId())
- return 1;
- }
- return 0;
-}
-
-void QQuickOpenGLShaderEffectMaterial::setProgramSource(const QQuickOpenGLShaderEffectMaterialKey &source)
-{
- m_source = source;
- m_emittedLogChanged = false;
-
- QQuickOpenGLShaderEffectMaterialCache *cache = QQuickOpenGLShaderEffectMaterialCache::get();
- m_type = cache->cache.value(m_source);
- if (!m_type) {
- m_type = new QSGMaterialType();
- cache->cache.insert(source, m_type);
- }
-}
-
-void QQuickOpenGLShaderEffectMaterial::cleanupMaterialCache()
-{
- QQuickOpenGLShaderEffectMaterialCache *cache = QQuickOpenGLShaderEffectMaterialCache::get(false);
- if (cache) {
- qDeleteAll(cache->cache);
- delete cache;
- }
-}
-
-void QQuickOpenGLShaderEffectMaterial::updateTextures() const
-{
- for (int i = 0; i < textureProviders.size(); ++i) {
- if (QSGTextureProvider *provider = textureProviders.at(i)) {
- if (QSGDynamicTexture *texture = qobject_cast<QSGDynamicTexture *>(provider->texture()))
- texture->updateTexture();
- }
- }
-}
-
-void QQuickOpenGLShaderEffectMaterial::invalidateTextureProvider(const QObject *provider)
-{
- for (int i = 0; i < textureProviders.size(); ++i) {
- if (provider == textureProviders.at(i))
- textureProviders[i] = nullptr;
- }
-}
-
-
-QQuickOpenGLShaderEffectNode::QQuickOpenGLShaderEffectNode()
-{
- QSGNode::setFlag(UsePreprocess, true);
-
-#ifdef QSG_RUNTIME_DESCRIPTION
- qsgnode_set_description(this, QLatin1String("shadereffect"));
-#endif
-}
-
-QQuickOpenGLShaderEffectNode::~QQuickOpenGLShaderEffectNode()
-{
-}
-
-void QQuickOpenGLShaderEffectNode::markDirtyTexture()
-{
- markDirty(DirtyMaterial);
- Q_EMIT dirtyTexture();
-}
-
-void QQuickOpenGLShaderEffectNode::textureProviderDestroyed(QObject *object)
-{
- Q_ASSERT(material());
- static_cast<QQuickOpenGLShaderEffectMaterial *>(material())->invalidateTextureProvider(object);
-}
-
-void QQuickOpenGLShaderEffectNode::preprocess()
-{
- Q_ASSERT(material());
- static_cast<QQuickOpenGLShaderEffectMaterial *>(material())->updateTextures();
-}
-
-#include "qquickopenglshadereffectnode.moc"
-#include "moc_qquickopenglshadereffectnode_p.cpp"
-
-QT_END_NAMESPACE