Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qshader.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 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
4#include "qshader_p.h"
5#include <QDataStream>
6#include <QBuffer>
7
9
256 : d(nullptr)
257{
258}
259
264{
265 if (d)
266 qAtomicDetach(d);
267 else
268 d = new QShaderPrivate;
269}
270
275 : d(other.d)
276{
277 if (d)
278 d->ref.ref();
279}
280
285{
286 if (d) {
287 if (other.d) {
288 qAtomicAssign(d, other.d);
289 } else {
290 if (!d->ref.deref())
291 delete d;
292 d = nullptr;
293 }
294 } else if (other.d) {
295 other.d->ref.ref();
296 d = other.d;
297 }
298 return *this;
299}
300
327{
328 if (d && !d->ref.deref())
329 delete d;
330}
331
344{
345 return d ? !d->shaders.isEmpty() : false;
346}
347
352{
353 return d ? d->stage : QShader::VertexStage;
354}
355
360{
361 if (!d || stage != d->stage) {
362 detach();
363 d->stage = stage;
364 }
365}
366
371{
372 return d ? d->desc : QShaderDescription();
373}
374
379{
380 detach();
381 d->desc = desc;
382}
383
387QList<QShaderKey> QShader::availableShaders() const
388{
389 return d ? d->shaders.keys().toVector() : QList<QShaderKey>();
390}
391
396{
397 return d ? d->shaders.value(key) : QShaderCode();
398}
399
404{
405 if (d && d->shaders.value(key) == shader)
406 return;
407
408 detach();
409 d->shaders[key] = shader;
410}
411
417{
418 if (!d)
419 return;
420
421 auto it = d->shaders.find(key);
422 if (it == d->shaders.end())
423 return;
424
425 detach();
426 d->shaders.erase(it);
427}
428
429static void writeShaderKey(QDataStream *ds, const QShaderKey &k)
430{
431 *ds << int(k.source());
432 *ds << k.sourceVersion().version();
433 *ds << k.sourceVersion().flags();
434 *ds << int(k.sourceVariant());
435}
436
451{
452 static QShaderPrivate sd;
453 QShaderPrivate *dd = d ? d : &sd;
454
455 QBuffer buf;
456 QDataStream ds(&buf);
457 ds.setVersion(QDataStream::Qt_5_10);
458 if (!buf.open(QIODevice::WriteOnly))
459 return QByteArray();
460
461 const int qsbVersion = QShaderPrivate::qtQsbVersion(version);
462 ds << qsbVersion;
463
464 ds << int(dd->stage);
465 dd->desc.serialize(&ds, qsbVersion);
466 ds << int(dd->shaders.size());
467 for (auto it = dd->shaders.cbegin(), itEnd = dd->shaders.cend(); it != itEnd; ++it) {
468 const QShaderKey &k(it.key());
469 writeShaderKey(&ds, k);
470 const QShaderCode &shader(dd->shaders.value(k));
471 ds << shader.shader();
472 ds << shader.entryPoint();
473 }
474 ds << int(dd->bindings.size());
475 for (auto it = dd->bindings.cbegin(), itEnd = dd->bindings.cend(); it != itEnd; ++it) {
476 const QShaderKey &k(it.key());
477 writeShaderKey(&ds, k);
478 const NativeResourceBindingMap &map(it.value());
479 ds << int(map.size());
480 for (auto mapIt = map.cbegin(), mapItEnd = map.cend(); mapIt != mapItEnd; ++mapIt) {
481 ds << mapIt.key();
482 ds << mapIt.value().first;
483 ds << mapIt.value().second;
484 }
485 }
486 ds << int(dd->combinedImageMap.size());
487 for (auto it = dd->combinedImageMap.cbegin(), itEnd = dd->combinedImageMap.cend(); it != itEnd; ++it) {
488 const QShaderKey &k(it.key());
489 writeShaderKey(&ds, k);
491 ds << int(list.size());
492 for (auto listIt = list.cbegin(), listItEnd = list.cend(); listIt != listItEnd; ++listIt) {
493 ds << listIt->combinedSamplerName;
494 ds << listIt->textureBinding;
495 ds << listIt->samplerBinding;
496 }
497 }
499 ds << int(dd->nativeShaderInfoMap.size());
500 for (auto it = dd->nativeShaderInfoMap.cbegin(), itEnd = dd->nativeShaderInfoMap.cend(); it != itEnd; ++it) {
501 const QShaderKey &k(it.key());
502 writeShaderKey(&ds, k);
503 ds << it->flags;
504 ds << int(it->extraBufferBindings.size());
505 for (auto mapIt = it->extraBufferBindings.cbegin(), mapItEnd = it->extraBufferBindings.cend();
506 mapIt != mapItEnd; ++mapIt)
507 {
508 ds << mapIt.key();
509 ds << mapIt.value();
510 }
511 }
512 }
513
514 return qCompress(buf.buffer());
515}
516
518{
519 int intVal;
520 *ds >> intVal;
521 k->setSource(QShader::Source(intVal));
522 QShaderVersion ver;
523 *ds >> intVal;
524 ver.setVersion(intVal);
525 *ds >> intVal;
526 ver.setFlags(QShaderVersion::Flags(intVal));
527 k->setSourceVersion(ver);
528 *ds >> intVal;
530}
531
541{
542 QByteArray udata = qUncompress(data);
543 QBuffer buf(&udata);
544 QDataStream ds(&buf);
545 ds.setVersion(QDataStream::Qt_5_10);
546 if (!buf.open(QIODevice::ReadOnly))
547 return QShader();
548
549 QShader bs;
550 bs.detach(); // to get d created
552 Q_ASSERT(d->ref.loadRelaxed() == 1); // must be detached
553 int intVal;
554 ds >> intVal;
555 d->qsbVersion = intVal;
556 if (d->qsbVersion != QShaderPrivate::QSB_VERSION
565 {
566 qWarning("Attempted to deserialize QShader with unknown version %d.", d->qsbVersion);
567 return QShader();
568 }
569
570 ds >> intVal;
571 d->stage = Stage(intVal);
572 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITH_CBOR) {
573 d->desc = QShaderDescription::deserialize(&ds, d->qsbVersion);
574 } else if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITH_BINARY_JSON) {
575 qWarning("Can no longer load QShaderDescription from CBOR.");
576 d->desc = QShaderDescription();
577 } else {
578 qWarning("Can no longer load QShaderDescription from binary JSON.");
579 d->desc = QShaderDescription();
580 }
581 int count;
582 ds >> count;
583 for (int i = 0; i < count; ++i) {
584 QShaderKey k;
585 readShaderKey(&ds, &k);
588 ds >> s;
589 shader.setShader(s);
590 ds >> s;
591 shader.setEntryPoint(s);
592 d->shaders[k] = shader;
593 }
594
596 ds >> count;
597 for (int i = 0; i < count; ++i) {
598 QShaderKey k;
599 readShaderKey(&ds, &k);
601 int mapSize;
602 ds >> mapSize;
603 for (int b = 0; b < mapSize; ++b) {
604 int binding;
605 ds >> binding;
606 int firstNativeBinding;
607 ds >> firstNativeBinding;
608 int secondNativeBinding;
609 ds >> secondNativeBinding;
610 map.insert(binding, { firstNativeBinding, secondNativeBinding });
611 }
612 d->bindings.insert(k, map);
613 }
614 }
615
617 ds >> count;
618 for (int i = 0; i < count; ++i) {
619 QShaderKey k;
620 readShaderKey(&ds, &k);
622 int listSize;
623 ds >> listSize;
624 for (int b = 0; b < listSize; ++b) {
625 QByteArray combinedSamplerName;
626 ds >> combinedSamplerName;
627 int textureBinding;
628 ds >> textureBinding;
629 int samplerBinding;
630 ds >> samplerBinding;
631 list.append({ combinedSamplerName, textureBinding, samplerBinding });
632 }
633 d->combinedImageMap.insert(k, list);
634 }
635 }
636
638 ds >> count;
639 for (int i = 0; i < count; ++i) {
640 QShaderKey k;
641 readShaderKey(&ds, &k);
642 int flags;
643 ds >> flags;
644 QMap<int, int> extraBufferBindings;
645 int mapSize;
646 ds >> mapSize;
647 for (int b = 0; b < mapSize; ++b) {
648 int k, v;
649 ds >> k;
650 ds >> v;
651 extraBufferBindings.insert(k, v);
652 }
653 d->nativeShaderInfoMap.insert(k, { flags, extraBufferBindings });
654 }
655 }
656
657 return bs;
658}
659
668 : m_version(v), m_flags(f)
669{
670}
671
701 : m_shader(code), m_entryPoint(entry)
702{
703}
704
734 const QShaderVersion &sver,
735 QShader::Variant svar)
736 : m_source(s),
737 m_sourceVersion(sver),
738 m_sourceVariant(svar)
739{
740}
741
779bool operator==(const QShader &lhs, const QShader &rhs) noexcept
780{
781 if (!lhs.d || !rhs.d)
782 return lhs.d == rhs.d;
783
784 return lhs.d->stage == rhs.d->stage
785 && lhs.d->shaders == rhs.d->shaders
786 && lhs.d->bindings == rhs.d->bindings;
787}
788
803size_t qHash(const QShader &s, size_t seed) noexcept
804{
805 if (s.d) {
807 seed = hash(seed, s.stage());
808 if (!s.d->shaders.isEmpty()) {
809 seed = hash(seed, s.d->shaders.firstKey());
810 seed = hash(seed, std::as_const(s.d->shaders).first());
811 }
812 }
813 return seed;
814}
815
822bool operator==(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept
823{
824 return lhs.version() == rhs.version() && lhs.flags() == rhs.flags();
825}
826
827#ifdef Q_OS_INTEGRITY
828size_t qHash(const QShaderVersion &s, size_t seed) noexcept
829{
830 return qHashMulti(seed, s.version(), s.flags());
831}
832#endif
833
841bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept
842{
843 if (lhs.version() < rhs.version())
844 return true;
845
846 if (lhs.version() == rhs.version())
847 return int(lhs.flags()) < int(rhs.flags());
848
849 return false;
850}
851
866bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept
867{
868 return lhs.source() == rhs.source() && lhs.sourceVersion() == rhs.sourceVersion()
869 && lhs.sourceVariant() == rhs.sourceVariant();
870}
871
879bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept
880{
881 if (int(lhs.source()) < int(rhs.source()))
882 return true;
883
884 if (int(lhs.source()) == int(rhs.source())) {
885 if (lhs.sourceVersion() < rhs.sourceVersion())
886 return true;
887 if (lhs.sourceVersion() == rhs.sourceVersion()) {
888 if (int(lhs.sourceVariant()) < int(rhs.sourceVariant()))
889 return true;
890 }
891 }
892
893 return false;
894}
895
910size_t qHash(const QShaderKey &k, size_t seed) noexcept
911{
912 return qHashMulti(seed,
913 k.source(),
914 k.sourceVersion().version(),
915 k.sourceVersion().flags(),
916 k.sourceVariant());
917}
918
924bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) noexcept
925{
926 return lhs.shader() == rhs.shader() && lhs.entryPoint() == rhs.entryPoint();
927}
928
943size_t qHash(const QShaderCode &k, size_t seed) noexcept
944{
945 return qHash(k.shader(), seed);
946}
947
948#ifndef QT_NO_DEBUG_STREAM
950{
951 const QShaderPrivate *d = bs.d;
952 QDebugStateSaver saver(dbg);
953
954 if (d) {
955 dbg.nospace() << "QShader("
956 << "stage=" << d->stage
957 << " shaders=" << d->shaders.keys()
958 << " desc.isValid=" << d->desc.isValid()
959 << ')';
960 } else {
961 dbg.nospace() << "QShader()";
962 }
963
964 return dbg;
965}
966
968{
969 QDebugStateSaver saver(dbg);
970 dbg.nospace() << "ShaderKey(" << k.source()
971 << " " << k.sourceVersion()
972 << " " << k.sourceVariant() << ")";
973 return dbg;
974}
975
977{
978 QDebugStateSaver saver(dbg);
979 dbg.nospace() << "Version(" << v.version() << " " << v.flags() << ")";
980 return dbg;
981}
982#endif // QT_NO_DEBUG_STREAM
983
1025{
1026 if (!d)
1027 return {};
1028
1029 auto it = d->bindings.constFind(key);
1030 if (it == d->bindings.cend())
1031 return {};
1032
1033 return it.value();
1034}
1035
1046
1051{
1052 if (!d)
1053 return;
1054
1055 auto it = d->bindings.find(key);
1056 if (it == d->bindings.end())
1057 return;
1058
1059 detach();
1060 d->bindings.erase(it);
1061}
1062
1105{
1106 if (!d)
1107 return {};
1108
1109 auto it = d->combinedImageMap.constFind(key);
1110 if (it == d->combinedImageMap.cend())
1111 return {};
1112
1113 return it.value();
1114}
1115
1127
1132{
1133 if (!d)
1134 return;
1135
1136 auto it = d->combinedImageMap.find(key);
1137 if (it == d->combinedImageMap.end())
1138 return;
1139
1140 detach();
1141 d->combinedImageMap.erase(it);
1142}
1143
1183{
1184 if (!d)
1185 return {};
1186
1188 if (it == d->nativeShaderInfoMap.cend())
1189 return {};
1190
1191 return it.value();
1192}
1193
1204
1209{
1210 if (!d)
1211 return;
1212
1213 auto it = d->nativeShaderInfoMap.find(key);
1214 if (it == d->nativeShaderInfoMap.end())
1215 return;
1216
1217 detach();
1219}
1220
bool ref() noexcept
bool deref() noexcept
\inmodule QtCore \reentrant
Definition qbuffer.h:16
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore\reentrant
Definition qdatastream.h:46
void setVersion(int)
Sets the version number of the data serialization format to v, a value of the \l Version enum.
\inmodule QtCore
\inmodule QtCore
Definition qlist.h:75
qsizetype size() const noexcept
Definition qlist.h:397
const_iterator cend() const noexcept
Definition qlist.h:631
void append(parameter_type t)
Definition qlist.h:458
const_iterator cbegin() const noexcept
Definition qlist.h:630
iterator insert(const Key &key, const T &value)
Definition qmap.h:688
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:357
iterator erase(const_iterator it)
Definition qmap.h:619
const_iterator cend() const
Definition qmap.h:605
const_iterator cbegin() const
Definition qmap.h:601
const_iterator constFind(const Key &key) const
Definition qmap.h:655
QList< Key > keys() const
Definition qmap.h:383
iterator find(const Key &key)
Definition qmap.h:641
bool isEmpty() const
Definition qmap.h:269
iterator end()
Definition qmap.h:602
size_type size() const
Definition qmap.h:267
qsizetype size() const
Definition qset.h:50
const_iterator cend() const noexcept
Definition qset.h:142
const_iterator cbegin() const noexcept
Definition qset.h:138
\inmodule QtGui
Definition qshader.h:60
bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) noexcept
Returns true if the two QShaderCode objects lhs and rhs are equal.
Definition qshader.cpp:924
QShaderCode()=default
void serialize(QDataStream *stream, int version) const
Serializes this QShaderDescription to stream.
static QShaderDescription deserialize(QDataStream *stream, int version)
\inmodule QtGui
Definition qshader.h:178
size_t qHash(const QShaderKey &k, size_t seed) noexcept
Returns the hash value for k, using seed to seed the calculation.
Definition qshader.cpp:910
void setSource(QShader::Source s)
Sets the shader type s.
Definition qshader.h:186
void setSourceVariant(QShader::Variant svar)
Sets the type of variant to use to svar.
Definition qshader.h:192
void setSourceVersion(const QShaderVersion &sver)
Sets the shading language version sver.
Definition qshader.h:189
QShader::Source source() const
Definition qshader.h:185
QShaderVersion sourceVersion() const
Definition qshader.h:188
QShader::Variant sourceVariant() const
Definition qshader.h:191
bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) noexcept
Returns true if the two QShaderKey objects lhs and rhs are equal.
Definition qshader.cpp:866
bool operator<(const QShaderKey &lhs, const QShaderKey &rhs) noexcept
Definition qshader.cpp:879
QShaderKey()=default
\inmodule QtGui
Definition qshader.h:32
bool operator<(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept
Definition qshader.cpp:841
void setVersion(int v)
Sets the shading language version to v.
Definition qshader.h:43
void setFlags(Flags f)
Sets the flags f.
Definition qshader.h:46
Flags flags() const
Definition qshader.h:45
QShaderVersion()=default
int version() const
Definition qshader.h:42
bool operator==(const QShaderVersion &lhs, const QShaderVersion &rhs) noexcept
Returns true if the two QShaderVersion objects lhs and rhs are equal.
Definition qshader.cpp:822
\inmodule QtGui
Definition qshader.h:81
SerializedFormatVersion
Describes the desired output format when serializing the QShader.
Definition qshader.h:111
SeparateToCombinedImageSamplerMappingList separateToCombinedImageSamplerMappingList(const QShaderKey &key) const
\variable QShader::SeparateToCombinedImageSamplerMapping::combinedSamplerName
Definition qshader.cpp:1104
void removeResourceBindingMap(const QShaderKey &key)
Removes the native resource binding map for key.
Definition qshader.cpp:1050
void setNativeShaderInfo(const QShaderKey &key, const NativeShaderInfo &info)
Stores the given native shader info associated with key.
Definition qshader.cpp:1199
QShaderCode shader(const QShaderKey &key) const
Definition qshader.cpp:395
QList< QShaderKey > availableShaders() const
Definition qshader.cpp:387
void setSeparateToCombinedImageSamplerMappingList(const QShaderKey &key, const SeparateToCombinedImageSamplerMappingList &list)
Stores the given combined image sampler mapping list associated with key.
Definition qshader.cpp:1121
NativeResourceBindingMap nativeResourceBindingMap(const QShaderKey &key) const
Definition qshader.cpp:1024
QShader & operator=(const QShader &other)
Assigns other to this object.
Definition qshader.cpp:284
static QShader fromSerialized(const QByteArray &data)
Creates a new QShader instance from the given data.
Definition qshader.cpp:540
Stage stage() const
Definition qshader.cpp:351
friend struct QShaderPrivate
Definition qshader.h:169
void removeShader(const QShaderKey &key)
Removes the source or binary shader code for a given key.
Definition qshader.cpp:416
NativeShaderInfo nativeShaderInfo(const QShaderKey &key) const
\variable QShader::NativeShaderInfo::flags
Definition qshader.cpp:1182
void removeNativeShaderInfo(const QShaderKey &key)
Removes the native shader information for key.
Definition qshader.cpp:1208
QShader()
Constructs a new, empty (and thus invalid) QShader instance.
Definition qshader.cpp:255
Variant
Describes what kind of shader code an entry contains.
Definition qshader.h:103
void setShader(const QShaderKey &key, const QShaderCode &shader)
Stores the source or binary shader code for a given shader version specified by key.
Definition qshader.cpp:403
void setResourceBindingMap(const QShaderKey &key, const NativeResourceBindingMap &map)
Stores the given native resource binding map associated with key.
Definition qshader.cpp:1041
void removeSeparateToCombinedImageSamplerMappingList(const QShaderKey &key)
Removes the combined image sampler mapping list for key.
Definition qshader.cpp:1131
Source
Describes what kind of shader code an entry contains.
Definition qshader.h:92
void detach()
Definition qshader.cpp:263
~QShader()
Destructor.
Definition qshader.cpp:326
QShaderDescription description() const
Definition qshader.cpp:370
void setDescription(const QShaderDescription &desc)
Sets the reflection metadata to desc.
Definition qshader.cpp:378
Stage
Describes the stage of the graphics pipeline the shader is suitable for.
Definition qshader.h:83
@ VertexStage
Definition qshader.h:84
bool isValid() const
Definition qshader.cpp:343
void setStage(Stage stage)
Sets the pipeline stage.
Definition qshader.cpp:359
QByteArray serialized(SerializedFormatVersion version=SerializedFormatVersion::Latest) const
Definition qshader.cpp:450
QHash< int, QWidget * > hash
[35multi]
QMap< QString, QString > map
[6]
QSet< QString >::iterator it
Combined button and popup list for selecting options.
QT_WARNING_POP void qAtomicAssign(T *&d, T *x)
This is a helper for the assignment operators of implicitly shared classes.
Definition qatomic.h:180
void qAtomicDetach(T *&d)
This is a helper for the detach method of implicitly shared classes.
Definition qatomic.h:199
QByteArray qCompress(const uchar *data, qsizetype nbytes, int compressionLevel)
Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, qsizetype nbytes)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
size_t qHash(const QFileSystemWatcherPathKey &key, size_t seed=0)
Flags
constexpr QtPrivate::QHashMultiReturnType< T... > qHashMulti(size_t seed, const T &... args) noexcept(std::conjunction_v< QtPrivate::QNothrowHashable< T >... >)
#define qWarning
Definition qlogging.h:166
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLuint64 key
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat GLfloat f
GLenum GLuint GLenum GLsizei const GLchar * buf
GLbitfield flags
GLdouble s
[6]
Definition qopenglext.h:235
GLuint entry
GLuint shader
Definition qopenglext.h:665
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
Definition qrandom.cpp:196
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
Definition qrandom.cpp:1220
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static void readShaderKey(QDataStream *ds, QShaderKey *k)
Definition qshader.cpp:517
QDebug operator<<(QDebug dbg, const QShader &bs)
Definition qshader.cpp:949
static void writeShaderKey(QDataStream *ds, const QShaderKey &k)
Definition qshader.cpp:429
QList< int > list
[14]
QObject::connect nullptr
QSharedPointer< T > other(t)
[5]
QHostInfo info
[0]
QMap< QShaderKey, QShader::SeparateToCombinedImageSamplerMappingList > combinedImageMap
Definition qshader_p.h:85
static const int QSB_VERSION_WITH_CBOR
Definition qshader_p.h:33
static const int QSB_VERSION_WITH_BINARY_JSON
Definition qshader_p.h:34
QShader::Stage stage
Definition qshader_p.h:80
QMap< QShaderKey, QShader::NativeResourceBindingMap > bindings
Definition qshader_p.h:84
static const int QSB_VERSION_WITHOUT_INPUT_OUTPUT_INTERFACE_BLOCKS
Definition qshader_p.h:28
static const int QSB_VERSION_WITHOUT_BINDINGS
Definition qshader_p.h:35
static const int QSB_VERSION_WITHOUT_VAR_ARRAYDIMS
Definition qshader_p.h:32
QAtomicInt ref
Definition qshader_p.h:78
static const int QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO
Definition qshader_p.h:29
static int qtQsbVersion(QShader::SerializedFormatVersion qtVersion)
Definition qshader_p.h:67
QMap< QShaderKey, QShaderCode > shaders
Definition qshader_p.h:83
QMap< QShaderKey, QShader::NativeShaderInfo > nativeShaderInfoMap
Definition qshader_p.h:86
static const int QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO
Definition qshader_p.h:30
static QShaderPrivate * get(QShader *s)
Definition qshader_p.h:65
static const int QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS
Definition qshader_p.h:31
QShaderDescription desc
Definition qshader_p.h:81
static const int QSB_VERSION
Definition qshader_p.h:27
\inmodule QtGui
Definition qshader.h:159