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
544
547
548
549
550
551
552QShaderDescription::QShaderDescription()
553 : d(
new QShaderDescriptionPrivate)
558
559
560void QShaderDescription::detach()
566
567
568QShaderDescription::QShaderDescription(
const QShaderDescription &other)
575
576
577QShaderDescription &QShaderDescription::operator=(
const QShaderDescription &other)
579 qAtomicAssign(d, other.d);
584
585
586QShaderDescription::~QShaderDescription()
593
594
595
596bool QShaderDescription::isValid()
const
598 return !d->inVars.isEmpty() || !d->outVars.isEmpty()
599 || !d->uniformBlocks.isEmpty() || !d->pushConstantBlocks.isEmpty() || !d->storageBlocks.isEmpty()
600 || !d->combinedImageSamplers.isEmpty() || !d->storageImages.isEmpty()
601 || !d->separateImages.isEmpty() || !d->separateSamplers.isEmpty()
602 || !d->inBuiltins.isEmpty() || !d->outBuiltins.isEmpty();
606
607
608
609
610
611
612QByteArray QShaderDescription::toJson()
const
614 return d->makeDoc().toJson();
618
619
620
621
622
623void QShaderDescription::serialize(QDataStream *stream,
int version)
const
625 d->writeToStream(stream, version);
629
630
631
632
633
634QShaderDescription QShaderDescription::deserialize(QDataStream *stream,
int version)
636 QShaderDescription desc;
637 QShaderDescriptionPrivate::get(&desc)->loadFromStream(stream, version);
642
643
644
645
646QList<QShaderDescription::InOutVariable> QShaderDescription::inputVariables()
const
652
653
654QList<QShaderDescription::InOutVariable> QShaderDescription::outputVariables()
const
660
661
662QList<QShaderDescription::UniformBlock> QShaderDescription::uniformBlocks()
const
664 return d->uniformBlocks;
668
669
670
671
672
673
674QList<QShaderDescription::PushConstantBlock> QShaderDescription::pushConstantBlocks()
const
676 return d->pushConstantBlocks;
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
748
749QList<QShaderDescription::StorageBlock> QShaderDescription::storageBlocks()
const
751 return d->storageBlocks;
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776QList<QShaderDescription::InOutVariable> QShaderDescription::combinedImageSamplers()
const
778 return d->combinedImageSamplers;
781QList<QShaderDescription::InOutVariable> QShaderDescription::separateImages()
const
783 return d->separateImages;
786QList<QShaderDescription::InOutVariable> QShaderDescription::separateSamplers()
const
788 return d->separateSamplers;
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813QList<QShaderDescription::InOutVariable> QShaderDescription::storageImages()
const
815 return d->storageImages;
819
820
821
822
823QVector<QShaderDescription::BuiltinVariable> QShaderDescription::inputBuiltinVariables()
const
825 return d->inBuiltins;
829
830
831
832QVector<QShaderDescription::BuiltinVariable> QShaderDescription::outputBuiltinVariables()
const
834 return d->outBuiltins;
838
839
840
841
842
843
844
845
846
847std::array<uint, 3> QShaderDescription::computeShaderLocalSize()
const
853
854
855
856
857
858
859
860
861
862uint QShaderDescription::tessellationOutputVertexCount()
const
864 return d->tessOutVertCount;
868
869
870
871
872
873
874
877
878
879
880
881
882
883
884
885
886
887
888
889QShaderDescription::TessellationMode QShaderDescription::tessellationMode()
const
895
896
897
898
899
900
903
904
905
906
907
908
909
910
911
912
913
914
915QShaderDescription::TessellationWindingOrder QShaderDescription::tessellationWindingOrder()
const
921
922
923
924
925
926
927
930
931
932
933
934
935
936
937
938
939
940
941
942QShaderDescription::TessellationPartitioning QShaderDescription::tessellationPartitioning()
const
951 {
"float", QShaderDescription::Float },
952 {
"vec2", QShaderDescription::Vec2 },
953 {
"vec3", QShaderDescription::Vec3 },
954 {
"vec4", QShaderDescription::Vec4 },
955 {
"mat2", QShaderDescription::Mat2 },
956 {
"mat3", QShaderDescription::Mat3 },
957 {
"mat4", QShaderDescription::Mat4 },
959 {
"struct", QShaderDescription::Struct },
961 {
"sampler1D", QShaderDescription::Sampler1D },
962 {
"sampler2D", QShaderDescription::Sampler2D },
963 {
"sampler2DMS", QShaderDescription::Sampler2DMS },
964 {
"sampler3D", QShaderDescription::Sampler3D },
965 {
"samplerCube", QShaderDescription::SamplerCube },
966 {
"sampler1DArray", QShaderDescription::Sampler1DArray },
967 {
"sampler2DArray", QShaderDescription::Sampler2DArray },
968 {
"sampler2DMSArray", QShaderDescription::Sampler2DMSArray },
969 {
"sampler3DArray", QShaderDescription::Sampler3DArray },
970 {
"samplerCubeArray", QShaderDescription::SamplerCubeArray },
971 {
"samplerRect", QShaderDescription::SamplerRect },
972 {
"samplerBuffer", QShaderDescription::SamplerBuffer },
973 {
"samplerExternalOES", QShaderDescription::SamplerExternalOES },
974 {
"sampler", QShaderDescription::Sampler },
976 {
"mat2x3", QShaderDescription::Mat2x3 },
977 {
"mat2x4", QShaderDescription::Mat2x4 },
978 {
"mat3x2", QShaderDescription::Mat3x2 },
979 {
"mat3x4", QShaderDescription::Mat3x4 },
980 {
"mat4x2", QShaderDescription::Mat4x2 },
981 {
"mat4x3", QShaderDescription::Mat4x3 },
983 {
"int", QShaderDescription::Int },
984 {
"ivec2", QShaderDescription::Int2 },
985 {
"ivec3", QShaderDescription::Int3 },
986 {
"ivec4", QShaderDescription::Int4 },
988 {
"uint", QShaderDescription::Uint },
989 {
"uvec2", QShaderDescription::Uint2 },
990 {
"uvec3", QShaderDescription::Uint3 },
991 {
"uvec4", QShaderDescription::Uint4 },
993 {
"bool", QShaderDescription::Bool },
994 {
"bvec2", QShaderDescription::Bool2 },
995 {
"bvec3", QShaderDescription::Bool3 },
996 {
"bvec4", QShaderDescription::Bool4 },
998 {
"double", QShaderDescription::Double },
999 {
"dvec2", QShaderDescription::Double2 },
1000 {
"dvec3", QShaderDescription::Double3 },
1001 {
"dvec4", QShaderDescription::Double4 },
1002 {
"dmat2", QShaderDescription::DMat2 },
1003 {
"dmat3", QShaderDescription::DMat3 },
1004 {
"dmat4", QShaderDescription::DMat4 },
1005 {
"dmat2x3", QShaderDescription::DMat2x3 },
1006 {
"dmat2x4", QShaderDescription::DMat2x4 },
1007 {
"dmat3x2", QShaderDescription::DMat3x2 },
1008 {
"dmat3x4", QShaderDescription::DMat3x4 },
1009 {
"dmat4x2", QShaderDescription::DMat4x2 },
1010 {
"dmat4x3", QShaderDescription::DMat4x3 },
1012 {
"image1D", QShaderDescription::Image1D },
1013 {
"image2D", QShaderDescription::Image2D },
1014 {
"image2DMS", QShaderDescription::Image2DMS },
1015 {
"image3D", QShaderDescription::Image3D },
1016 {
"imageCube", QShaderDescription::ImageCube },
1017 {
"image1DArray", QShaderDescription::Image1DArray },
1018 {
"image2DArray", QShaderDescription::Image2DArray },
1019 {
"image2DMSArray", QShaderDescription::Image2DMSArray },
1020 {
"image3DArray", QShaderDescription::Image3DArray },
1021 {
"imageCubeArray", QShaderDescription::ImageCubeArray },
1022 {
"imageRect", QShaderDescription::ImageRect },
1023 {
"imageBuffer", QShaderDescription::ImageBuffer },
1025 {
"half", QShaderDescription::Half },
1026 {
"half2", QShaderDescription::Half2 },
1027 {
"half3", QShaderDescription::Half3 },
1028 {
"half4", QShaderDescription::Half4 } };
1032 for (size_t i = 0; i <
sizeof(typeTab) /
sizeof(TypeTab); ++i) {
1033 if (typeTab[i].v == t)
1034 return QLatin1StringView(typeTab[i].k);
1043 {
"unknown", QShaderDescription::ImageFormatUnknown },
1044 {
"rgba32f", QShaderDescription::ImageFormatRgba32f },
1045 {
"rgba16", QShaderDescription::ImageFormatRgba16f },
1046 {
"r32f", QShaderDescription::ImageFormatR32f },
1047 {
"rgba8", QShaderDescription::ImageFormatRgba8 },
1048 {
"rgba8_snorm", QShaderDescription::ImageFormatRgba8Snorm },
1049 {
"rg32f", QShaderDescription::ImageFormatRg32f },
1050 {
"rg16f", QShaderDescription::ImageFormatRg16f },
1051 {
"r11f_g11f_b10f", QShaderDescription::ImageFormatR11fG11fB10f },
1052 {
"r16f", QShaderDescription::ImageFormatR16f },
1053 {
"rgba16", QShaderDescription::ImageFormatRgba16 },
1054 {
"rgb10_a2", QShaderDescription::ImageFormatRgb10A2 },
1055 {
"rg16", QShaderDescription::ImageFormatRg16 },
1056 {
"rg8", QShaderDescription::ImageFormatRg8 },
1057 {
"r16", QShaderDescription::ImageFormatR16 },
1058 {
"r8", QShaderDescription::ImageFormatR8 },
1059 {
"rgba16_snorm", QShaderDescription::ImageFormatRgba16Snorm },
1060 {
"rg16_snorm", QShaderDescription::ImageFormatRg16Snorm },
1061 {
"rg8_snorm", QShaderDescription::ImageFormatRg8Snorm },
1062 {
"r16_snorm", QShaderDescription::ImageFormatR16Snorm },
1063 {
"r8_snorm", QShaderDescription::ImageFormatR8Snorm },
1064 {
"rgba32i", QShaderDescription::ImageFormatRgba32i },
1065 {
"rgba16i", QShaderDescription::ImageFormatRgba16i },
1066 {
"rgba8i", QShaderDescription::ImageFormatRgba8i },
1067 {
"r32i", QShaderDescription::ImageFormatR32i },
1068 {
"rg32i", QShaderDescription::ImageFormatRg32i },
1069 {
"rg16i", QShaderDescription::ImageFormatRg16i },
1070 {
"rg8i", QShaderDescription::ImageFormatRg8i },
1071 {
"r16i", QShaderDescription::ImageFormatR16i },
1072 {
"r8i", QShaderDescription::ImageFormatR8i },
1073 {
"rgba32ui", QShaderDescription::ImageFormatRgba32ui },
1074 {
"rgba16ui", QShaderDescription::ImageFormatRgba16ui },
1075 {
"rgba8ui", QShaderDescription::ImageFormatRgba8ui },
1076 {
"r32ui", QShaderDescription::ImageFormatR32ui },
1077 {
"rgb10_a2ui", QShaderDescription::ImageFormatRgb10a2ui },
1078 {
"rg32ui", QShaderDescription::ImageFormatRg32ui },
1079 {
"rg16ui", QShaderDescription::ImageFormatRg16ui },
1080 {
"rg8ui", QShaderDescription::ImageFormatRg8ui },
1081 {
"r16ui", QShaderDescription::ImageFormatR16ui },
1082 {
"r8ui", QShaderDescription::ImageFormatR8ui }
1087 for (size_t i = 0; i <
sizeof(imageFormatTab) /
sizeof(ImageFormatTab); ++i) {
1088 if (imageFormatTab[i].v == f)
1089 return QLatin1StringView(imageFormatTab[i].k);
1097} builtinTypeTab[] = {
1098 {
"Position", QShaderDescription::PositionBuiltin },
1099 {
"PointSize", QShaderDescription::PointSizeBuiltin },
1100 {
"ClipDistance", QShaderDescription::ClipDistanceBuiltin },
1101 {
"CullDistance", QShaderDescription::CullDistanceBuiltin },
1102 {
"VertexId", QShaderDescription::VertexIdBuiltin },
1103 {
"InstanceId", QShaderDescription::InstanceIdBuiltin },
1104 {
"PrimitiveId", QShaderDescription::PrimitiveIdBuiltin },
1105 {
"InvocationId", QShaderDescription::InvocationIdBuiltin },
1106 {
"Layer", QShaderDescription::LayerBuiltin },
1107 {
"ViewportIndex", QShaderDescription::ViewportIndexBuiltin },
1108 {
"TessLevelOuter", QShaderDescription::TessLevelOuterBuiltin },
1109 {
"TessLevelInner", QShaderDescription::TessLevelInnerBuiltin },
1110 {
"TessCoord", QShaderDescription::TessCoordBuiltin },
1111 {
"PatchVertices", QShaderDescription::PatchVerticesBuiltin },
1112 {
"FragCoord", QShaderDescription::FragCoordBuiltin },
1113 {
"PointCoord", QShaderDescription::PointCoordBuiltin },
1114 {
"FrontFacing", QShaderDescription::FrontFacingBuiltin },
1115 {
"SampleId", QShaderDescription::SampleIdBuiltin },
1116 {
"SamplePosition", QShaderDescription::SamplePositionBuiltin },
1117 {
"SampleMask", QShaderDescription::SampleMaskBuiltin },
1118 {
"FragDepth", QShaderDescription::FragDepthBuiltin },
1119 {
"NumWorkGroups", QShaderDescription::NumWorkGroupsBuiltin },
1120 {
"WorkgroupSize", QShaderDescription::WorkgroupSizeBuiltin },
1121 {
"WorkgroupId", QShaderDescription::WorkgroupIdBuiltin },
1122 {
"LocalInvocationId", QShaderDescription::LocalInvocationIdBuiltin },
1123 {
"GlobalInvocationId", QShaderDescription::GlobalInvocationIdBuiltin },
1124 {
"LocalInvocationIndex", QShaderDescription::LocalInvocationIndexBuiltin },
1125 {
"VertexIndex", QShaderDescription::VertexIndexBuiltin },
1126 {
"InstanceIndex", QShaderDescription::InstanceIndexBuiltin },
1127 {
"ViewIndex", QShaderDescription::ViewIndexBuiltin }
1132 for (size_t i = 0; i <
sizeof(builtinTypeTab) /
sizeof(BuiltinTypeTab); ++i) {
1133 if (builtinTypeTab[i].v == t)
1134 return QLatin1StringView(builtinTypeTab[i].k);
1142} tessellationModeTab[] {
1143 {
"unknown", QShaderDescription::UnknownTessellationMode },
1144 {
"triangles", QShaderDescription::TrianglesTessellationMode },
1145 {
"quad", QShaderDescription::QuadTessellationMode },
1146 {
"isoline", QShaderDescription::IsolineTessellationMode }
1151 for (size_t i = 0; i <
sizeof(tessellationModeTab) /
sizeof(TessellationModeTab); ++i) {
1152 if (tessellationModeTab[i].v == mode)
1153 return QLatin1StringView(tessellationModeTab[i].k);
1161} tessellationWindingOrderTab[] {
1162 {
"unknown", QShaderDescription::UnknownTessellationWindingOrder },
1163 {
"cw", QShaderDescription::CwTessellationWindingOrder },
1164 {
"ccw", QShaderDescription::CcwTessellationWindingOrder }
1169 for (size_t i = 0; i <
sizeof(tessellationWindingOrderTab) /
sizeof(TessellationWindingOrderTab); ++i) {
1170 if (tessellationWindingOrderTab[i].v == w)
1171 return QLatin1StringView(tessellationWindingOrderTab[i].k);
1179} tessellationPartitioningTab[] {
1180 {
"unknown", QShaderDescription::UnknownTessellationPartitioning },
1181 {
"equal_spacing", QShaderDescription::EqualTessellationPartitioning },
1182 {
"fractional_even_spacing", QShaderDescription::FractionalEvenTessellationPartitioning },
1183 {
"fractional_odd_spacing", QShaderDescription::FractionalOddTessellationPartitioning }
1188 for (size_t i = 0; i <
sizeof(tessellationPartitioningTab) /
sizeof(TessellationPartitioningTab); ++i) {
1189 if (tessellationPartitioningTab[i].v == p)
1190 return QLatin1StringView(tessellationPartitioningTab[i].k);
1195#ifndef QT_NO_DEBUG_STREAM
1198 const QShaderDescriptionPrivate *d = sd.d;
1199 QDebugStateSaver saver(dbg);
1202 dbg.nospace() <<
"QShaderDescription("
1203 <<
"inVars " << d->inVars
1204 <<
" outVars " << d->outVars
1205 <<
" uniformBlocks " << d->uniformBlocks
1206 <<
" pcBlocks " << d->pushConstantBlocks
1207 <<
" storageBlocks " << d->storageBlocks
1208 <<
" combinedSamplers " << d->combinedImageSamplers
1209 <<
" storageImages " << d->storageImages
1210 <<
" separateImages " << d->separateImages
1211 <<
" separateSamplers " << d->separateSamplers
1212 <<
" inBuiltins " << d->inBuiltins
1213 <<
" outBuiltins " << d->outBuiltins
1216 dbg.nospace() <<
"QShaderDescription(null)";
1494QJsonDocument QShaderDescriptionPrivate::makeDoc()
1499 for (
const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1500 jinputs.append(inOutObject(v));
1501 if (!jinputs.isEmpty())
1502 root[inputsKey()] = jinputs;
1504 QJsonArray joutputs;
1505 for (
const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1506 joutputs.append(inOutObject(v));
1507 if (!joutputs.isEmpty())
1508 root[outputsKey()] = joutputs;
1510 QJsonArray juniformBlocks;
1511 for (
const QShaderDescription::UniformBlock &b : uniformBlocks) {
1512 QJsonObject juniformBlock;
1513 juniformBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1514 juniformBlock[structNameKey()] = QString::fromUtf8(b.structName);
1515 juniformBlock[sizeKey()] = b.size;
1517 juniformBlock[bindingKey()] = b.binding;
1518 if (b.descriptorSet >= 0)
1519 juniformBlock[setKey()] = b.descriptorSet;
1521 for (
const QShaderDescription::BlockVariable &v : b.members)
1522 members.append(blockMemberObject(v));
1523 juniformBlock[membersKey()] = members;
1524 juniformBlocks.append(juniformBlock);
1526 if (!juniformBlocks.isEmpty())
1527 root[uniformBlocksKey()] = juniformBlocks;
1529 QJsonArray jpushConstantBlocks;
1530 for (
const QShaderDescription::PushConstantBlock &b : pushConstantBlocks) {
1531 QJsonObject jpushConstantBlock;
1532 jpushConstantBlock[nameKey()] = QString::fromUtf8(b.name);
1533 jpushConstantBlock[sizeKey()] = b.size;
1535 for (
const QShaderDescription::BlockVariable &v : b.members)
1536 members.append(blockMemberObject(v));
1537 jpushConstantBlock[membersKey()] = members;
1538 jpushConstantBlocks.append(jpushConstantBlock);
1540 if (!jpushConstantBlocks.isEmpty())
1541 root[pushConstantBlocksKey()] = jpushConstantBlocks;
1543 QJsonArray jstorageBlocks;
1544 for (
const QShaderDescription::StorageBlock &b : storageBlocks) {
1545 QJsonObject jstorageBlock;
1546 jstorageBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1547 jstorageBlock[instanceNameKey()] = QString::fromUtf8(b.instanceName);
1548 jstorageBlock[knownSizeKey()] = b.knownSize;
1550 jstorageBlock[bindingKey()] = b.binding;
1551 if (b.descriptorSet >= 0)
1552 jstorageBlock[setKey()] = b.descriptorSet;
1553 if (b.runtimeArrayStride)
1554 jstorageBlock[runtimeArrayStrideKey()] = b.runtimeArrayStride;
1555 if (b.qualifierFlags)
1556 jstorageBlock[qualifierFlagsKey()] =
int(b.qualifierFlags);
1558 for (
const QShaderDescription::BlockVariable &v : b.members)
1559 members.append(blockMemberObject(v));
1560 jstorageBlock[membersKey()] = members;
1561 jstorageBlocks.append(jstorageBlock);
1563 if (!jstorageBlocks.isEmpty())
1564 root[storageBlocksKey()] = jstorageBlocks;
1566 QJsonArray jcombinedSamplers;
1567 for (
const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1568 QJsonObject sampler;
1569 sampler[nameKey()] = QString::fromUtf8(v.name);
1570 sampler[typeKey()] = typeStr(v.type);
1571 addDeco(&sampler, v);
1572 jcombinedSamplers.append(sampler);
1574 if (!jcombinedSamplers.isEmpty())
1575 root[combinedImageSamplersKey()] = jcombinedSamplers;
1577 QJsonArray jstorageImages;
1578 for (
const QShaderDescription::InOutVariable &v : std::as_const(storageImages)) {
1580 image[nameKey()] = QString::fromUtf8(v.name);
1581 image[typeKey()] = typeStr(v.type);
1583 jstorageImages.append(image);
1585 if (!jstorageImages.isEmpty())
1586 root[storageImagesKey()] = jstorageImages;
1588 QJsonArray jinBuiltins;
1589 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1590 jinBuiltins.append(builtinObject(v));
1591 if (!jinBuiltins.isEmpty())
1592 root[inBuiltinsKey()] = jinBuiltins;
1594 QJsonArray joutBuiltins;
1595 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1596 joutBuiltins.append(builtinObject(v));
1597 if (!joutBuiltins.isEmpty())
1598 root[outBuiltinsKey()] = joutBuiltins;
1600 if (localSize[0] || localSize[1] || localSize[2]) {
1601 QJsonArray jlocalSize;
1602 for (size_t i = 0; i < 3; ++i)
1603 jlocalSize.append(QJsonValue(
int(localSize[i])));
1604 root[computeLocalSizeKey()] = jlocalSize;
1607 if (tessOutVertCount)
1608 root[tessellationOutputVertexCountKey()] =
int(tessOutVertCount);
1610 if (tessMode != QShaderDescription::UnknownTessellationMode)
1611 root[tessellationModeKey()] = tessModeStr(tessMode);
1613 if (tessWind != QShaderDescription::UnknownTessellationWindingOrder)
1614 root[tessellationWindingOrderKey()] = tessWindStr(tessWind);
1616 if (tessPart != QShaderDescription::UnknownTessellationPartitioning)
1617 root[tessellationPartitioningKey()] = tessPartStr(tessPart);
1619 QJsonArray jseparateImages;
1620 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateImages)) {
1622 image[nameKey()] = QString::fromUtf8(v.name);
1623 image[typeKey()] = typeStr(v.type);
1625 jseparateImages.append(image);
1627 if (!jseparateImages.isEmpty())
1628 root[separateImagesKey()] = jseparateImages;
1630 QJsonArray jseparateSamplers;
1631 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1632 QJsonObject sampler;
1633 sampler[nameKey()] = QString::fromUtf8(v.name);
1634 sampler[typeKey()] = typeStr(v.type);
1635 addDeco(&sampler, v);
1636 jseparateSamplers.append(sampler);
1638 if (!jseparateSamplers.isEmpty())
1639 root[separateSamplersKey()] = jseparateSamplers;
1641 return QJsonDocument(root);
1644void QShaderDescriptionPrivate::writeToStream(QDataStream *stream,
int version)
1646 (*stream) <<
int(inVars.size());
1647 for (
const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1648 serializeInOutVar(stream, v, version);
1650 (*stream) <<
int(outVars.size());
1651 for (
const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1652 serializeInOutVar(stream, v, version);
1654 (*stream) <<
int(uniformBlocks.size());
1655 for (
const QShaderDescription::UniformBlock &b : uniformBlocks) {
1656 (*stream) << QString::fromUtf8(b.blockName);
1657 (*stream) << QString::fromUtf8(b.structName);
1658 (*stream) << b.size;
1659 (*stream) << b.binding;
1660 (*stream) << b.descriptorSet;
1661 (*stream) <<
int(b.members.size());
1662 for (
const QShaderDescription::BlockVariable &v : b.members)
1663 serializeBlockMemberVar(stream, v);
1666 (*stream) <<
int(pushConstantBlocks.size());
1667 for (
const QShaderDescription::PushConstantBlock &b : pushConstantBlocks) {
1668 (*stream) << QString::fromUtf8(b.name);
1669 (*stream) << b.size;
1670 (*stream) <<
int(b.members.size());
1671 for (
const QShaderDescription::BlockVariable &v : b.members)
1672 serializeBlockMemberVar(stream, v);
1675 (*stream) <<
int(storageBlocks.size());
1676 for (
const QShaderDescription::StorageBlock &b : storageBlocks) {
1677 (*stream) << QString::fromUtf8(b.blockName);
1678 (*stream) << QString::fromUtf8(b.instanceName);
1679 (*stream) << b.knownSize;
1680 (*stream) << b.binding;
1681 (*stream) << b.descriptorSet;
1682 (*stream) <<
int(b.members.size());
1683 for (
const QShaderDescription::BlockVariable &v : b.members)
1684 serializeBlockMemberVar(stream, v);
1685 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO) {
1686 (*stream) << b.runtimeArrayStride;
1687 (*stream) << b.qualifierFlags;
1691 (*stream) <<
int(combinedImageSamplers.size());
1692 for (
const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1693 (*stream) << QString::fromUtf8(v.name);
1694 (*stream) <<
int(v.type);
1695 serializeDecorations(stream, v, version);
1698 (*stream) <<
int(storageImages.size());
1699 for (
const QShaderDescription::InOutVariable &v : std::as_const(storageImages)) {
1700 (*stream) << QString::fromUtf8(v.name);
1701 (*stream) <<
int(v.type);
1702 serializeDecorations(stream, v, version);
1705 for (size_t i = 0; i < 3; ++i)
1706 (*stream) << quint32(localSize[i]);
1708 (*stream) <<
int(separateImages.size());
1709 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateImages)) {
1710 (*stream) << QString::fromUtf8(v.name);
1711 (*stream) <<
int(v.type);
1712 serializeDecorations(stream, v, version);
1715 (*stream) <<
int(separateSamplers.size());
1716 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1717 (*stream) << QString::fromUtf8(v.name);
1718 (*stream) <<
int(v.type);
1719 serializeDecorations(stream, v, version);
1722 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
1723 (*stream) << quint32(tessOutVertCount);
1724 (*stream) << quint32(tessMode);
1725 (*stream) << quint32(tessWind);
1726 (*stream) << quint32(tessPart);
1728 (*stream) <<
int(inBuiltins.size());
1729 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1730 serializeBuiltinVar(stream, v, version);
1732 (*stream) <<
int(outBuiltins.size());
1733 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1734 serializeBuiltinVar(stream, v, version);
1827void QShaderDescriptionPrivate::loadFromStream(QDataStream *stream,
int version)
1829 Q_ASSERT(ref.loadRelaxed() == 1);
1833 inVars.resize(count);
1834 for (
int i = 0; i < count; ++i)
1835 inVars[i] = deserializeInOutVar(stream, version);
1838 outVars.resize(count);
1839 for (
int i = 0; i < count; ++i)
1840 outVars[i] = deserializeInOutVar(stream, version);
1843 uniformBlocks.resize(count);
1844 for (
int i = 0; i < count; ++i) {
1847 uniformBlocks[i].blockName = tmp.toUtf8();
1849 uniformBlocks[i].structName = tmp.toUtf8();
1850 (*stream) >> uniformBlocks[i].size;
1851 (*stream) >> uniformBlocks[i].binding;
1852 (*stream) >> uniformBlocks[i].descriptorSet;
1854 (*stream) >> memberCount;
1855 uniformBlocks[i].members.resize(memberCount);
1856 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1857 uniformBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1861 pushConstantBlocks.resize(count);
1862 for (
int i = 0; i < count; ++i) {
1865 pushConstantBlocks[i].name = tmp.toUtf8();
1866 (*stream) >> pushConstantBlocks[i].size;
1868 (*stream) >> memberCount;
1869 pushConstantBlocks[i].members.resize(memberCount);
1870 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1871 pushConstantBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1875 storageBlocks.resize(count);
1876 for (
int i = 0; i < count; ++i) {
1879 storageBlocks[i].blockName = tmp.toUtf8();
1881 storageBlocks[i].instanceName = tmp.toUtf8();
1882 (*stream) >> storageBlocks[i].knownSize;
1883 (*stream) >> storageBlocks[i].binding;
1884 (*stream) >> storageBlocks[i].descriptorSet;
1886 (*stream) >> memberCount;
1887 storageBlocks[i].members.resize(memberCount);
1888 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1889 storageBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1891 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO) {
1892 (*stream) >> storageBlocks[i].runtimeArrayStride;
1893 (*stream) >> storageBlocks[i].qualifierFlags;
1898 combinedImageSamplers.resize(count);
1899 for (
int i = 0; i < count; ++i) {
1902 combinedImageSamplers[i].name = tmp.toUtf8();
1905 combinedImageSamplers[i].type = QShaderDescription::VariableType(t);
1906 deserializeDecorations(stream, version, &combinedImageSamplers[i]);
1910 storageImages.resize(count);
1911 for (
int i = 0; i < count; ++i) {
1914 storageImages[i].name = tmp.toUtf8();
1917 storageImages[i].type = QShaderDescription::VariableType(t);
1918 deserializeDecorations(stream, version, &storageImages[i]);
1921 for (size_t i = 0; i < 3; ++i) {
1927 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS) {
1929 separateImages.resize(count);
1930 for (
int i = 0; i < count; ++i) {
1933 separateImages[i].name = tmp.toUtf8();
1936 separateImages[i].type = QShaderDescription::VariableType(t);
1937 deserializeDecorations(stream, version, &separateImages[i]);
1941 separateSamplers.resize(count);
1942 for (
int i = 0; i < count; ++i) {
1945 separateSamplers[i].name = tmp.toUtf8();
1948 separateSamplers[i].type = QShaderDescription::VariableType(t);
1949 deserializeDecorations(stream, version, &separateSamplers[i]);
1953 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
1956 tessOutVertCount = v;
1958 tessMode = QShaderDescription::TessellationMode(v);
1960 tessWind = QShaderDescription::TessellationWindingOrder(v);
1962 tessPart = QShaderDescription::TessellationPartitioning(v);
1965 inBuiltins.resize(count);
1966 for (
int i = 0; i < count; ++i)
1967 inBuiltins[i] = deserializeBuiltinVar(stream, version);
1970 outBuiltins.resize(count);
1971 for (
int i = 0; i < count; ++i)
1972 outBuiltins[i] = deserializeBuiltinVar(stream, version);