324
327
328
331
332
335
336
337
338
339
340
341
342
343
346
347
350
351
354
355
358
359
362
363
366
367
370
371
374
375
378
379
382
383
384
385
386
387
388
389
390
391
392
393
394
395
398
399
402
403
406
407
410
411
414
415
418
419
422
423
424
425
426
427
428
429
430
433
434
437
438
441
442
445
446
447
448
449
450
451
452
453
456
457
460
461
464
465
468
469
472
473
476
477
480
481
484
485
488
489
490
491
492
493
494
495
496
499
500
503
504
507
508
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
546
547
548
549
550
551QShaderDescription::QShaderDescription()
552 : d(
new QShaderDescriptionPrivate)
557
558
559void QShaderDescription::detach()
565
566
567QShaderDescription::QShaderDescription(
const QShaderDescription &other)
574
575
576QShaderDescription &QShaderDescription::operator=(
const QShaderDescription &other)
578 qAtomicAssign(d, other.d);
583
584
585QShaderDescription::~QShaderDescription()
592
593
594
595bool QShaderDescription::isValid()
const
597 return !d->inVars.isEmpty() || !d->outVars.isEmpty()
598 || !d->uniformBlocks.isEmpty() || !d->pushConstantBlocks.isEmpty() || !d->storageBlocks.isEmpty()
599 || !d->combinedImageSamplers.isEmpty() || !d->storageImages.isEmpty()
600 || !d->separateImages.isEmpty() || !d->separateSamplers.isEmpty()
601 || !d->inBuiltins.isEmpty() || !d->outBuiltins.isEmpty();
605
606
607
608
609
610
611QByteArray QShaderDescription::toJson()
const
613 return d->makeDoc().toJson();
617
618
619
620
621
622void QShaderDescription::serialize(QDataStream *stream,
int version)
const
624 d->writeToStream(stream, version);
628
629
630
631
632
633QShaderDescription QShaderDescription::deserialize(QDataStream *stream,
int version)
635 QShaderDescription desc;
636 QShaderDescriptionPrivate::get(&desc)->loadFromStream(stream, version);
641
642
643
644
645QList<QShaderDescription::InOutVariable> QShaderDescription::inputVariables()
const
651
652
653QList<QShaderDescription::InOutVariable> QShaderDescription::outputVariables()
const
659
660
661QList<QShaderDescription::UniformBlock> QShaderDescription::uniformBlocks()
const
663 return d->uniformBlocks;
667
668
669
670
671
672
673QList<QShaderDescription::PushConstantBlock> QShaderDescription::pushConstantBlocks()
const
675 return d->pushConstantBlocks;
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748QList<QShaderDescription::StorageBlock> QShaderDescription::storageBlocks()
const
750 return d->storageBlocks;
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775QList<QShaderDescription::InOutVariable> QShaderDescription::combinedImageSamplers()
const
777 return d->combinedImageSamplers;
780QList<QShaderDescription::InOutVariable> QShaderDescription::separateImages()
const
782 return d->separateImages;
785QList<QShaderDescription::InOutVariable> QShaderDescription::separateSamplers()
const
787 return d->separateSamplers;
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812QList<QShaderDescription::InOutVariable> QShaderDescription::storageImages()
const
814 return d->storageImages;
818
819
820
821
822QVector<QShaderDescription::BuiltinVariable> QShaderDescription::inputBuiltinVariables()
const
824 return d->inBuiltins;
828
829
830
831QVector<QShaderDescription::BuiltinVariable> QShaderDescription::outputBuiltinVariables()
const
833 return d->outBuiltins;
837
838
839
840
841
842
843
844
845
846std::array<uint, 3> QShaderDescription::computeShaderLocalSize()
const
852
853
854
855
856
857
858
859
860
861uint QShaderDescription::tessellationOutputVertexCount()
const
863 return d->tessOutVertCount;
867
868
869
870
871
872
873
876
877
878
879
880
881
882
883
884
885
886
887
888QShaderDescription::TessellationMode QShaderDescription::tessellationMode()
const
894
895
896
897
898
899
902
903
904
905
906
907
908
909
910
911
912
913
914QShaderDescription::TessellationWindingOrder QShaderDescription::tessellationWindingOrder()
const
920
921
922
923
924
925
926
929
930
931
932
933
934
935
936
937
938
939
940
941QShaderDescription::TessellationPartitioning QShaderDescription::tessellationPartitioning()
const
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 },
958 {
"struct", QShaderDescription::Struct },
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 },
975 {
"mat2x3", QShaderDescription::Mat2x3 },
976 {
"mat2x4", QShaderDescription::Mat2x4 },
977 {
"mat3x2", QShaderDescription::Mat3x2 },
978 {
"mat3x4", QShaderDescription::Mat3x4 },
979 {
"mat4x2", QShaderDescription::Mat4x2 },
980 {
"mat4x3", QShaderDescription::Mat4x3 },
982 {
"int", QShaderDescription::Int },
983 {
"ivec2", QShaderDescription::Int2 },
984 {
"ivec3", QShaderDescription::Int3 },
985 {
"ivec4", QShaderDescription::Int4 },
987 {
"uint", QShaderDescription::Uint },
988 {
"uvec2", QShaderDescription::Uint2 },
989 {
"uvec3", QShaderDescription::Uint3 },
990 {
"uvec4", QShaderDescription::Uint4 },
992 {
"bool", QShaderDescription::Bool },
993 {
"bvec2", QShaderDescription::Bool2 },
994 {
"bvec3", QShaderDescription::Bool3 },
995 {
"bvec4", QShaderDescription::Bool4 },
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 },
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 },
1024 {
"half", QShaderDescription::Half },
1025 {
"half2", QShaderDescription::Half2 },
1026 {
"half3", QShaderDescription::Half3 },
1027 {
"half4", QShaderDescription::Half4 } };
1031 for (size_t i = 0; i <
sizeof(typeTab) /
sizeof(TypeTab); ++i) {
1032 if (typeTab[i].v == t)
1033 return QLatin1StringView(typeTab[i].k);
1042 {
"unknown", QShaderDescription::ImageFormatUnknown },
1043 {
"rgba32f", QShaderDescription::ImageFormatRgba32f },
1044 {
"rgba16", QShaderDescription::ImageFormatRgba16f },
1045 {
"r32f", QShaderDescription::ImageFormatR32f },
1046 {
"rgba8", QShaderDescription::ImageFormatRgba8 },
1047 {
"rgba8_snorm", QShaderDescription::ImageFormatRgba8Snorm },
1048 {
"rg32f", QShaderDescription::ImageFormatRg32f },
1049 {
"rg16f", QShaderDescription::ImageFormatRg16f },
1050 {
"r11f_g11f_b10f", QShaderDescription::ImageFormatR11fG11fB10f },
1051 {
"r16f", QShaderDescription::ImageFormatR16f },
1052 {
"rgba16", QShaderDescription::ImageFormatRgba16 },
1053 {
"rgb10_a2", QShaderDescription::ImageFormatRgb10A2 },
1054 {
"rg16", QShaderDescription::ImageFormatRg16 },
1055 {
"rg8", QShaderDescription::ImageFormatRg8 },
1056 {
"r16", QShaderDescription::ImageFormatR16 },
1057 {
"r8", QShaderDescription::ImageFormatR8 },
1058 {
"rgba16_snorm", QShaderDescription::ImageFormatRgba16Snorm },
1059 {
"rg16_snorm", QShaderDescription::ImageFormatRg16Snorm },
1060 {
"rg8_snorm", QShaderDescription::ImageFormatRg8Snorm },
1061 {
"r16_snorm", QShaderDescription::ImageFormatR16Snorm },
1062 {
"r8_snorm", QShaderDescription::ImageFormatR8Snorm },
1063 {
"rgba32i", QShaderDescription::ImageFormatRgba32i },
1064 {
"rgba16i", QShaderDescription::ImageFormatRgba16i },
1065 {
"rgba8i", QShaderDescription::ImageFormatRgba8i },
1066 {
"r32i", QShaderDescription::ImageFormatR32i },
1067 {
"rg32i", QShaderDescription::ImageFormatRg32i },
1068 {
"rg16i", QShaderDescription::ImageFormatRg16i },
1069 {
"rg8i", QShaderDescription::ImageFormatRg8i },
1070 {
"r16i", QShaderDescription::ImageFormatR16i },
1071 {
"r8i", QShaderDescription::ImageFormatR8i },
1072 {
"rgba32ui", QShaderDescription::ImageFormatRgba32ui },
1073 {
"rgba16ui", QShaderDescription::ImageFormatRgba16ui },
1074 {
"rgba8ui", QShaderDescription::ImageFormatRgba8ui },
1075 {
"r32ui", QShaderDescription::ImageFormatR32ui },
1076 {
"rgb10_a2ui", QShaderDescription::ImageFormatRgb10a2ui },
1077 {
"rg32ui", QShaderDescription::ImageFormatRg32ui },
1078 {
"rg16ui", QShaderDescription::ImageFormatRg16ui },
1079 {
"rg8ui", QShaderDescription::ImageFormatRg8ui },
1080 {
"r16ui", QShaderDescription::ImageFormatR16ui },
1081 {
"r8ui", QShaderDescription::ImageFormatR8ui }
1086 for (size_t i = 0; i <
sizeof(imageFormatTab) /
sizeof(ImageFormatTab); ++i) {
1087 if (imageFormatTab[i].v == f)
1088 return QLatin1StringView(imageFormatTab[i].k);
1096} builtinTypeTab[] = {
1097 {
"Position", QShaderDescription::PositionBuiltin },
1098 {
"PointSize", QShaderDescription::PointSizeBuiltin },
1099 {
"ClipDistance", QShaderDescription::ClipDistanceBuiltin },
1100 {
"CullDistance", QShaderDescription::CullDistanceBuiltin },
1101 {
"VertexId", QShaderDescription::VertexIdBuiltin },
1102 {
"InstanceId", QShaderDescription::InstanceIdBuiltin },
1103 {
"PrimitiveId", QShaderDescription::PrimitiveIdBuiltin },
1104 {
"InvocationId", QShaderDescription::InvocationIdBuiltin },
1105 {
"Layer", QShaderDescription::LayerBuiltin },
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 },
1114 {
"SampleId", QShaderDescription::SampleIdBuiltin },
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 }
1130 for (size_t i = 0; i <
sizeof(builtinTypeTab) /
sizeof(BuiltinTypeTab); ++i) {
1131 if (builtinTypeTab[i].v == t)
1132 return QLatin1StringView(builtinTypeTab[i].k);
1140} tessellationModeTab[] {
1141 {
"unknown", QShaderDescription::UnknownTessellationMode },
1142 {
"triangles", QShaderDescription::TrianglesTessellationMode },
1143 {
"quad", QShaderDescription::QuadTessellationMode },
1144 {
"isoline", QShaderDescription::IsolineTessellationMode }
1149 for (size_t i = 0; i <
sizeof(tessellationModeTab) /
sizeof(TessellationModeTab); ++i) {
1150 if (tessellationModeTab[i].v == mode)
1151 return QLatin1StringView(tessellationModeTab[i].k);
1159} tessellationWindingOrderTab[] {
1160 {
"unknown", QShaderDescription::UnknownTessellationWindingOrder },
1161 {
"cw", QShaderDescription::CwTessellationWindingOrder },
1162 {
"ccw", QShaderDescription::CcwTessellationWindingOrder }
1167 for (size_t i = 0; i <
sizeof(tessellationWindingOrderTab) /
sizeof(TessellationWindingOrderTab); ++i) {
1168 if (tessellationWindingOrderTab[i].v == w)
1169 return QLatin1StringView(tessellationWindingOrderTab[i].k);
1177} tessellationPartitioningTab[] {
1178 {
"unknown", QShaderDescription::UnknownTessellationPartitioning },
1179 {
"equal_spacing", QShaderDescription::EqualTessellationPartitioning },
1180 {
"fractional_even_spacing", QShaderDescription::FractionalEvenTessellationPartitioning },
1181 {
"fractional_odd_spacing", QShaderDescription::FractionalOddTessellationPartitioning }
1186 for (size_t i = 0; i <
sizeof(tessellationPartitioningTab) /
sizeof(TessellationPartitioningTab); ++i) {
1187 if (tessellationPartitioningTab[i].v == p)
1188 return QLatin1StringView(tessellationPartitioningTab[i].k);
1193#ifndef QT_NO_DEBUG_STREAM
1196 const QShaderDescriptionPrivate *d = sd.d;
1197 QDebugStateSaver saver(dbg);
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
1214 dbg.nospace() <<
"QShaderDescription(null)";
1492QJsonDocument QShaderDescriptionPrivate::makeDoc()
1497 for (
const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1498 jinputs.append(inOutObject(v));
1499 if (!jinputs.isEmpty())
1500 root[inputsKey()] = jinputs;
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;
1508 QJsonArray juniformBlocks;
1509 for (
const QShaderDescription::UniformBlock &b : uniformBlocks) {
1510 QJsonObject juniformBlock;
1511 juniformBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1512 juniformBlock[structNameKey()] = QString::fromUtf8(b.structName);
1513 juniformBlock[sizeKey()] = b.size;
1515 juniformBlock[bindingKey()] = b.binding;
1516 if (b.descriptorSet >= 0)
1517 juniformBlock[setKey()] = b.descriptorSet;
1519 for (
const QShaderDescription::BlockVariable &v : b.members)
1520 members.append(blockMemberObject(v));
1521 juniformBlock[membersKey()] = members;
1522 juniformBlocks.append(juniformBlock);
1524 if (!juniformBlocks.isEmpty())
1525 root[uniformBlocksKey()] = juniformBlocks;
1527 QJsonArray jpushConstantBlocks;
1528 for (
const QShaderDescription::PushConstantBlock &b : pushConstantBlocks) {
1529 QJsonObject jpushConstantBlock;
1530 jpushConstantBlock[nameKey()] = QString::fromUtf8(b.name);
1531 jpushConstantBlock[sizeKey()] = b.size;
1533 for (
const QShaderDescription::BlockVariable &v : b.members)
1534 members.append(blockMemberObject(v));
1535 jpushConstantBlock[membersKey()] = members;
1536 jpushConstantBlocks.append(jpushConstantBlock);
1538 if (!jpushConstantBlocks.isEmpty())
1539 root[pushConstantBlocksKey()] = jpushConstantBlocks;
1541 QJsonArray jstorageBlocks;
1542 for (
const QShaderDescription::StorageBlock &b : storageBlocks) {
1543 QJsonObject jstorageBlock;
1544 jstorageBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1545 jstorageBlock[instanceNameKey()] = QString::fromUtf8(b.instanceName);
1546 jstorageBlock[knownSizeKey()] = b.knownSize;
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)
1557 members.append(blockMemberObject(v));
1558 jstorageBlock[membersKey()] = members;
1559 jstorageBlocks.append(jstorageBlock);
1561 if (!jstorageBlocks.isEmpty())
1562 root[storageBlocksKey()] = jstorageBlocks;
1564 QJsonArray jcombinedSamplers;
1565 for (
const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1566 QJsonObject sampler;
1567 sampler[nameKey()] = QString::fromUtf8(v.name);
1568 sampler[typeKey()] = typeStr(v.type);
1569 addDeco(&sampler, v);
1570 jcombinedSamplers.append(sampler);
1572 if (!jcombinedSamplers.isEmpty())
1573 root[combinedImageSamplersKey()] = jcombinedSamplers;
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);
1581 jstorageImages.append(image);
1583 if (!jstorageImages.isEmpty())
1584 root[storageImagesKey()] = jstorageImages;
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;
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;
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;
1605 if (tessOutVertCount)
1606 root[tessellationOutputVertexCountKey()] =
int(tessOutVertCount);
1608 if (tessMode != QShaderDescription::UnknownTessellationMode)
1609 root[tessellationModeKey()] = tessModeStr(tessMode);
1611 if (tessWind != QShaderDescription::UnknownTessellationWindingOrder)
1612 root[tessellationWindingOrderKey()] = tessWindStr(tessWind);
1614 if (tessPart != QShaderDescription::UnknownTessellationPartitioning)
1615 root[tessellationPartitioningKey()] = tessPartStr(tessPart);
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);
1623 jseparateImages.append(image);
1625 if (!jseparateImages.isEmpty())
1626 root[separateImagesKey()] = jseparateImages;
1628 QJsonArray jseparateSamplers;
1629 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1630 QJsonObject sampler;
1631 sampler[nameKey()] = QString::fromUtf8(v.name);
1632 sampler[typeKey()] = typeStr(v.type);
1633 addDeco(&sampler, v);
1634 jseparateSamplers.append(sampler);
1636 if (!jseparateSamplers.isEmpty())
1637 root[separateSamplersKey()] = jseparateSamplers;
1639 return QJsonDocument(root);
1642void QShaderDescriptionPrivate::writeToStream(QDataStream *stream,
int version)
1644 (*stream) <<
int(inVars.size());
1645 for (
const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1646 serializeInOutVar(stream, v, version);
1648 (*stream) <<
int(outVars.size());
1649 for (
const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1650 serializeInOutVar(stream, v, version);
1652 (*stream) <<
int(uniformBlocks.size());
1653 for (
const QShaderDescription::UniformBlock &b : uniformBlocks) {
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)
1661 serializeBlockMemberVar(stream, v);
1664 (*stream) <<
int(pushConstantBlocks.size());
1665 for (
const QShaderDescription::PushConstantBlock &b : pushConstantBlocks) {
1666 (*stream) << QString::fromUtf8(b.name);
1667 (*stream) << b.size;
1668 (*stream) <<
int(b.members.size());
1669 for (
const QShaderDescription::BlockVariable &v : b.members)
1670 serializeBlockMemberVar(stream, v);
1673 (*stream) <<
int(storageBlocks.size());
1674 for (
const QShaderDescription::StorageBlock &b : storageBlocks) {
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)
1682 serializeBlockMemberVar(stream, v);
1683 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO) {
1684 (*stream) << b.runtimeArrayStride;
1685 (*stream) << b.qualifierFlags;
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);
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);
1703 for (size_t i = 0; i < 3; ++i)
1704 (*stream) << quint32(localSize[i]);
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);
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);
1720 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
1721 (*stream) << quint32(tessOutVertCount);
1722 (*stream) << quint32(tessMode);
1723 (*stream) << quint32(tessWind);
1724 (*stream) << quint32(tessPart);
1726 (*stream) <<
int(inBuiltins.size());
1727 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1728 serializeBuiltinVar(stream, v, version);
1730 (*stream) <<
int(outBuiltins.size());
1731 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1732 serializeBuiltinVar(stream, v, version);
1825void QShaderDescriptionPrivate::loadFromStream(QDataStream *stream,
int version)
1827 Q_ASSERT(ref.loadRelaxed() == 1);
1831 inVars.resize(count);
1832 for (
int i = 0; i < count; ++i)
1833 inVars[i] = deserializeInOutVar(stream, version);
1836 outVars.resize(count);
1837 for (
int i = 0; i < count; ++i)
1838 outVars[i] = deserializeInOutVar(stream, version);
1841 uniformBlocks.resize(count);
1842 for (
int i = 0; i < count; ++i) {
1845 uniformBlocks[i].blockName = tmp.toUtf8();
1847 uniformBlocks[i].structName = tmp.toUtf8();
1848 (*stream) >> uniformBlocks[i].size;
1849 (*stream) >> uniformBlocks[i].binding;
1850 (*stream) >> uniformBlocks[i].descriptorSet;
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);
1859 pushConstantBlocks.resize(count);
1860 for (
int i = 0; i < count; ++i) {
1863 pushConstantBlocks[i].name = tmp.toUtf8();
1864 (*stream) >> pushConstantBlocks[i].size;
1866 (*stream) >> memberCount;
1867 pushConstantBlocks[i].members.resize(memberCount);
1868 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1869 pushConstantBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1873 storageBlocks.resize(count);
1874 for (
int i = 0; i < count; ++i) {
1877 storageBlocks[i].blockName = tmp.toUtf8();
1879 storageBlocks[i].instanceName = tmp.toUtf8();
1880 (*stream) >> storageBlocks[i].knownSize;
1881 (*stream) >> storageBlocks[i].binding;
1882 (*stream) >> storageBlocks[i].descriptorSet;
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);
1889 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO) {
1890 (*stream) >> storageBlocks[i].runtimeArrayStride;
1891 (*stream) >> storageBlocks[i].qualifierFlags;
1896 combinedImageSamplers.resize(count);
1897 for (
int i = 0; i < count; ++i) {
1900 combinedImageSamplers[i].name = tmp.toUtf8();
1903 combinedImageSamplers[i].type = QShaderDescription::VariableType(t);
1904 deserializeDecorations(stream, version, &combinedImageSamplers[i]);
1908 storageImages.resize(count);
1909 for (
int i = 0; i < count; ++i) {
1912 storageImages[i].name = tmp.toUtf8();
1915 storageImages[i].type = QShaderDescription::VariableType(t);
1916 deserializeDecorations(stream, version, &storageImages[i]);
1919 for (size_t i = 0; i < 3; ++i) {
1925 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS) {
1927 separateImages.resize(count);
1928 for (
int i = 0; i < count; ++i) {
1931 separateImages[i].name = tmp.toUtf8();
1934 separateImages[i].type = QShaderDescription::VariableType(t);
1935 deserializeDecorations(stream, version, &separateImages[i]);
1939 separateSamplers.resize(count);
1940 for (
int i = 0; i < count; ++i) {
1943 separateSamplers[i].name = tmp.toUtf8();
1946 separateSamplers[i].type = QShaderDescription::VariableType(t);
1947 deserializeDecorations(stream, version, &separateSamplers[i]);
1951 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
1954 tessOutVertCount = v;
1956 tessMode = QShaderDescription::TessellationMode(v);
1958 tessWind = QShaderDescription::TessellationWindingOrder(v);
1960 tessPart = QShaderDescription::TessellationPartitioning(v);
1963 inBuiltins.resize(count);
1964 for (
int i = 0; i < count; ++i)
1965 inBuiltins[i] = deserializeBuiltinVar(stream, version);
1968 outBuiltins.resize(count);
1969 for (
int i = 0; i < count; ++i)
1970 outBuiltins[i] = deserializeBuiltinVar(stream, version);