Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qopenglcustomshaderstage.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
8#include <private/qpainter_p.h>
9
10#include <QtCore/qpointer.h>
11
13
23
24
25
26
27QOpenGLCustomShaderStage::QOpenGLCustomShaderStage()
28 : d_ptr(new QOpenGLCustomShaderStagePrivate)
29{
30}
31
32QOpenGLCustomShaderStage::~QOpenGLCustomShaderStage()
33{
34 Q_D(QOpenGLCustomShaderStage);
35 if (d->m_manager) {
36 d->m_manager->removeCustomStage();
37 d->m_manager->sharedShaders->cleanupCustomStage(this);
38 }
39 delete d_ptr;
40}
41
42void QOpenGLCustomShaderStage::setUniformsDirty()
43{
44 Q_D(QOpenGLCustomShaderStage);
45 if (d->m_manager)
46 d->m_manager->setDirty(); // ### Probably a bit overkill!
47}
48
49bool QOpenGLCustomShaderStage::setOnPainter(QPainter* p)
50{
51 Q_D(QOpenGLCustomShaderStage);
52 if (p->paintEngine()->type() != QPaintEngine::OpenGL2) {
53 qWarning("QOpenGLCustomShaderStage::setOnPainter() - paint engine not OpenGL2");
54 return false;
55 }
56 if (d->m_manager)
57 qWarning("Custom shader is already set on a painter");
58
59 QOpenGL2PaintEngineEx *engine = static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine());
60 d->m_manager = QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
61 Q_ASSERT(d->m_manager);
62
63 d->m_manager->setCustomStage(this);
64 return true;
65}
66
67void QOpenGLCustomShaderStage::removeFromPainter(QPainter* p)
68{
69 Q_D(QOpenGLCustomShaderStage);
70 if (p->paintEngine()->type() != QPaintEngine::OpenGL2)
71 return;
72
73 QOpenGL2PaintEngineEx *engine = static_cast<QOpenGL2PaintEngineEx*>(p->paintEngine());
74 d->m_manager = QOpenGL2PaintEngineExPrivate::shaderManagerForEngine(engine);
75 Q_ASSERT(d->m_manager);
76
77 // Just set the stage to null, don't call removeCustomStage().
78 // This should leave the program in a compiled/linked state
79 // if the next custom shader stage is this one again.
80 d->m_manager->setCustomStage(nullptr);
81 d->m_manager = nullptr;
82}
83
84QByteArray QOpenGLCustomShaderStage::source() const
85{
86 Q_D(const QOpenGLCustomShaderStage);
87 return d->m_source;
88}
89
90// Called by the shader manager if another custom shader is attached or
91// the manager is deleted
92void QOpenGLCustomShaderStage::setInactive()
93{
94 Q_D(QOpenGLCustomShaderStage);
95 d->m_manager = nullptr;
96}
97
98void QOpenGLCustomShaderStage::setSource(const QByteArray& s)
99{
100 Q_D(QOpenGLCustomShaderStage);
101 d->m_source = s;
102}
103
104QT_END_NAMESPACE
QPointer< QOpenGLEngineShaderManager > m_manager
Combined button and popup list for selecting options.