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
qshaderdescription.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
5#include "qshader_p.h"
6#include <QDebug>
7#include <QDataStream>
8#include <QJsonObject>
9#include <QJsonArray>
10
12
555
563
572
581
586{
587 if (!d->ref.deref())
588 delete d;
589}
590
596{
597 return !d->inVars.isEmpty() || !d->outVars.isEmpty()
601 || !d->inBuiltins.isEmpty() || !d->outBuiltins.isEmpty();
602}
603
612{
613 return d->makeDoc().toJson();
614}
615
623{
624 d->writeToStream(stream, version);
625}
626
634{
636 QShaderDescriptionPrivate::get(&desc)->loadFromStream(stream, version);
637 return desc;
638}
639
645QList<QShaderDescription::InOutVariable> QShaderDescription::inputVariables() const
646{
647 return d->inVars;
648}
649
653QList<QShaderDescription::InOutVariable> QShaderDescription::outputVariables() const
654{
655 return d->outVars;
656}
657
661QList<QShaderDescription::UniformBlock> QShaderDescription::uniformBlocks() const
662{
663 return d->uniformBlocks;
664}
665
673QList<QShaderDescription::PushConstantBlock> QShaderDescription::pushConstantBlocks() const
674{
675 return d->pushConstantBlocks;
676}
677
748QList<QShaderDescription::StorageBlock> QShaderDescription::storageBlocks() const
749{
750 return d->storageBlocks;
751}
752
775QList<QShaderDescription::InOutVariable> QShaderDescription::combinedImageSamplers() const
776{
777 return d->combinedImageSamplers;
778}
779
780QList<QShaderDescription::InOutVariable> QShaderDescription::separateImages() const
781{
782 return d->separateImages;
783}
784
785QList<QShaderDescription::InOutVariable> QShaderDescription::separateSamplers() const
786{
787 return d->separateSamplers;
788}
789
812QList<QShaderDescription::InOutVariable> QShaderDescription::storageImages() const
813{
814 return d->storageImages;
815}
816
822QVector<QShaderDescription::BuiltinVariable> QShaderDescription::inputBuiltinVariables() const
823{
824 return d->inBuiltins;
825}
826
831QVector<QShaderDescription::BuiltinVariable> QShaderDescription::outputBuiltinVariables() const
832{
833 return d->outBuiltins;
834}
835
847{
848 return d->localSize;
849}
850
865
892
918
945
946static const struct TypeTab {
947 const char k[20];
949} typeTab[] = {
950 { "float", QShaderDescription::Float },
951 { "vec2", QShaderDescription::Vec2 },
952 { "vec3", QShaderDescription::Vec3 },
953 { "vec4", QShaderDescription::Vec4 },
954 { "mat2", QShaderDescription::Mat2 },
955 { "mat3", QShaderDescription::Mat3 },
956 { "mat4", QShaderDescription::Mat4 },
957
958 { "struct", QShaderDescription::Struct },
959
960 { "sampler1D", QShaderDescription::Sampler1D },
961 { "sampler2D", QShaderDescription::Sampler2D },
962 { "sampler2DMS", QShaderDescription::Sampler2DMS },
963 { "sampler3D", QShaderDescription::Sampler3D },
964 { "samplerCube", QShaderDescription::SamplerCube },
965 { "sampler1DArray", QShaderDescription::Sampler1DArray },
966 { "sampler2DArray", QShaderDescription::Sampler2DArray },
967 { "sampler2DMSArray", QShaderDescription::Sampler2DMSArray },
968 { "sampler3DArray", QShaderDescription::Sampler3DArray },
969 { "samplerCubeArray", QShaderDescription::SamplerCubeArray },
970 { "samplerRect", QShaderDescription::SamplerRect },
971 { "samplerBuffer", QShaderDescription::SamplerBuffer },
972 { "samplerExternalOES", QShaderDescription::SamplerExternalOES },
973 { "sampler", QShaderDescription::Sampler },
974
975 { "mat2x3", QShaderDescription::Mat2x3 },
976 { "mat2x4", QShaderDescription::Mat2x4 },
977 { "mat3x2", QShaderDescription::Mat3x2 },
978 { "mat3x4", QShaderDescription::Mat3x4 },
979 { "mat4x2", QShaderDescription::Mat4x2 },
980 { "mat4x3", QShaderDescription::Mat4x3 },
981
982 { "int", QShaderDescription::Int },
983 { "ivec2", QShaderDescription::Int2 },
984 { "ivec3", QShaderDescription::Int3 },
985 { "ivec4", QShaderDescription::Int4 },
986
987 { "uint", QShaderDescription::Uint },
988 { "uvec2", QShaderDescription::Uint2 },
989 { "uvec3", QShaderDescription::Uint3 },
990 { "uvec4", QShaderDescription::Uint4 },
991
992 { "bool", QShaderDescription::Bool },
993 { "bvec2", QShaderDescription::Bool2 },
994 { "bvec3", QShaderDescription::Bool3 },
995 { "bvec4", QShaderDescription::Bool4 },
996
997 { "double", QShaderDescription::Double },
998 { "dvec2", QShaderDescription::Double2 },
999 { "dvec3", QShaderDescription::Double3 },
1000 { "dvec4", QShaderDescription::Double4 },
1001 { "dmat2", QShaderDescription::DMat2 },
1002 { "dmat3", QShaderDescription::DMat3 },
1003 { "dmat4", QShaderDescription::DMat4 },
1004 { "dmat2x3", QShaderDescription::DMat2x3 },
1005 { "dmat2x4", QShaderDescription::DMat2x4 },
1006 { "dmat3x2", QShaderDescription::DMat3x2 },
1007 { "dmat3x4", QShaderDescription::DMat3x4 },
1008 { "dmat4x2", QShaderDescription::DMat4x2 },
1009 { "dmat4x3", QShaderDescription::DMat4x3 },
1010
1011 { "image1D", QShaderDescription::Image1D },
1012 { "image2D", QShaderDescription::Image2D },
1013 { "image2DMS", QShaderDescription::Image2DMS },
1014 { "image3D", QShaderDescription::Image3D },
1015 { "imageCube", QShaderDescription::ImageCube },
1016 { "image1DArray", QShaderDescription::Image1DArray },
1017 { "image2DArray", QShaderDescription::Image2DArray },
1018 { "image2DMSArray", QShaderDescription::Image2DMSArray },
1019 { "image3DArray", QShaderDescription::Image3DArray },
1020 { "imageCubeArray", QShaderDescription::ImageCubeArray },
1021 { "imageRect", QShaderDescription::ImageRect },
1022 { "imageBuffer", QShaderDescription::ImageBuffer },
1023
1024 { "half", QShaderDescription::Half },
1025 { "half2", QShaderDescription::Half2 },
1026 { "half3", QShaderDescription::Half3 },
1028
1030{
1031 for (size_t i = 0; i < sizeof(typeTab) / sizeof(TypeTab); ++i) {
1032 if (typeTab[i].v == t)
1033 return QLatin1StringView(typeTab[i].k);
1034 }
1035 return {};
1036}
1037
1038static const struct ImageFormatTab {
1039 const char k[15];
1041} imageFormatTab[] {
1083
1085{
1086 for (size_t i = 0; i < sizeof(imageFormatTab) / sizeof(ImageFormatTab); ++i) {
1087 if (imageFormatTab[i].v == f)
1088 return QLatin1StringView(imageFormatTab[i].k);
1089 }
1090 return {};
1091}
1092
1093static const struct BuiltinTypeTab {
1094 const char k[21];
1096} builtinTypeTab[] = {
1098 { "PointSize", QShaderDescription::PointSizeBuiltin },
1099 { "ClipDistance", QShaderDescription::ClipDistanceBuiltin },
1100 { "CullDistance", QShaderDescription::CullDistanceBuiltin },
1102 { "InstanceId", QShaderDescription::InstanceIdBuiltin },
1103 { "PrimitiveId", QShaderDescription::PrimitiveIdBuiltin },
1104 { "InvocationId", QShaderDescription::InvocationIdBuiltin },
1106 { "ViewportIndex", QShaderDescription::ViewportIndexBuiltin },
1107 { "TessLevelOuter", QShaderDescription::TessLevelOuterBuiltin },
1108 { "TessLevelInner", QShaderDescription::TessLevelInnerBuiltin },
1109 { "TessCoord", QShaderDescription::TessCoordBuiltin },
1110 { "PatchVertices", QShaderDescription::PatchVerticesBuiltin },
1111 { "FragCoord", QShaderDescription::FragCoordBuiltin },
1112 { "PointCoord", QShaderDescription::PointCoordBuiltin },
1113 { "FrontFacing", QShaderDescription::FrontFacingBuiltin },
1115 { "SamplePosition", QShaderDescription::SamplePositionBuiltin },
1116 { "SampleMask", QShaderDescription::SampleMaskBuiltin },
1117 { "FragDepth", QShaderDescription::FragDepthBuiltin },
1118 { "NumWorkGroups", QShaderDescription::NumWorkGroupsBuiltin },
1119 { "WorkgroupSize", QShaderDescription::WorkgroupSizeBuiltin },
1120 { "WorkgroupId", QShaderDescription::WorkgroupIdBuiltin },
1121 { "LocalInvocationId", QShaderDescription::LocalInvocationIdBuiltin },
1122 { "GlobalInvocationId", QShaderDescription::GlobalInvocationIdBuiltin },
1123 { "LocalInvocationIndex", QShaderDescription::LocalInvocationIndexBuiltin },
1124 { "VertexIndex", QShaderDescription::VertexIndexBuiltin },
1125 { "InstanceIndex", QShaderDescription::InstanceIndexBuiltin }
1127
1129{
1130 for (size_t i = 0; i < sizeof(builtinTypeTab) / sizeof(BuiltinTypeTab); ++i) {
1131 if (builtinTypeTab[i].v == t)
1133 }
1134 return {};
1135}
1136
1137static const struct TessellationModeTab {
1138 const char k[10];
1140} tessellationModeTab[] {
1146
1148{
1149 for (size_t i = 0; i < sizeof(tessellationModeTab) / sizeof(TessellationModeTab); ++i) {
1150 if (tessellationModeTab[i].v == mode)
1151 return QLatin1StringView(tessellationModeTab[i].k);
1152 }
1153 return {};
1154}
1155
1156static const struct TessellationWindingOrderTab {
1157 const char k[8];
1159} tessellationWindingOrderTab[] {
1164
1166{
1167 for (size_t i = 0; i < sizeof(tessellationWindingOrderTab) / sizeof(TessellationWindingOrderTab); ++i) {
1168 if (tessellationWindingOrderTab[i].v == w)
1169 return QLatin1StringView(tessellationWindingOrderTab[i].k);
1170 }
1171 return {};
1172}
1173
1174static const struct TessellationPartitioningTab {
1175 const char k[24];
1177} tessellationPartitioningTab[] {
1183
1185{
1186 for (size_t i = 0; i < sizeof(tessellationPartitioningTab) / sizeof(TessellationPartitioningTab); ++i) {
1187 if (tessellationPartitioningTab[i].v == p)
1188 return QLatin1StringView(tessellationPartitioningTab[i].k);
1189 }
1190 return {};
1191}
1192
1193#ifndef QT_NO_DEBUG_STREAM
1195{
1196 const QShaderDescriptionPrivate *d = sd.d;
1197 QDebugStateSaver saver(dbg);
1198
1199 if (sd.isValid()) {
1200 dbg.nospace() << "QShaderDescription("
1201 << "inVars " << d->inVars
1202 << " outVars " << d->outVars
1203 << " uniformBlocks " << d->uniformBlocks
1204 << " pcBlocks " << d->pushConstantBlocks
1205 << " storageBlocks " << d->storageBlocks
1206 << " combinedSamplers " << d->combinedImageSamplers
1207 << " storageImages " << d->storageImages
1208 << " separateImages " << d->separateImages
1209 << " separateSamplers " << d->separateSamplers
1210 << " inBuiltins " << d->inBuiltins
1211 << " outBuiltins " << d->outBuiltins
1212 << ')';
1213 } else {
1214 dbg.nospace() << "QShaderDescription(null)";
1215 }
1216
1217 return dbg;
1218}
1219
1221{
1222 QDebugStateSaver saver(dbg);
1223 dbg.nospace() << "InOutVariable(" << typeStr(var.type) << ' ' << var.name;
1224 if (var.perPatch)
1225 dbg.nospace() << " per-patch";
1226 if (var.location >= 0)
1227 dbg.nospace() << " location=" << var.location;
1228 if (var.binding >= 0)
1229 dbg.nospace() << " binding=" << var.binding;
1230 if (var.descriptorSet >= 0)
1231 dbg.nospace() << " set=" << var.descriptorSet;
1233 dbg.nospace() << " imageFormat=" << imageFormatStr(var.imageFormat);
1234 if (var.imageFlags)
1235 dbg.nospace() << " imageFlags=" << var.imageFlags;
1236 if (!var.arrayDims.isEmpty())
1237 dbg.nospace() << " array=" << var.arrayDims;
1238 if (!var.structMembers.isEmpty())
1239 dbg.nospace() << " structMembers=" << var.structMembers;
1240 dbg.nospace() << ')';
1241 return dbg;
1242}
1243
1245{
1246 QDebugStateSaver saver(dbg);
1247 dbg.nospace() << "BlockVariable(" << typeStr(var.type) << ' ' << var.name;
1248 if (var.offset != -1)
1249 dbg.nospace() << " offset=" << var.offset;
1250 dbg.nospace() << " size=" << var.size;
1251 if (!var.arrayDims.isEmpty())
1252 dbg.nospace() << " array=" << var.arrayDims;
1253 if (var.arrayStride)
1254 dbg.nospace() << " arrayStride=" << var.arrayStride;
1255 if (var.matrixStride)
1256 dbg.nospace() << " matrixStride=" << var.matrixStride;
1257 if (var.matrixIsRowMajor)
1258 dbg.nospace() << " [rowmaj]";
1259 if (!var.structMembers.isEmpty())
1260 dbg.nospace() << " structMembers=" << var.structMembers;
1261 dbg.nospace() << ')';
1262 return dbg;
1263}
1264
1266{
1267 QDebugStateSaver saver(dbg);
1268 dbg.nospace() << "UniformBlock(" << blk.blockName << ' ' << blk.structName
1269 << " size=" << blk.size;
1270 if (blk.binding >= 0)
1271 dbg.nospace() << " binding=" << blk.binding;
1272 if (blk.descriptorSet >= 0)
1273 dbg.nospace() << " set=" << blk.descriptorSet;
1274 dbg.nospace() << ' ' << blk.members << ')';
1275 return dbg;
1276}
1277
1279{
1280 QDebugStateSaver saver(dbg);
1281 dbg.nospace() << "PushConstantBlock(" << blk.name << " size=" << blk.size << ' ' << blk.members
1282 << ')';
1283 return dbg;
1284}
1285
1287{
1288 QDebugStateSaver saver(dbg);
1289 dbg.nospace() << "StorageBlock(" << blk.blockName << ' ' << blk.instanceName
1290 << " knownSize=" << blk.knownSize;
1291 if (blk.binding >= 0)
1292 dbg.nospace() << " binding=" << blk.binding;
1293 if (blk.descriptorSet >= 0)
1294 dbg.nospace() << " set=" << blk.descriptorSet;
1295 if (blk.runtimeArrayStride)
1296 dbg.nospace() << " runtimeArrayStride=" << blk.runtimeArrayStride;
1297 if (blk.qualifierFlags)
1298 dbg.nospace() << " qualifierFlags=" << blk.qualifierFlags;
1299 dbg.nospace() << ' ' << blk.members << ')';
1300 return dbg;
1301}
1302
1304{
1305 QDebugStateSaver saver(dbg);
1306 dbg.nospace() << "BuiltinVariable(type=" << builtinTypeStr(builtin.type);
1307 dbg.nospace() << " varType=" << typeStr(builtin.varType);
1308 if (!builtin.arrayDims.isEmpty())
1309 dbg.nospace() << " array=" << builtin.arrayDims;
1310 dbg.nospace() << ")";
1311 return dbg;
1312}
1313#endif
1314
1315#define JSON_KEY(key) static constexpr QLatin1StringView key ## Key() noexcept { return QLatin1StringView( #key ); }
1319JSON_KEY(binding)
1321JSON_KEY(perPatch)
1322JSON_KEY(imageFormat)
1323JSON_KEY(imageFlags)
1325JSON_KEY(arrayDims)
1326JSON_KEY(arrayStride)
1327JSON_KEY(matrixStride)
1328JSON_KEY(matrixRowMajor)
1329JSON_KEY(structMembers)
1331JSON_KEY(inputs)
1332JSON_KEY(outputs)
1333JSON_KEY(uniformBlocks)
1334JSON_KEY(blockName)
1335JSON_KEY(structName)
1336JSON_KEY(instanceName)
1338JSON_KEY(knownSize)
1339JSON_KEY(pushConstantBlocks)
1340JSON_KEY(storageBlocks)
1341JSON_KEY(combinedImageSamplers)
1342JSON_KEY(storageImages)
1343JSON_KEY(inBuiltins)
1344JSON_KEY(outBuiltins)
1345JSON_KEY(computeLocalSize)
1346JSON_KEY(tessellationOutputVertexCount)
1347JSON_KEY(tessellationMode)
1348JSON_KEY(tessellationWindingOrder)
1349JSON_KEY(tessellationPartitioning)
1350JSON_KEY(separateImages)
1351JSON_KEY(separateSamplers)
1352JSON_KEY(runtimeArrayStride)
1353JSON_KEY(qualifierFlags)
1354#undef JSON_KEY
1355
1357{
1358 if (v.location >= 0)
1359 (*obj)[locationKey()] = v.location;
1360 if (v.binding >= 0)
1361 (*obj)[bindingKey()] = v.binding;
1362 if (v.descriptorSet >= 0)
1363 (*obj)[setKey()] = v.descriptorSet;
1364 if (v.perPatch)
1365 (*obj)[perPatchKey()] = v.perPatch;
1366 if (v.imageFormat != QShaderDescription::ImageFormatUnknown)
1367 (*obj)[imageFormatKey()] = imageFormatStr(v.imageFormat);
1368 if (v.imageFlags)
1369 (*obj)[imageFlagsKey()] = int(v.imageFlags);
1370 if (!v.arrayDims.isEmpty()) {
1371 QJsonArray dimArr;
1372 for (int dim : v.arrayDims)
1373 dimArr.append(dim);
1374 (*obj)[arrayDimsKey()] = dimArr;
1375 }
1376}
1377
1379{
1380 (*stream) << v.location;
1381 (*stream) << v.binding;
1382 (*stream) << v.descriptorSet;
1383 (*stream) << int(v.imageFormat);
1384 (*stream) << int(v.imageFlags);
1385 (*stream) << int(v.arrayDims.size());
1386 for (int dim : v.arrayDims)
1387 (*stream) << dim;
1389 (*stream) << quint8(v.perPatch);
1390}
1391
1393{
1394 (*stream) << int(v.type);
1396 (*stream) << int(v.varType);
1397 (*stream) << int(v.arrayDims.size());
1398 for (int dim : v.arrayDims)
1399 (*stream) << dim;
1400 }
1401}
1402
1404{
1406 obj[nameKey()] = QString::fromUtf8(v.name);
1407 obj[typeKey()] = typeStr(v.type);
1408 if (v.offset != -1)
1409 obj[offsetKey()] = v.offset;
1410 obj[sizeKey()] = v.size;
1411 if (!v.arrayDims.isEmpty()) {
1412 QJsonArray dimArr;
1413 for (int dim : v.arrayDims)
1414 dimArr.append(dim);
1415 obj[arrayDimsKey()] = dimArr;
1416 }
1417 if (v.arrayStride)
1418 obj[arrayStrideKey()] = v.arrayStride;
1419 if (v.matrixStride)
1420 obj[matrixStrideKey()] = v.matrixStride;
1421 if (v.matrixIsRowMajor)
1422 obj[matrixRowMajorKey()] = true;
1423 if (!v.structMembers.isEmpty()) {
1424 QJsonArray arr;
1425 for (const QShaderDescription::BlockVariable &sv : v.structMembers)
1426 arr.append(blockMemberObject(sv));
1427 obj[structMembersKey()] = arr;
1428 }
1429 return obj;
1430}
1431
1433{
1435 obj[nameKey()] = QString::fromUtf8(v.name);
1436 obj[typeKey()] = typeStr(v.type);
1437 addDeco(&obj, v);
1438 if (!v.structMembers.isEmpty()) {
1439 QJsonArray arr;
1440 for (const QShaderDescription::BlockVariable &sv : v.structMembers)
1441 arr.append(blockMemberObject(sv));
1442 obj[structMembersKey()] = arr;
1443 }
1444 return obj;
1445}
1446
1448{
1450
1451 obj[nameKey()] = builtinTypeStr(v.type);
1452 obj[typeKey()] = typeStr(v.varType);
1453 if (!v.arrayDims.isEmpty()) {
1454 QJsonArray dimArr;
1455 for (int dim : v.arrayDims)
1456 dimArr.append(dim);
1457 obj[arrayDimsKey()] = dimArr;
1458 }
1459 return obj;
1460}
1461
1463{
1464 (*stream) << QString::fromUtf8(v.name);
1465 (*stream) << int(v.type);
1466 (*stream) << v.offset;
1467 (*stream) << v.size;
1468 (*stream) << int(v.arrayDims.size());
1469 for (int dim : v.arrayDims)
1470 (*stream) << dim;
1471 (*stream) << v.arrayStride;
1472 (*stream) << v.matrixStride;
1473 (*stream) << v.matrixIsRowMajor;
1474 (*stream) << int(v.structMembers.size());
1475 for (const QShaderDescription::BlockVariable &sv : v.structMembers)
1477}
1478
1480 int version)
1481{
1482 (*stream) << QString::fromUtf8(v.name);
1483 (*stream) << int(v.type);
1484 serializeDecorations(stream, v, version);
1486 (*stream) << int(v.structMembers.size());
1487 for (const QShaderDescription::BlockVariable &sv : v.structMembers)
1489 }
1490}
1491
1493{
1494 QJsonObject root;
1495
1496 QJsonArray jinputs;
1497 for (const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1498 jinputs.append(inOutObject(v));
1499 if (!jinputs.isEmpty())
1500 root[inputsKey()] = jinputs;
1501
1502 QJsonArray joutputs;
1503 for (const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1504 joutputs.append(inOutObject(v));
1505 if (!joutputs.isEmpty())
1506 root[outputsKey()] = joutputs;
1507
1508 QJsonArray juniformBlocks;
1510 QJsonObject juniformBlock;
1511 juniformBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1512 juniformBlock[structNameKey()] = QString::fromUtf8(b.structName);
1513 juniformBlock[sizeKey()] = b.size;
1514 if (b.binding >= 0)
1515 juniformBlock[bindingKey()] = b.binding;
1516 if (b.descriptorSet >= 0)
1517 juniformBlock[setKey()] = b.descriptorSet;
1519 for (const QShaderDescription::BlockVariable &v : b.members)
1521 juniformBlock[membersKey()] = members;
1522 juniformBlocks.append(juniformBlock);
1523 }
1524 if (!juniformBlocks.isEmpty())
1525 root[uniformBlocksKey()] = juniformBlocks;
1526
1527 QJsonArray jpushConstantBlocks;
1529 QJsonObject jpushConstantBlock;
1530 jpushConstantBlock[nameKey()] = QString::fromUtf8(b.name);
1531 jpushConstantBlock[sizeKey()] = b.size;
1533 for (const QShaderDescription::BlockVariable &v : b.members)
1535 jpushConstantBlock[membersKey()] = members;
1536 jpushConstantBlocks.append(jpushConstantBlock);
1537 }
1538 if (!jpushConstantBlocks.isEmpty())
1539 root[pushConstantBlocksKey()] = jpushConstantBlocks;
1540
1541 QJsonArray jstorageBlocks;
1543 QJsonObject jstorageBlock;
1544 jstorageBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1545 jstorageBlock[instanceNameKey()] = QString::fromUtf8(b.instanceName);
1546 jstorageBlock[knownSizeKey()] = b.knownSize;
1547 if (b.binding >= 0)
1548 jstorageBlock[bindingKey()] = b.binding;
1549 if (b.descriptorSet >= 0)
1550 jstorageBlock[setKey()] = b.descriptorSet;
1551 if (b.runtimeArrayStride)
1552 jstorageBlock[runtimeArrayStrideKey()] = b.runtimeArrayStride;
1553 if (b.qualifierFlags)
1554 jstorageBlock[qualifierFlagsKey()] = int(b.qualifierFlags);
1556 for (const QShaderDescription::BlockVariable &v : b.members)
1558 jstorageBlock[membersKey()] = members;
1559 jstorageBlocks.append(jstorageBlock);
1560 }
1561 if (!jstorageBlocks.isEmpty())
1562 root[storageBlocksKey()] = jstorageBlocks;
1563
1564 QJsonArray jcombinedSamplers;
1565 for (const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1567 sampler[nameKey()] = QString::fromUtf8(v.name);
1568 sampler[typeKey()] = typeStr(v.type);
1569 addDeco(&sampler, v);
1570 jcombinedSamplers.append(sampler);
1571 }
1572 if (!jcombinedSamplers.isEmpty())
1573 root[combinedImageSamplersKey()] = jcombinedSamplers;
1574
1575 QJsonArray jstorageImages;
1576 for (const QShaderDescription::InOutVariable &v : std::as_const(storageImages)) {
1578 image[nameKey()] = QString::fromUtf8(v.name);
1579 image[typeKey()] = typeStr(v.type);
1580 addDeco(&image, v);
1581 jstorageImages.append(image);
1582 }
1583 if (!jstorageImages.isEmpty())
1584 root[storageImagesKey()] = jstorageImages;
1585
1586 QJsonArray jinBuiltins;
1587 for (const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1588 jinBuiltins.append(builtinObject(v));
1589 if (!jinBuiltins.isEmpty())
1590 root[inBuiltinsKey()] = jinBuiltins;
1591
1592 QJsonArray joutBuiltins;
1593 for (const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1594 joutBuiltins.append(builtinObject(v));
1595 if (!joutBuiltins.isEmpty())
1596 root[outBuiltinsKey()] = joutBuiltins;
1597
1598 if (localSize[0] || localSize[1] || localSize[2]) {
1599 QJsonArray jlocalSize;
1600 for (size_t i = 0; i < 3; ++i)
1601 jlocalSize.append(QJsonValue(int(localSize[i])));
1602 root[computeLocalSizeKey()] = jlocalSize;
1603 }
1604
1605 if (tessOutVertCount)
1606 root[tessellationOutputVertexCountKey()] = int(tessOutVertCount);
1607
1609 root[tessellationModeKey()] = tessModeStr(tessMode);
1610
1612 root[tessellationWindingOrderKey()] = tessWindStr(tessWind);
1613
1615 root[tessellationPartitioningKey()] = tessPartStr(tessPart);
1616
1617 QJsonArray jseparateImages;
1618 for (const QShaderDescription::InOutVariable &v : std::as_const(separateImages)) {
1620 image[nameKey()] = QString::fromUtf8(v.name);
1621 image[typeKey()] = typeStr(v.type);
1622 addDeco(&image, v);
1623 jseparateImages.append(image);
1624 }
1625 if (!jseparateImages.isEmpty())
1626 root[separateImagesKey()] = jseparateImages;
1627
1628 QJsonArray jseparateSamplers;
1629 for (const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1631 sampler[nameKey()] = QString::fromUtf8(v.name);
1632 sampler[typeKey()] = typeStr(v.type);
1633 addDeco(&sampler, v);
1634 jseparateSamplers.append(sampler);
1635 }
1636 if (!jseparateSamplers.isEmpty())
1637 root[separateSamplersKey()] = jseparateSamplers;
1638
1639 return QJsonDocument(root);
1640}
1641
1643{
1644 (*stream) << int(inVars.size());
1645 for (const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1646 serializeInOutVar(stream, v, version);
1647
1648 (*stream) << int(outVars.size());
1649 for (const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1650 serializeInOutVar(stream, v, version);
1651
1652 (*stream) << int(uniformBlocks.size());
1654 (*stream) << QString::fromUtf8(b.blockName);
1655 (*stream) << QString::fromUtf8(b.structName);
1656 (*stream) << b.size;
1657 (*stream) << b.binding;
1658 (*stream) << b.descriptorSet;
1659 (*stream) << int(b.members.size());
1660 for (const QShaderDescription::BlockVariable &v : b.members)
1662 }
1663
1664 (*stream) << int(pushConstantBlocks.size());
1666 (*stream) << QString::fromUtf8(b.name);
1667 (*stream) << b.size;
1668 (*stream) << int(b.members.size());
1669 for (const QShaderDescription::BlockVariable &v : b.members)
1671 }
1672
1673 (*stream) << int(storageBlocks.size());
1675 (*stream) << QString::fromUtf8(b.blockName);
1676 (*stream) << QString::fromUtf8(b.instanceName);
1677 (*stream) << b.knownSize;
1678 (*stream) << b.binding;
1679 (*stream) << b.descriptorSet;
1680 (*stream) << int(b.members.size());
1681 for (const QShaderDescription::BlockVariable &v : b.members)
1684 (*stream) << b.runtimeArrayStride;
1685 (*stream) << b.qualifierFlags;
1686 }
1687 }
1688
1689 (*stream) << int(combinedImageSamplers.size());
1690 for (const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1691 (*stream) << QString::fromUtf8(v.name);
1692 (*stream) << int(v.type);
1693 serializeDecorations(stream, v, version);
1694 }
1695
1696 (*stream) << int(storageImages.size());
1697 for (const QShaderDescription::InOutVariable &v : std::as_const(storageImages)) {
1698 (*stream) << QString::fromUtf8(v.name);
1699 (*stream) << int(v.type);
1700 serializeDecorations(stream, v, version);
1701 }
1702
1703 for (size_t i = 0; i < 3; ++i)
1704 (*stream) << quint32(localSize[i]);
1705
1706 (*stream) << int(separateImages.size());
1707 for (const QShaderDescription::InOutVariable &v : std::as_const(separateImages)) {
1708 (*stream) << QString::fromUtf8(v.name);
1709 (*stream) << int(v.type);
1710 serializeDecorations(stream, v, version);
1711 }
1712
1713 (*stream) << int(separateSamplers.size());
1714 for (const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1715 (*stream) << QString::fromUtf8(v.name);
1716 (*stream) << int(v.type);
1717 serializeDecorations(stream, v, version);
1718 }
1719
1721 (*stream) << quint32(tessOutVertCount);
1722 (*stream) << quint32(tessMode);
1723 (*stream) << quint32(tessWind);
1724 (*stream) << quint32(tessPart);
1725
1726 (*stream) << int(inBuiltins.size());
1727 for (const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1728 serializeBuiltinVar(stream, v, version);
1729
1730 (*stream) << int(outBuiltins.size());
1731 for (const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1732 serializeBuiltinVar(stream, v, version);
1733 }
1734}
1735
1737{
1738 (*stream) >> v->location;
1739 (*stream) >> v->binding;
1740 (*stream) >> v->descriptorSet;
1741 int f;
1742 (*stream) >> f;
1743 v->imageFormat = QShaderDescription::ImageFormat(f);
1744 (*stream) >> f;
1745 v->imageFlags = QShaderDescription::ImageFlags(f);
1746
1748 (*stream) >> f;
1749 v->arrayDims.resize(f);
1750 for (int i = 0; i < f; ++i)
1751 (*stream) >> v->arrayDims[i];
1752 }
1753
1755 quint8 b;
1756 (*stream) >> b;
1757 v->perPatch = b;
1758 }
1759}
1760
1762{
1764 int t;
1765 (*stream) >> t;
1768 (*stream) >> t;
1770 int count;
1771 (*stream) >> count;
1772 var.arrayDims.resize(count);
1773 for (int i = 0; i < count; ++i)
1774 (*stream) >> var.arrayDims[i];
1775 }
1776 return var;
1777}
1778
1780{
1782 QString tmp;
1783 (*stream) >> tmp;
1784 var.name = tmp.toUtf8();
1785 int t;
1786 (*stream) >> t;
1788 (*stream) >> var.offset;
1789 (*stream) >> var.size;
1790 int count;
1791 (*stream) >> count;
1792 var.arrayDims.resize(count);
1793 for (int i = 0; i < count; ++i)
1794 (*stream) >> var.arrayDims[i];
1795 (*stream) >> var.arrayStride;
1796 (*stream) >> var.matrixStride;
1797 (*stream) >> var.matrixIsRowMajor;
1798 (*stream) >> count;
1799 var.structMembers.resize(count);
1800 for (int i = 0; i < count; ++i)
1801 var.structMembers[i] = deserializeBlockMemberVar(stream, version);
1802 return var;
1803}
1804
1806{
1808 QString tmp;
1809 (*stream) >> tmp;
1810 var.name = tmp.toUtf8();
1811 int t;
1812 (*stream) >> t;
1814 deserializeDecorations(stream, version, &var);
1816 int count;
1817 (*stream) >> count;
1818 var.structMembers.resize(count);
1819 for (int i = 0; i < count; ++i)
1820 var.structMembers[i] = deserializeBlockMemberVar(stream, version);
1821 }
1822 return var;
1823}
1824
1826{
1827 Q_ASSERT(ref.loadRelaxed() == 1); // must be detached
1828
1829 int count;
1830 (*stream) >> count;
1832 for (int i = 0; i < count; ++i)
1833 inVars[i] = deserializeInOutVar(stream, version);
1834
1835 (*stream) >> count;
1837 for (int i = 0; i < count; ++i)
1838 outVars[i] = deserializeInOutVar(stream, version);
1839
1840 (*stream) >> count;
1842 for (int i = 0; i < count; ++i) {
1843 QString tmp;
1844 (*stream) >> tmp;
1845 uniformBlocks[i].blockName = tmp.toUtf8();
1846 (*stream) >> tmp;
1847 uniformBlocks[i].structName = tmp.toUtf8();
1848 (*stream) >> uniformBlocks[i].size;
1849 (*stream) >> uniformBlocks[i].binding;
1850 (*stream) >> uniformBlocks[i].descriptorSet;
1851 int memberCount;
1852 (*stream) >> memberCount;
1853 uniformBlocks[i].members.resize(memberCount);
1854 for (int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1855 uniformBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1856 }
1857
1858 (*stream) >> count;
1860 for (int i = 0; i < count; ++i) {
1861 QString tmp;
1862 (*stream) >> tmp;
1863 pushConstantBlocks[i].name = tmp.toUtf8();
1864 (*stream) >> pushConstantBlocks[i].size;
1865 int memberCount;
1866 (*stream) >> memberCount;
1867 pushConstantBlocks[i].members.resize(memberCount);
1868 for (int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1870 }
1871
1872 (*stream) >> count;
1874 for (int i = 0; i < count; ++i) {
1875 QString tmp;
1876 (*stream) >> tmp;
1877 storageBlocks[i].blockName = tmp.toUtf8();
1878 (*stream) >> tmp;
1879 storageBlocks[i].instanceName = tmp.toUtf8();
1880 (*stream) >> storageBlocks[i].knownSize;
1881 (*stream) >> storageBlocks[i].binding;
1882 (*stream) >> storageBlocks[i].descriptorSet;
1883 int memberCount;
1884 (*stream) >> memberCount;
1885 storageBlocks[i].members.resize(memberCount);
1886 for (int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1887 storageBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1888
1890 (*stream) >> storageBlocks[i].runtimeArrayStride;
1891 (*stream) >> storageBlocks[i].qualifierFlags;
1892 }
1893 }
1894
1895 (*stream) >> count;
1897 for (int i = 0; i < count; ++i) {
1898 QString tmp;
1899 (*stream) >> tmp;
1900 combinedImageSamplers[i].name = tmp.toUtf8();
1901 int t;
1902 (*stream) >> t;
1905 }
1906
1907 (*stream) >> count;
1909 for (int i = 0; i < count; ++i) {
1910 QString tmp;
1911 (*stream) >> tmp;
1912 storageImages[i].name = tmp.toUtf8();
1913 int t;
1914 (*stream) >> t;
1917 }
1918
1919 for (size_t i = 0; i < 3; ++i) {
1920 quint32 v;
1921 (*stream) >> v;
1922 localSize[i] = v;
1923 }
1924
1926 (*stream) >> count;
1928 for (int i = 0; i < count; ++i) {
1929 QString tmp;
1930 (*stream) >> tmp;
1931 separateImages[i].name = tmp.toUtf8();
1932 int t;
1933 (*stream) >> t;
1936 }
1937
1938 (*stream) >> count;
1940 for (int i = 0; i < count; ++i) {
1941 QString tmp;
1942 (*stream) >> tmp;
1943 separateSamplers[i].name = tmp.toUtf8();
1944 int t;
1945 (*stream) >> t;
1948 }
1949 }
1950
1952 quint32 v;
1953 (*stream) >> v;
1955 (*stream) >> v;
1957 (*stream) >> v;
1959 (*stream) >> v;
1961
1962 (*stream) >> count;
1964 for (int i = 0; i < count; ++i)
1966
1967 (*stream) >> count;
1969 for (int i = 0; i < count; ++i)
1971 }
1972}
1973
1980bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs) noexcept
1981{
1982 if (lhs.d == rhs.d)
1983 return true;
1984
1985 return lhs.d->inVars == rhs.d->inVars
1986 && lhs.d->outVars == rhs.d->outVars
1987 && lhs.d->uniformBlocks == rhs.d->uniformBlocks
1988 && lhs.d->pushConstantBlocks == rhs.d->pushConstantBlocks
1989 && lhs.d->storageBlocks == rhs.d->storageBlocks
1990 && lhs.d->combinedImageSamplers == rhs.d->combinedImageSamplers
1991 && lhs.d->separateImages == rhs.d->separateImages
1992 && lhs.d->separateSamplers == rhs.d->separateSamplers
1993 && lhs.d->storageImages == rhs.d->storageImages
1994 && lhs.d->inBuiltins == rhs.d->inBuiltins
1995 && lhs.d->outBuiltins == rhs.d->outBuiltins
1996 && lhs.d->localSize == rhs.d->localSize
1997 && lhs.d->tessOutVertCount == rhs.d->tessOutVertCount
1998 && lhs.d->tessMode == rhs.d->tessMode
1999 && lhs.d->tessWind == rhs.d->tessWind
2000 && lhs.d->tessPart == rhs.d->tessPart;
2001}
2002
2010{
2011 return lhs.name == rhs.name
2012 && lhs.type == rhs.type
2013 && lhs.location == rhs.location
2014 && lhs.binding == rhs.binding
2015 && lhs.descriptorSet == rhs.descriptorSet
2016 && lhs.imageFormat == rhs.imageFormat
2017 && lhs.imageFlags == rhs.imageFlags
2018 && lhs.arrayDims == rhs.arrayDims
2019 && lhs.perPatch == rhs.perPatch
2020 && lhs.structMembers == rhs.structMembers;
2021}
2022
2030{
2031 return lhs.name == rhs.name
2032 && lhs.type == rhs.type
2033 && lhs.offset == rhs.offset
2034 && lhs.size == rhs.size
2035 && lhs.arrayDims == rhs.arrayDims
2036 && lhs.arrayStride == rhs.arrayStride
2037 && lhs.matrixStride == rhs.matrixStride
2038 && lhs.matrixIsRowMajor == rhs.matrixIsRowMajor
2039 && lhs.structMembers == rhs.structMembers;
2040}
2041
2049{
2050 return lhs.blockName == rhs.blockName
2051 && lhs.structName == rhs.structName
2052 && lhs.size == rhs.size
2053 && lhs.binding == rhs.binding
2054 && lhs.descriptorSet == rhs.descriptorSet
2055 && lhs.members == rhs.members;
2056}
2057
2065{
2066 return lhs.name == rhs.name
2067 && lhs.size == rhs.size
2068 && lhs.members == rhs.members;
2069}
2070
2078{
2079 return lhs.blockName == rhs.blockName
2080 && lhs.instanceName == rhs.instanceName
2081 && lhs.knownSize == rhs.knownSize
2082 && lhs.binding == rhs.binding
2083 && lhs.descriptorSet == rhs.descriptorSet
2084 && lhs.runtimeArrayStride == rhs.runtimeArrayStride
2085 && lhs.qualifierFlags == rhs.qualifierFlags
2086 && lhs.members == rhs.members;
2087}
2088
2096{
2097 return lhs.type == rhs.type
2098 && lhs.varType == rhs.varType
2099 && lhs.arrayDims == rhs.arrayDims;
2100}
2101
bool ref() noexcept
bool deref() noexcept
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore\reentrant
Definition qdatastream.h:46
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore\reentrant
Definition qjsonarray.h:18
void append(const QJsonValue &value)
Inserts value at the end of the array.
\inmodule QtCore\reentrant
QByteArray toJson(JsonFormat format=Indented) const
\inmodule QtCore\reentrant
Definition qjsonobject.h:20
\inmodule QtCore\reentrant
Definition qjsonvalue.h:25
qsizetype size() const noexcept
Definition qlist.h:397
bool isEmpty() const noexcept
Definition qlist.h:401
void resize(qsizetype size)
Definition qlist.h:403
QList< InOutVariable > separateSamplers() const
QList< InOutVariable > inputVariables() const
void serialize(QDataStream *stream, int version) const
Serializes this QShaderDescription to stream.
TessellationWindingOrder
\value UnknownTessellationWindingOrder \value CwTessellationWindingOrder \value CcwTessellationWindin...
QList< StorageBlock > storageBlocks() const
static QShaderDescription deserialize(QDataStream *stream, int version)
TessellationPartitioning tessellationPartitioning() const
VariableType
Represents the type of a variable or block member.
QList< PushConstantBlock > pushConstantBlocks() const
QList< InOutVariable > storageImages() const
QShaderDescription()
Constructs a new, empty QShaderDescription.
QList< BuiltinVariable > inputBuiltinVariables() const
TessellationMode tessellationMode() const
BuiltinType
\variable QShaderDescription::BuiltinVariable::type
TessellationMode
\value UnknownTessellationMode \value TrianglesTessellationMode \value QuadTessellationMode \value Is...
QList< BuiltinVariable > outputBuiltinVariables() const
TessellationPartitioning
\value UnknownTessellationPartitioning \value EqualTessellationPartitioning \value FractionalEvenTess...
QList< InOutVariable > outputVariables() const
QList< InOutVariable > combinedImageSamplers() const
QByteArray toJson() const
QList< InOutVariable > separateImages() const
QShaderDescription & operator=(const QShaderDescription &other)
Assigns other to this object.
TessellationWindingOrder tessellationWindingOrder() const
QList< UniformBlock > uniformBlocks() const
uint tessellationOutputVertexCount() const
std::array< uint, 3 > computeShaderLocalSize() const
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
QByteArray toUtf8() const &
Definition qstring.h:634
Combined button and popup list for selecting options.
Definition image.cpp:4
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
EGLStreamKHR stream
GLint location
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLenum mode
GLfloat GLfloat GLfloat w
[0]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint sampler
GLenum GLenum GLsizei count
GLfloat GLfloat f
GLenum type
GLenum GLuint GLintptr offset
GLint ref
GLuint name
GLhandleARB obj
[2]
GLdouble GLdouble t
Definition qopenglext.h:243
GLfloat GLfloat p
[1]
Members members(const Members &candidates, QTypeRevision maxMajorVersion, Postprocess &&process)
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
Definition qrandom.cpp:1220
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static QLatin1StringView tessModeStr(QShaderDescription::TessellationMode mode)
static QLatin1StringView tessPartStr(QShaderDescription::TessellationPartitioning p)
static void serializeBlockMemberVar(QDataStream *stream, const QShaderDescription::BlockVariable &v)
static void deserializeDecorations(QDataStream *stream, int version, QShaderDescription::InOutVariable *v)
QDebug operator<<(QDebug dbg, const QShaderDescription &sd)
static QLatin1StringView builtinTypeStr(QShaderDescription::BuiltinType t)
static const struct TypeTab typeTab[]
static QJsonObject inOutObject(const QShaderDescription::InOutVariable &v)
static QShaderDescription::BuiltinVariable deserializeBuiltinVar(QDataStream *stream, int version)
static void serializeBuiltinVar(QDataStream *stream, const QShaderDescription::BuiltinVariable &v, int version)
#define JSON_KEY(key)
static QJsonObject builtinObject(const QShaderDescription::BuiltinVariable &v)
static void serializeInOutVar(QDataStream *stream, const QShaderDescription::InOutVariable &v, int version)
static void serializeDecorations(QDataStream *stream, const QShaderDescription::InOutVariable &v, int version)
static QLatin1StringView imageFormatStr(QShaderDescription::ImageFormat f)
static const struct BuiltinTypeTab builtinTypeTab[]
static QJsonObject blockMemberObject(const QShaderDescription::BlockVariable &v)
static void addDeco(QJsonObject *obj, const QShaderDescription::InOutVariable &v)
static QShaderDescription::InOutVariable deserializeInOutVar(QDataStream *stream, int version)
static QLatin1StringView tessWindStr(QShaderDescription::TessellationWindingOrder w)
static QLatin1StringView typeStr(QShaderDescription::VariableType t)
static QShaderDescription::BlockVariable deserializeBlockMemberVar(QDataStream *stream, int version)
unsigned int quint32
Definition qtypes.h:50
unsigned int uint
Definition qtypes.h:34
unsigned char quint8
Definition qtypes.h:46
QFuture< QSet< QChar > > set
[10]
QSharedPointer< T > other(t)
[5]
setKey(0)
[0]
QShaderDescription::BuiltinType v
QShaderDescription::ImageFormat v
QList< QShaderDescription::InOutVariable > separateImages
QList< QShaderDescription::InOutVariable > inVars
std::array< uint, 3 > localSize
QList< QShaderDescription::StorageBlock > storageBlocks
void loadFromStream(QDataStream *stream, int version)
static QShaderDescriptionPrivate * get(QShaderDescription *desc)
QShaderDescription::TessellationMode tessMode
QList< QShaderDescription::BuiltinVariable > inBuiltins
void writeToStream(QDataStream *stream, int version)
QList< QShaderDescription::InOutVariable > combinedImageSamplers
QList< QShaderDescription::BuiltinVariable > outBuiltins
QList< QShaderDescription::InOutVariable > outVars
QList< QShaderDescription::InOutVariable > storageImages
QShaderDescription::TessellationPartitioning tessPart
QList< QShaderDescription::UniformBlock > uniformBlocks
QList< QShaderDescription::InOutVariable > separateSamplers
QList< QShaderDescription::PushConstantBlock > pushConstantBlocks
QShaderDescription::TessellationWindingOrder tessWind
\variable QShaderDescription::InOutVariable::name
bool operator==(const QShaderDescription::BlockVariable &lhs, const QShaderDescription::BlockVariable &rhs) noexcept
Returns true if the two BlockVariable objects lhs and rhs are equal.
\variable QShaderDescription::StorageBlock::blockName
bool operator==(const QShaderDescription::BuiltinVariable &lhs, const QShaderDescription::BuiltinVariable &rhs) noexcept
Returns true if the two BuiltinVariable objects lhs and rhs are equal.
bool operator==(const QShaderDescription::InOutVariable &lhs, const QShaderDescription::InOutVariable &rhs) noexcept
Returns true if the two InOutVariable objects lhs and rhs are equal.
\variable QShaderDescription::UniformBlock::blockName
bool operator==(const QShaderDescription::PushConstantBlock &lhs, const QShaderDescription::PushConstantBlock &rhs) noexcept
Returns true if the two PushConstantBlock objects lhs and rhs are equal.
\variable QShaderDescription::PushConstantBlock::name
bool operator==(const QShaderDescription::StorageBlock &lhs, const QShaderDescription::StorageBlock &rhs) noexcept
Returns true if the two StorageBlock objects lhs and rhs are equal.
\variable QShaderDescription::BlockVariable::name
bool operator==(const QShaderDescription::UniformBlock &lhs, const QShaderDescription::UniformBlock &rhs) noexcept
Returns true if the two UniformBlock objects lhs and rhs are equal.
static const int QSB_VERSION_WITHOUT_INPUT_OUTPUT_INTERFACE_BLOCKS
Definition qshader_p.h:28
static const int QSB_VERSION_WITHOUT_VAR_ARRAYDIMS
Definition qshader_p.h:32
static const int QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO
Definition qshader_p.h:29
static const int QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO
Definition qshader_p.h:30
static const int QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS
Definition qshader_p.h:31
QShaderDescription::TessellationMode v
QShaderDescription::TessellationPartitioning v
QShaderDescription::TessellationWindingOrder v
QShaderDescription::VariableType v
const char k[20]