aboutsummaryrefslogtreecommitdiffstats
path: root/src/particles
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2020-05-02 14:27:13 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2020-06-02 15:16:46 +0200
commitb87b3d3d43c200f22f0799ca59ab366d851b5db6 (patch)
treefb8258e0659a91934d2c77c359295da92e4221cd /src/particles
parent1f0b3a54ffa2ab0dc0cdff1345980ea68d749d24 (diff)
Make QSGMaterialRhiShader become QSGMaterialShader
After a symbiotic relationship in Qt 5.14 and 5.15, it is time for QSGMaterialRhiShader to devour its older sibling and take its place. This makes the direct OpenGL rendering path disfunctional. All QSGMaterial Qt 6 TODOs are solved, the API is clean and straightforward again: a QSGMaterial creates a QSGMaterialShader, no special flags and options needed. (it's just that QSGMaterialShader now has a slightly different API) Task-number: QTBUG-79268 Task-number: QTBUG-82997 Change-Id: I545ca8d796c5535e81957c706e7832133be15b7d Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/particles')
-rw-r--r--src/particles/CMakeLists.txt4
-rw-r--r--src/particles/particles.qrc5
-rw-r--r--src/particles/qquickimageparticle.cpp504
-rw-r--r--src/particles/shaders/imageparticle.frag42
-rw-r--r--src/particles/shaders/imageparticle.vert141
-rw-r--r--src/particles/shaders/imageparticle_core.frag44
-rw-r--r--src/particles/shaders/imageparticle_core.vert141
7 files changed, 19 insertions, 862 deletions
diff --git a/src/particles/CMakeLists.txt b/src/particles/CMakeLists.txt
index 085b4d27f1..c0c72578bd 100644
--- a/src/particles/CMakeLists.txt
+++ b/src/particles/CMakeLists.txt
@@ -64,10 +64,6 @@ qt_add_resource(QuickParticles "particles"
${particles_resource_files}
)
set(particles1_resource_files
- "shaders/imageparticle.frag"
- "shaders/imageparticle.vert"
- "shaders/imageparticle_core.frag"
- "shaders/imageparticle_core.vert"
"shaders_ng/imageparticle_colored.frag.qsb"
"shaders_ng/imageparticle_colored.vert.qsb"
"shaders_ng/imageparticle_deformed.frag.qsb"
diff --git a/src/particles/particles.qrc b/src/particles/particles.qrc
index 7727691233..5e76563842 100644
--- a/src/particles/particles.qrc
+++ b/src/particles/particles.qrc
@@ -6,11 +6,6 @@
<file>particleresources/star.png</file>
</qresource>
<qresource prefix="/particles">
- <file>shaders/imageparticle.frag</file>
- <file>shaders/imageparticle.vert</file>
- <file>shaders/imageparticle_core.frag</file>
- <file>shaders/imageparticle_core.vert</file>
-
<file>shaders_ng/imageparticle_simple.vert.qsb</file>
<file>shaders_ng/imageparticle_simple.frag.qsb</file>
<file>shaders_ng/imageparticle_tabled.vert.qsb</file>
diff --git a/src/particles/qquickimageparticle.cpp b/src/particles/qquickimageparticle.cpp
index f2e3715061..d33db8de76 100644
--- a/src/particles/qquickimageparticle.cpp
+++ b/src/particles/qquickimageparticle.cpp
@@ -48,7 +48,6 @@
#include "qquickparticleemitter_p.h"
#include <private/qquicksprite_p.h>
#include <private/qquickspriteengine_p.h>
-#include <QOpenGLFunctions>
#include <QSGRendererInterface>
#include <QtQuick/private/qsgshadersourcebuilder_p.h>
#include <QtQuick/private/qsgplaintexture_p.h>
@@ -86,91 +85,7 @@ class ImageMaterialData
QSizeF animSheetSize;
};
-class TabledMaterialShader : public QSGMaterialShader
-{
-public:
- TabledMaterialShader()
- {
- QSGShaderSourceBuilder builder;
- const bool isES = QOpenGLContext::currentContext()->isOpenGLES();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert"));
- builder.addDefinition(QByteArrayLiteral("TABLE"));
- builder.addDefinition(QByteArrayLiteral("DEFORM"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_vertex_code = builder.source();
- builder.clear();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag"));
- builder.addDefinition(QByteArrayLiteral("TABLE"));
- builder.addDefinition(QByteArrayLiteral("DEFORM"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_fragment_code = builder.source();
-
- Q_ASSERT(!m_vertex_code.isNull());
- Q_ASSERT(!m_fragment_code.isNull());
- }
-
- const char *vertexShader() const override { return m_vertex_code.constData(); }
- const char *fragmentShader() const override { return m_fragment_code.constData(); }
-
- char const *const *attributeNames() const override
- {
- static const char *const attr[] = { "vPosTex", "vData", "vVec", "vColor", "vDeformVec", "vRotation", nullptr };
- return attr;
- }
-
- void initialize() override {
- program()->bind();
- program()->setUniformValue("_qt_texture", 0);
- program()->setUniformValue("colortable", 1);
- glFuncs = QOpenGLContext::currentContext()->functions();
- m_matrix_id = program()->uniformLocation("qt_Matrix");
- m_opacity_id = program()->uniformLocation("qt_Opacity");
- m_timestamp_id = program()->uniformLocation("timestamp");
- m_entry_id = program()->uniformLocation("entry");
- m_sizetable_id = program()->uniformLocation("sizetable");
- m_opacitytable_id = program()->uniformLocation("opacitytable");
- }
-
- void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override {
- ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state();
-
- if (renderState.isMatrixDirty())
- program()->setUniformValue(m_matrix_id, renderState.combinedMatrix());
- if (renderState.isOpacityDirty() && m_opacity_id >= 0)
- program()->setUniformValue(m_opacity_id, renderState.opacity());
-
- glFuncs->glActiveTexture(GL_TEXTURE1);
- state->colorTable->bind();
-
- glFuncs->glActiveTexture(GL_TEXTURE0);
- state->texture->bind();
-
- program()->setUniformValue(m_timestamp_id, (float) state->timestamp);
- program()->setUniformValue(m_entry_id, (float) state->entry);
- program()->setUniformValueArray(m_sizetable_id, (const float*) state->sizeTable, UNIFORM_ARRAY_SIZE, 1);
- program()->setUniformValueArray(m_opacitytable_id, (const float*) state->opacityTable, UNIFORM_ARRAY_SIZE, 1);
- }
-
- int m_matrix_id;
- int m_opacity_id;
- int m_entry_id;
- int m_timestamp_id;
- int m_sizetable_id;
- int m_opacitytable_id;
- QByteArray m_vertex_code;
- QByteArray m_fragment_code;
- QOpenGLFunctions* glFuncs;
-};
-
-class TabledMaterialRhiShader : public QSGMaterialRhiShader
+class TabledMaterialRhiShader : public QSGMaterialShader
{
public:
TabledMaterialRhiShader()
@@ -233,12 +148,8 @@ public:
class TabledMaterial : public ImageMaterial
{
public:
- TabledMaterial() { setFlag(SupportsRhiShader, true); }
QSGMaterialShader *createShader() const override {
- if (flags().testFlag(RhiShaderWanted))
- return new TabledMaterialRhiShader;
- else
- return new TabledMaterialShader;
+ return new TabledMaterialRhiShader;
}
QSGMaterialType *type() const override { return &m_type; }
@@ -251,78 +162,7 @@ private:
QSGMaterialType TabledMaterial::m_type;
-class DeformableMaterialShader : public QSGMaterialShader
-{
-public:
- DeformableMaterialShader()
- {
- QSGShaderSourceBuilder builder;
- const bool isES = QOpenGLContext::currentContext()->isOpenGLES();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert"));
- builder.addDefinition(QByteArrayLiteral("DEFORM"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_vertex_code = builder.source();
- builder.clear();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag"));
- builder.addDefinition(QByteArrayLiteral("DEFORM"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_fragment_code = builder.source();
-
- Q_ASSERT(!m_vertex_code.isNull());
- Q_ASSERT(!m_fragment_code.isNull());
- }
-
- const char *vertexShader() const override { return m_vertex_code.constData(); }
- const char *fragmentShader() const override { return m_fragment_code.constData(); }
-
- char const *const *attributeNames() const override
- {
- static const char *const attr[] = { "vPosTex", "vData", "vVec", "vColor", "vDeformVec", "vRotation", nullptr };
- return attr;
- }
-
- void initialize() override {
- program()->bind();
- program()->setUniformValue("_qt_texture", 0);
- glFuncs = QOpenGLContext::currentContext()->functions();
- m_matrix_id = program()->uniformLocation("qt_Matrix");
- m_opacity_id = program()->uniformLocation("qt_Opacity");
- m_timestamp_id = program()->uniformLocation("timestamp");
- m_entry_id = program()->uniformLocation("entry");
- }
-
- void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override {
- ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state();
-
- if (renderState.isMatrixDirty())
- program()->setUniformValue(m_matrix_id, renderState.combinedMatrix());
- if (renderState.isOpacityDirty() && m_opacity_id >= 0)
- program()->setUniformValue(m_opacity_id, renderState.opacity());
-
- state->texture->bind();
-
- program()->setUniformValue(m_timestamp_id, (float) state->timestamp);
- program()->setUniformValue(m_entry_id, (float) state->entry);
- }
-
- int m_matrix_id;
- int m_opacity_id;
- int m_entry_id;
- int m_timestamp_id;
- QByteArray m_vertex_code;
- QByteArray m_fragment_code;
- QOpenGLFunctions* glFuncs;
-};
-
-class DeformableMaterialRhiShader : public QSGMaterialRhiShader
+class DeformableMaterialRhiShader : public QSGMaterialShader
{
public:
DeformableMaterialRhiShader()
@@ -371,12 +211,8 @@ public:
class DeformableMaterial : public ImageMaterial
{
public:
- DeformableMaterial() { setFlag(SupportsRhiShader, true); }
QSGMaterialShader *createShader() const override {
- if (flags().testFlag(RhiShaderWanted))
- return new DeformableMaterialRhiShader;
- else
- return new DeformableMaterialShader;
+ return new DeformableMaterialRhiShader;
}
QSGMaterialType *type() const override { return &m_type; }
@@ -389,96 +225,7 @@ private:
QSGMaterialType DeformableMaterial::m_type;
-class ParticleSpriteMaterialShader : public QSGMaterialShader
-{
-public:
- ParticleSpriteMaterialShader()
- {
- QSGShaderSourceBuilder builder;
- const bool isES = QOpenGLContext::currentContext()->isOpenGLES();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert"));
- builder.addDefinition(QByteArrayLiteral("SPRITE"));
- builder.addDefinition(QByteArrayLiteral("TABLE"));
- builder.addDefinition(QByteArrayLiteral("DEFORM"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_vertex_code = builder.source();
- builder.clear();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag"));
- builder.addDefinition(QByteArrayLiteral("SPRITE"));
- builder.addDefinition(QByteArrayLiteral("TABLE"));
- builder.addDefinition(QByteArrayLiteral("DEFORM"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_fragment_code = builder.source();
-
- Q_ASSERT(!m_vertex_code.isNull());
- Q_ASSERT(!m_fragment_code.isNull());
- }
-
- const char *vertexShader() const override { return m_vertex_code.constData(); }
- const char *fragmentShader() const override { return m_fragment_code.constData(); }
-
- char const *const *attributeNames() const override
- {
- static const char *const attr[] = { "vPosTex", "vData", "vVec", "vColor", "vDeformVec", "vRotation",
- "vAnimData", "vAnimPos", nullptr };
- return attr;
- }
-
- void initialize() override {
- program()->bind();
- program()->setUniformValue("_qt_texture", 0);
- program()->setUniformValue("colortable", 1);
- glFuncs = QOpenGLContext::currentContext()->functions();
- m_matrix_id = program()->uniformLocation("qt_Matrix");
- m_opacity_id = program()->uniformLocation("qt_Opacity");
- //Don't actually expose the animSheetSize in the shader, it's currently only used for CPU calculations.
- m_timestamp_id = program()->uniformLocation("timestamp");
- m_entry_id = program()->uniformLocation("entry");
- m_sizetable_id = program()->uniformLocation("sizetable");
- m_opacitytable_id = program()->uniformLocation("opacitytable");
- }
-
- void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override {
- ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state();
-
- if (renderState.isMatrixDirty())
- program()->setUniformValue(m_matrix_id, renderState.combinedMatrix());
- if (renderState.isOpacityDirty() && m_opacity_id >= 0)
- program()->setUniformValue(m_opacity_id, renderState.opacity());
-
- glFuncs->glActiveTexture(GL_TEXTURE1);
- state->colorTable->bind();
-
- // make sure we end by setting GL_TEXTURE0 as active texture
- glFuncs->glActiveTexture(GL_TEXTURE0);
- state->texture->bind();
-
- program()->setUniformValue(m_timestamp_id, (float) state->timestamp);
- program()->setUniformValue(m_entry_id, (float) state->entry);
- program()->setUniformValueArray(m_sizetable_id, (const float*) state->sizeTable, 64, 1);
- program()->setUniformValueArray(m_opacitytable_id, (const float*) state->opacityTable, UNIFORM_ARRAY_SIZE, 1);
- }
-
- int m_matrix_id;
- int m_opacity_id;
- int m_timestamp_id;
- int m_entry_id;
- int m_sizetable_id;
- int m_opacitytable_id;
- QByteArray m_vertex_code;
- QByteArray m_fragment_code;
- QOpenGLFunctions* glFuncs;
-};
-
-class ParticleSpriteMaterialRhiShader : public QSGMaterialRhiShader
+class ParticleSpriteMaterialRhiShader : public QSGMaterialShader
{
public:
ParticleSpriteMaterialRhiShader()
@@ -541,12 +288,8 @@ public:
class SpriteMaterial : public ImageMaterial
{
public:
- SpriteMaterial() { setFlag(SupportsRhiShader, true); }
QSGMaterialShader *createShader() const override {
- if (flags().testFlag(RhiShaderWanted))
- return new ParticleSpriteMaterialRhiShader;
- else
- return new ParticleSpriteMaterialShader;
+ return new ParticleSpriteMaterialRhiShader;
}
QSGMaterialType *type() const override { return &m_type; }
@@ -559,90 +302,7 @@ private:
QSGMaterialType SpriteMaterial::m_type;
-class ColoredMaterialShader : public QSGMaterialShader
-{
-public:
- ColoredMaterialShader()
- {
- QSGShaderSourceBuilder builder;
- const bool isES = QOpenGLContext::currentContext()->isOpenGLES();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_vertex_code = builder.source();
- builder.clear();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag"));
- builder.addDefinition(QByteArrayLiteral("COLOR"));
- if (isES)
- builder.removeVersion();
-
- m_fragment_code = builder.source();
-
- Q_ASSERT(!m_vertex_code.isNull());
- Q_ASSERT(!m_fragment_code.isNull());
- }
-
- const char *vertexShader() const override { return m_vertex_code.constData(); }
- const char *fragmentShader() const override { return m_fragment_code.constData(); }
-
- char const *const *attributeNames() const override
- {
- static const char *const attr[] = { "vPos", "vData", "vVec", "vColor", nullptr };
- return attr;
- }
-
- void initialize() override {
- program()->bind();
- program()->setUniformValue("_qt_texture", 0);
- glFuncs = QOpenGLContext::currentContext()->functions();
- m_matrix_id = program()->uniformLocation("qt_Matrix");
- m_opacity_id = program()->uniformLocation("qt_Opacity");
- m_timestamp_id = program()->uniformLocation("timestamp");
- m_entry_id = program()->uniformLocation("entry");
- }
-
- void activate() override {
-#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN)
- glEnable(GL_POINT_SPRITE);
- glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
-#endif
- }
-
- void deactivate() override {
-#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN)
- glDisable(GL_POINT_SPRITE);
- glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
-#endif
- }
-
- void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override {
- ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state();
-
- if (renderState.isMatrixDirty())
- program()->setUniformValue(m_matrix_id, renderState.combinedMatrix());
- if (renderState.isOpacityDirty() && m_opacity_id >= 0)
- program()->setUniformValue(m_opacity_id, renderState.opacity());
-
- state->texture->bind();
-
- program()->setUniformValue(m_timestamp_id, (float) state->timestamp);
- program()->setUniformValue(m_entry_id, (float) state->entry);
- }
-
- int m_matrix_id;
- int m_opacity_id;
- int m_timestamp_id;
- int m_entry_id;
- QByteArray m_vertex_code;
- QByteArray m_fragment_code;
- QOpenGLFunctions* glFuncs;
-};
-
-class ColoredMaterialRhiShader : public QSGMaterialRhiShader
+class ColoredMaterialRhiShader : public QSGMaterialShader
{
public:
ColoredMaterialRhiShader()
@@ -691,12 +351,8 @@ public:
class ColoredMaterial : public ImageMaterial
{
public:
- ColoredMaterial() { setFlag(SupportsRhiShader, true); }
QSGMaterialShader *createShader() const override {
- if (flags().testFlag(RhiShaderWanted))
- return new ColoredMaterialRhiShader;
- else
- return new ColoredMaterialShader;
+ return new ColoredMaterialRhiShader;
}
QSGMaterialType *type() const override { return &m_type; }
@@ -709,88 +365,7 @@ private:
QSGMaterialType ColoredMaterial::m_type;
-class SimpleMaterialShader : public QSGMaterialShader
-{
-public:
- SimpleMaterialShader()
- {
- QSGShaderSourceBuilder builder;
- const bool isES = QOpenGLContext::currentContext()->isOpenGLES();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert"));
- if (isES)
- builder.removeVersion();
-
- m_vertex_code = builder.source();
- builder.clear();
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag"));
- if (isES)
- builder.removeVersion();
-
- m_fragment_code = builder.source();
-
- Q_ASSERT(!m_vertex_code.isNull());
- Q_ASSERT(!m_fragment_code.isNull());
- }
-
- const char *vertexShader() const override { return m_vertex_code.constData(); }
- const char *fragmentShader() const override { return m_fragment_code.constData(); }
-
- char const *const *attributeNames() const override
- {
- static const char *const attr[] = { "vPos", "vData", "vVec", nullptr };
- return attr;
- }
-
- void initialize() override {
- program()->bind();
- program()->setUniformValue("_qt_texture", 0);
- glFuncs = QOpenGLContext::currentContext()->functions();
- m_matrix_id = program()->uniformLocation("qt_Matrix");
- m_opacity_id = program()->uniformLocation("qt_Opacity");
- m_timestamp_id = program()->uniformLocation("timestamp");
- m_entry_id = program()->uniformLocation("entry");
- }
-
- void activate() override {
-#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN)
- glEnable(GL_POINT_SPRITE);
- glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
-#endif
- }
-
- void deactivate() override {
-#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN)
- glDisable(GL_POINT_SPRITE);
- glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
-#endif
- }
-
- void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override {
- ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state();
-
- if (renderState.isMatrixDirty())
- program()->setUniformValue(m_matrix_id, renderState.combinedMatrix());
- if (renderState.isOpacityDirty() && m_opacity_id >= 0)
- program()->setUniformValue(m_opacity_id, renderState.opacity());
-
- state->texture->bind();
-
- program()->setUniformValue(m_timestamp_id, (float) state->timestamp);
- program()->setUniformValue(m_entry_id, (float) state->entry);
- }
-
- int m_matrix_id;
- int m_opacity_id;
- int m_timestamp_id;
- int m_entry_id;
- QByteArray m_vertex_code;
- QByteArray m_fragment_code;
- QOpenGLFunctions* glFuncs;
-};
-
-class SimpleMaterialRhiShader : public QSGMaterialRhiShader
+class SimpleMaterialRhiShader : public QSGMaterialShader
{
public:
SimpleMaterialRhiShader()
@@ -839,12 +414,8 @@ public:
class SimpleMaterial : public ImageMaterial
{
public:
- SimpleMaterial() { setFlag(SupportsRhiShader, true); }
QSGMaterialShader *createShader() const override {
- if (flags().testFlag(RhiShaderWanted))
- return new SimpleMaterialRhiShader;
- else
- return new SimpleMaterialShader;
+ return new SimpleMaterialRhiShader;
}
QSGMaterialType *type() const override { return &m_type; }
@@ -1634,7 +1205,7 @@ void QQuickImageParticle::buildParticleNodes(QSGNode** passThrough)
void QQuickImageParticle::finishBuildParticleNodes(QSGNode** node)
{
- if (!m_rhi && !QOpenGLContext::currentContext())
+ if (!m_rhi)
return;
if (m_count * 4 > 0xffff) {
@@ -1682,36 +1253,11 @@ void QQuickImageParticle::finishBuildParticleNodes(QSGNode** node)
}
}
- if (!m_rhi) { // the RHI may be backed by GL but these checks should be obsolete in any case
-#ifdef Q_OS_WIN
- if (perfLevel < Deformable) //QTBUG-24540 , point sprite 'extension' isn't working on windows.
- perfLevel = Deformable;
-#endif
-
-#ifdef Q_OS_MAC
- // macOS 10.8.3 introduced a bug in the AMD drivers, for at least the 2011 macbook pros,
- // causing point sprites who read gl_PointCoord in the frag shader to come out as
- // green-red blobs.
- const GLubyte *glVendor = QOpenGLContext::currentContext()->functions()->glGetString(GL_VENDOR);
- if (perfLevel < Deformable && glVendor && strstr((char *) glVendor, "ATI")) {
- perfLevel = Deformable;
- }
-#endif
-
-#ifdef Q_OS_LINUX
- // Nouveau drivers can potentially freeze a machine entirely when taking the point-sprite path.
- const GLubyte *glVendor = QOpenGLContext::currentContext()->functions()->glGetString(GL_VENDOR);
- if (perfLevel < Deformable && glVendor && strstr((const char *) glVendor, "nouveau"))
- perfLevel = Deformable;
-#endif
-
- } else {
- // Points with a size other than 1 are an optional feature with QRhi
- // because some of the underlying APIs have no support for this.
- // Therefore, avoid the point sprite path with APIs like Direct3D.
- if (perfLevel < Deformable && !m_rhi->isFeatureSupported(QRhi::VertexShaderPointSize))
- perfLevel = Deformable;
- }
+ // Points with a size other than 1 are an optional feature with QRhi
+ // because some of the underlying APIs have no support for this.
+ // Therefore, avoid the point sprite path with APIs like Direct3D.
+ if (perfLevel < Deformable && !m_rhi->isFeatureSupported(QRhi::VertexShaderPointSize))
+ perfLevel = Deformable;
if (perfLevel >= Colored && !m_color.isValid())
m_color = QColor(Qt::white);//Hidden default, but different from unset
@@ -1850,19 +1396,8 @@ void QQuickImageParticle::finishBuildParticleNodes(QSGNode** node)
node->setGeometry(g);
if (perfLevel <= Colored){
g->setDrawingMode(QSGGeometry::DrawPoints);
- if (m_debugMode) {
- if (m_rhi) {
- qDebug("Using point sprites");
- } else {
-#if QT_CONFIG(opengl)
- GLfloat pointSizeRange[2];
- QOpenGLContext::currentContext()->functions()->glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange);
- qDebug() << "Using point sprites, GL_ALIASED_POINT_SIZE_RANGE " <<pointSizeRange[0] << ":" << pointSizeRange[1];
-#else
- qDebug("Using point sprites");
-#endif
- }
- }
+ if (m_debugMode)
+ qDebug("Using point sprites");
} else {
g->setDrawingMode(QSGGeometry::DrawTriangles);
}
@@ -1918,10 +1453,9 @@ QSGNode *QQuickImageParticle::updatePaintNode(QSGNode *node, UpdatePaintNodeData
return nullptr;
QSGRendererInterface::GraphicsApi api = rif->graphicsApi();
- const bool isDirectOpenGL = api == QSGRendererInterface::OpenGL;
const bool isRhi = QSGRendererInterface::isApiRhiBased(api);
- if (!node && !isDirectOpenGL && !isRhi)
+ if (!node && !isRhi)
return nullptr;
if (isRhi)
diff --git a/src/particles/shaders/imageparticle.frag b/src/particles/shaders/imageparticle.frag
deleted file mode 100644
index 92795a5381..0000000000
--- a/src/particles/shaders/imageparticle.frag
+++ /dev/null
@@ -1,42 +0,0 @@
-#version 120
-
-uniform sampler2D _qt_texture;
-uniform lowp float qt_Opacity;
-
-#if defined(SPRITE)
-varying highp vec4 fTexS;
-#elif defined(DEFORM)
-varying highp vec2 fTex;
-#endif
-
-#if defined(COLOR)
-varying lowp vec4 fColor;
-#else
-varying lowp float fFade;
-#endif
-
-#if defined(TABLE)
-varying lowp vec2 tt;
-uniform sampler2D colortable;
-#endif
-
-void main()
-{
-#if defined(SPRITE)
- gl_FragColor = mix(texture2D(_qt_texture, fTexS.xy), texture2D(_qt_texture, fTexS.zw), tt.y)
- * fColor
- * texture2D(colortable, tt)
- * qt_Opacity;
-#elif defined(TABLE)
- gl_FragColor = texture2D(_qt_texture, fTex)
- * fColor
- * texture2D(colortable, tt)
- * qt_Opacity;
-#elif defined(DEFORM)
- gl_FragColor = (texture2D(_qt_texture, fTex)) * fColor * qt_Opacity;
-#elif defined(COLOR)
- gl_FragColor = (texture2D(_qt_texture, gl_PointCoord)) * fColor * qt_Opacity;
-#else
- gl_FragColor = texture2D(_qt_texture, gl_PointCoord) * (fFade * qt_Opacity);
-#endif
-} \ No newline at end of file
diff --git a/src/particles/shaders/imageparticle.vert b/src/particles/shaders/imageparticle.vert
deleted file mode 100644
index 4057a9eb4b..0000000000
--- a/src/particles/shaders/imageparticle.vert
+++ /dev/null
@@ -1,141 +0,0 @@
-#version 120
-
-#if defined(DEFORM)
-attribute highp vec4 vPosTex;
-#else
-attribute highp vec2 vPos;
-#endif
-
-attribute highp vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize
-attribute highp vec4 vVec; // x,y = constant velocity, z,w = acceleration
-uniform highp float entry;
-
-#if defined(COLOR)
-attribute highp vec4 vColor;
-#endif
-
-#if defined(DEFORM)
-attribute highp vec4 vDeformVec; // x,y x unit vector; z,w = y unit vector
-attribute highp vec3 vRotation; // x = radians of rotation, y = rotation velocity, z = bool autoRotate
-#endif
-
-#if defined(SPRITE)
-attribute highp vec3 vAnimData; // w,h(premultiplied of anim), interpolation progress
-attribute highp vec4 vAnimPos; // x,y, x,y (two frames for interpolation)
-#endif
-
-uniform highp mat4 qt_Matrix;
-uniform highp float timestamp;
-
-#if defined(TABLE)
-varying lowp vec2 tt;//y is progress if Sprite mode
-uniform highp float sizetable[64];
-uniform highp float opacitytable[64];
-#endif
-
-#if defined(SPRITE)
-varying highp vec4 fTexS;
-#elif defined(DEFORM)
-varying highp vec2 fTex;
-#endif
-
-#if defined(COLOR)
-varying lowp vec4 fColor;
-#else
-varying lowp float fFade;
-#endif
-
-
-void main()
-{
- highp float t = (timestamp - vData.x) / vData.y;
- if (t < 0. || t > 1.) {
-#if defined(DEFORM)
- gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.);
-#else
- gl_PointSize = 0.;
-#endif
- } else {
-#if defined(SPRITE)
- tt.y = vAnimData.z;
-
- // Calculate frame location in texture
- fTexS.xy = vAnimPos.xy + vPosTex.zw * vAnimData.xy;
-
- // Next frame is also passed, for interpolation
- fTexS.zw = vAnimPos.zw + vPosTex.zw * vAnimData.xy;
-
-#elif defined(DEFORM)
- fTex = vPosTex.zw;
-#endif
- highp float currentSize = mix(vData.z, vData.w, t * t);
- lowp float fade = 1.;
- highp float fadeIn = min(t * 10., 1.);
- highp float fadeOut = 1. - clamp((t - 0.75) * 4.,0., 1.);
-
-#if defined(TABLE)
- currentSize = currentSize * sizetable[int(floor(t*64.))];
- fade = fade * opacitytable[int(floor(t*64.))];
-#endif
-
- if (entry == 1.)
- fade = fade * fadeIn * fadeOut;
- else if (entry == 2.)
- currentSize = currentSize * fadeIn * fadeOut;
-
- if (currentSize <= 0.) {
-#if defined(DEFORM)
- gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.);
-#else
- gl_PointSize = 0.;
-#endif
- } else {
- if (currentSize < 3.) // Sizes too small look jittery as they move
- currentSize = 3.;
-
- highp vec2 pos;
-#if defined(DEFORM)
- highp float rotation = vRotation.x + vRotation.y * t * vData.y;
- if (vRotation.z == 1.0){
- highp vec2 curVel = vVec.zw * t * vData.y + vVec.xy;
- if (length(curVel) > 0.)
- rotation += atan(curVel.y, curVel.x);
- }
- highp vec2 trigCalcs = vec2(cos(rotation), sin(rotation));
- highp vec4 deform = vDeformVec * currentSize * (vPosTex.zzww - 0.5);
- highp vec4 rotatedDeform = deform.xxzz * trigCalcs.xyxy;
- rotatedDeform = rotatedDeform + (deform.yyww * trigCalcs.yxyx * vec4(-1.,1.,-1.,1.));
- /* The readable version:
- highp vec2 xDeform = vDeformVec.xy * currentSize * (vTex.x-0.5);
- highp vec2 yDeform = vDeformVec.zw * currentSize * (vTex.y-0.5);
- highp vec2 xRotatedDeform;
- xRotatedDeform.x = trigCalcs.x*xDeform.x - trigCalcs.y*xDeform.y;
- xRotatedDeform.y = trigCalcs.y*xDeform.x + trigCalcs.x*xDeform.y;
- highp vec2 yRotatedDeform;
- yRotatedDeform.x = trigCalcs.x*yDeform.x - trigCalcs.y*yDeform.y;
- yRotatedDeform.y = trigCalcs.y*yDeform.x + trigCalcs.x*yDeform.y;
- */
- pos = vPosTex.xy
- + rotatedDeform.xy
- + rotatedDeform.zw
- + vVec.xy * t * vData.y // apply velocity
- + 0.5 * vVec.zw * pow(t * vData.y, 2.); // apply acceleration
-#else
- pos = vPos
- + vVec.xy * t * vData.y // apply velocity vector..
- + 0.5 * vVec.zw * pow(t * vData.y, 2.);
- gl_PointSize = currentSize;
-#endif
- gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1);
-
-#if defined(COLOR)
- fColor = vColor * fade;
-#else
- fFade = fade;
-#endif
-#if defined(TABLE)
- tt.x = t;
-#endif
- }
- }
-}
diff --git a/src/particles/shaders/imageparticle_core.frag b/src/particles/shaders/imageparticle_core.frag
deleted file mode 100644
index 3ac8c8d34e..0000000000
--- a/src/particles/shaders/imageparticle_core.frag
+++ /dev/null
@@ -1,44 +0,0 @@
-#version 150 core
-
-#if defined(SPRITE)
-in vec4 fTexS;
-#elif defined(DEFORM)
-in vec2 fTex;
-#endif
-
-#if defined(COLOR)
-in vec4 fColor;
-#else
-in float fFade;
-#endif
-
-#if defined(TABLE)
-in vec2 tt;
-uniform sampler2D colortable;
-#endif
-
-out vec4 fragColor;
-
-uniform sampler2D _qt_texture;
-uniform float qt_Opacity;
-
-void main()
-{
-#if defined(SPRITE)
- fragColor = mix(texture(_qt_texture, fTexS.xy), texture(_qt_texture, fTexS.zw), tt.y)
- * fColor
- * texture(colortable, tt)
- * qt_Opacity;
-#elif defined(TABLE)
- fragColor = texture(_qt_texture, fTex)
- * fColor
- * texture(colortable, tt)
- * qt_Opacity;
-#elif defined(DEFORM)
- fragColor = texture(_qt_texture, fTex) * fColor * qt_Opacity;
-#elif defined(COLOR)
- fragColor = texture(_qt_texture, gl_PointCoord) * fColor * qt_Opacity;
-#else
- fragColor = texture(_qt_texture, gl_PointCoord) * fFade * qt_Opacity;
-#endif
-} \ No newline at end of file
diff --git a/src/particles/shaders/imageparticle_core.vert b/src/particles/shaders/imageparticle_core.vert
deleted file mode 100644
index cfa0d57dfd..0000000000
--- a/src/particles/shaders/imageparticle_core.vert
+++ /dev/null
@@ -1,141 +0,0 @@
-#version 150 core
-
-#if defined(DEFORM)
-in vec4 vPosTex;
-#else
-in vec2 vPos;
-#endif
-
-in vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize
-in vec4 vVec; // x,y = constant velocity, z,w = acceleration
-uniform float entry;
-
-#if defined(COLOR)
-in vec4 vColor;
-#endif
-
-#if defined(DEFORM)
-in vec4 vDeformVec; // x,y x unit vector; z,w = y unit vector
-in vec3 vRotation; // x = radians of rotation, y = rotation velocity, z = bool autoRotate
-#endif
-
-#if defined(SPRITE)
-in vec3 vAnimData; // w,h(premultiplied of anim), interpolation progress
-in vec4 vAnimPos; // x,y, x,y (two frames for interpolation)
-#endif
-
-uniform mat4 qt_Matrix;
-uniform float timestamp;
-
-#if defined(TABLE)
-out vec2 tt;//y is progress if Sprite mode
-uniform float sizetable[64];
-uniform float opacitytable[64];
-#endif
-
-#if defined(SPRITE)
-out vec4 fTexS;
-#elif defined(DEFORM)
-out vec2 fTex;
-#endif
-
-#if defined(COLOR)
-out vec4 fColor;
-#else
-out float fFade;
-#endif
-
-
-void main()
-{
- float t = (timestamp - vData.x) / vData.y;
- if (t < 0. || t > 1.) {
-#if defined(DEFORM)
- gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.);
-#else
- gl_PointSize = 0.;
-#endif
- } else {
-#if defined(SPRITE)
- tt.y = vAnimData.z;
-
- // Calculate frame location in texture
- fTexS.xy = vAnimPos.xy + vPosTex.zw * vAnimData.xy;
-
- // Next frame is also passed, for interpolation
- fTexS.zw = vAnimPos.zw + vPosTex.zw * vAnimData.xy;
-
-#elif defined(DEFORM)
- fTex = vPosTex.zw;
-#endif
- float currentSize = mix(vData.z, vData.w, t * t);
- float fade = 1.;
- float fadeIn = min(t * 10., 1.);
- float fadeOut = 1. - clamp((t - 0.75) * 4.,0., 1.);
-
-#if defined(TABLE)
- currentSize = currentSize * sizetable[int(floor(t*64.))];
- fade = fade * opacitytable[int(floor(t*64.))];
-#endif
-
- if (entry == 1.)
- fade = fade * fadeIn * fadeOut;
- else if (entry == 2.)
- currentSize = currentSize * fadeIn * fadeOut;
-
- if (currentSize <= 0.) {
-#if defined(DEFORM)
- gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.);
-#else
- gl_PointSize = 0.;
-#endif
- } else {
- if (currentSize < 3.) // Sizes too small look jittery as they move
- currentSize = 3.;
-
- vec2 pos;
-#if defined(DEFORM)
- float rotation = vRotation.x + vRotation.y * t * vData.y;
- if (vRotation.z == 1.0) {
- vec2 curVel = vVec.zw * t * vData.y + vVec.xy;
- if (length(curVel) > 0.)
- rotation += atan(curVel.y, curVel.x);
- }
- vec2 trigCalcs = vec2(cos(rotation), sin(rotation));
- vec4 deform = vDeformVec * currentSize * (vPosTex.zzww - 0.5);
- vec4 rotatedDeform = deform.xxzz * trigCalcs.xyxy;
- rotatedDeform = rotatedDeform + (deform.yyww * trigCalcs.yxyx * vec4(-1.,1.,-1.,1.));
- /* The readable version:
- vec2 xDeform = vDeformVec.xy * currentSize * (vTex.x-0.5);
- vec2 yDeform = vDeformVec.zw * currentSize * (vTex.y-0.5);
- vec2 xRotatedDeform;
- xRotatedDeform.x = trigCalcs.x*xDeform.x - trigCalcs.y*xDeform.y;
- xRotatedDeform.y = trigCalcs.y*xDeform.x + trigCalcs.x*xDeform.y;
- vec2 yRotatedDeform;
- yRotatedDeform.x = trigCalcs.x*yDeform.x - trigCalcs.y*yDeform.y;
- yRotatedDeform.y = trigCalcs.y*yDeform.x + trigCalcs.x*yDeform.y;
- */
- pos = vPosTex.xy
- + rotatedDeform.xy
- + rotatedDeform.zw
- + vVec.xy * t * vData.y // apply velocity
- + 0.5 * vVec.zw * pow(t * vData.y, 2.); // apply acceleration
-#else
- pos = vPos
- + vVec.xy * t * vData.y // apply velocity vector..
- + 0.5 * vVec.zw * pow(t * vData.y, 2.);
- gl_PointSize = currentSize;
-#endif
- gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1);
-
-#if defined(COLOR)
- fColor = vColor * fade;
-#else
- fFade = fade;
-#endif
-#if defined(TABLE)
- tt.x = t;
-#endif
- }
- }
-}