328
329
332
333
336
337
338
339
340
341
342
343
344
347
348
351
352
355
356
359
360
363
364
367
368
371
372
375
376
379
380
383
384
385
386
387
388
389
390
391
392
393
394
395
396
399
400
403
404
407
408
411
412
415
416
419
420
423
424
425
426
427
428
429
430
431
434
435
438
439
442
443
446
447
448
449
450
451
452
453
454
457
458
461
462
465
466
469
470
473
474
477
478
481
482
485
486
489
490
491
492
493
494
495
496
497
500
501
504
505
508
509
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
545
548
549
550
551
552
553QShaderDescription::QShaderDescription()
554 : d(
new QShaderDescriptionPrivate)
559
560
561void QShaderDescription::detach()
567
568
569QShaderDescription::QShaderDescription(
const QShaderDescription &other)
576
577
578QShaderDescription &QShaderDescription::operator=(
const QShaderDescription &other)
580 qAtomicAssign(d, other.d);
585
586
587QShaderDescription::~QShaderDescription()
594
595
596
597bool QShaderDescription::isValid()
const
599 return !d->inVars.isEmpty() || !d->outVars.isEmpty()
600 || !d->uniformBlocks.isEmpty() || !d->pushConstantBlocks.isEmpty() || !d->storageBlocks.isEmpty()
601 || !d->combinedImageSamplers.isEmpty() || !d->storageImages.isEmpty()
602 || !d->separateImages.isEmpty() || !d->separateSamplers.isEmpty()
603 || !d->inBuiltins.isEmpty() || !d->outBuiltins.isEmpty();
607
608
609
610
611
612
613QByteArray QShaderDescription::toJson()
const
615 return d->makeDoc().toJson();
619
620
621
622
623
624void QShaderDescription::serialize(QDataStream *stream,
int version)
const
626 d->writeToStream(stream, version);
630
631
632
633
634
635QShaderDescription QShaderDescription::deserialize(QDataStream *stream,
int version)
637 QShaderDescription desc;
638 QShaderDescriptionPrivate::get(&desc)->loadFromStream(stream, version);
643
644
645
646
647QList<QShaderDescription::InOutVariable> QShaderDescription::inputVariables()
const
653
654
655QList<QShaderDescription::InOutVariable> QShaderDescription::outputVariables()
const
661
662
663QList<QShaderDescription::UniformBlock> QShaderDescription::uniformBlocks()
const
665 return d->uniformBlocks;
669
670
671
672
673
674
675QList<QShaderDescription::PushConstantBlock> QShaderDescription::pushConstantBlocks()
const
677 return d->pushConstantBlocks;
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
749
750QList<QShaderDescription::StorageBlock> QShaderDescription::storageBlocks()
const
752 return d->storageBlocks;
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777QList<QShaderDescription::InOutVariable> QShaderDescription::combinedImageSamplers()
const
779 return d->combinedImageSamplers;
782QList<QShaderDescription::InOutVariable> QShaderDescription::separateImages()
const
784 return d->separateImages;
787QList<QShaderDescription::InOutVariable> QShaderDescription::separateSamplers()
const
789 return d->separateSamplers;
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814QList<QShaderDescription::InOutVariable> QShaderDescription::storageImages()
const
816 return d->storageImages;
820
821
822
823
824QVector<QShaderDescription::BuiltinVariable> QShaderDescription::inputBuiltinVariables()
const
826 return d->inBuiltins;
830
831
832
833QVector<QShaderDescription::BuiltinVariable> QShaderDescription::outputBuiltinVariables()
const
835 return d->outBuiltins;
839
840
841
842
843
844
845
846
847
848std::array<uint, 3> QShaderDescription::computeShaderLocalSize()
const
854
855
856
857
858
859
860
861
862
863uint QShaderDescription::tessellationOutputVertexCount()
const
865 return d->tessOutVertCount;
869
870
871
872
873
874
875
878
879
880
881
882
883
884
885
886
887
888
889
890QShaderDescription::TessellationMode QShaderDescription::tessellationMode()
const
896
897
898
899
900
901
904
905
906
907
908
909
910
911
912
913
914
915
916QShaderDescription::TessellationWindingOrder QShaderDescription::tessellationWindingOrder()
const
922
923
924
925
926
927
928
931
932
933
934
935
936
937
938
939
940
941
942
943QShaderDescription::TessellationPartitioning QShaderDescription::tessellationPartitioning()
const
952 {
"float", QShaderDescription::Float },
953 {
"vec2", QShaderDescription::Vec2 },
954 {
"vec3", QShaderDescription::Vec3 },
955 {
"vec4", QShaderDescription::Vec4 },
956 {
"mat2", QShaderDescription::Mat2 },
957 {
"mat3", QShaderDescription::Mat3 },
958 {
"mat4", QShaderDescription::Mat4 },
960 {
"struct", QShaderDescription::Struct },
962 {
"sampler1D", QShaderDescription::Sampler1D },
963 {
"sampler2D", QShaderDescription::Sampler2D },
964 {
"sampler2DMS", QShaderDescription::Sampler2DMS },
965 {
"sampler3D", QShaderDescription::Sampler3D },
966 {
"samplerCube", QShaderDescription::SamplerCube },
967 {
"sampler1DArray", QShaderDescription::Sampler1DArray },
968 {
"sampler2DArray", QShaderDescription::Sampler2DArray },
969 {
"sampler2DMSArray", QShaderDescription::Sampler2DMSArray },
970 {
"sampler3DArray", QShaderDescription::Sampler3DArray },
971 {
"samplerCubeArray", QShaderDescription::SamplerCubeArray },
972 {
"samplerRect", QShaderDescription::SamplerRect },
973 {
"samplerBuffer", QShaderDescription::SamplerBuffer },
974 {
"samplerExternalOES", QShaderDescription::SamplerExternalOES },
975 {
"sampler", QShaderDescription::Sampler },
977 {
"mat2x3", QShaderDescription::Mat2x3 },
978 {
"mat2x4", QShaderDescription::Mat2x4 },
979 {
"mat3x2", QShaderDescription::Mat3x2 },
980 {
"mat3x4", QShaderDescription::Mat3x4 },
981 {
"mat4x2", QShaderDescription::Mat4x2 },
982 {
"mat4x3", QShaderDescription::Mat4x3 },
984 {
"int", QShaderDescription::Int },
985 {
"ivec2", QShaderDescription::Int2 },
986 {
"ivec3", QShaderDescription::Int3 },
987 {
"ivec4", QShaderDescription::Int4 },
989 {
"uint", QShaderDescription::Uint },
990 {
"uvec2", QShaderDescription::Uint2 },
991 {
"uvec3", QShaderDescription::Uint3 },
992 {
"uvec4", QShaderDescription::Uint4 },
994 {
"bool", QShaderDescription::Bool },
995 {
"bvec2", QShaderDescription::Bool2 },
996 {
"bvec3", QShaderDescription::Bool3 },
997 {
"bvec4", QShaderDescription::Bool4 },
999 {
"double", QShaderDescription::Double },
1000 {
"dvec2", QShaderDescription::Double2 },
1001 {
"dvec3", QShaderDescription::Double3 },
1002 {
"dvec4", QShaderDescription::Double4 },
1003 {
"dmat2", QShaderDescription::DMat2 },
1004 {
"dmat3", QShaderDescription::DMat3 },
1005 {
"dmat4", QShaderDescription::DMat4 },
1006 {
"dmat2x3", QShaderDescription::DMat2x3 },
1007 {
"dmat2x4", QShaderDescription::DMat2x4 },
1008 {
"dmat3x2", QShaderDescription::DMat3x2 },
1009 {
"dmat3x4", QShaderDescription::DMat3x4 },
1010 {
"dmat4x2", QShaderDescription::DMat4x2 },
1011 {
"dmat4x3", QShaderDescription::DMat4x3 },
1013 {
"image1D", QShaderDescription::Image1D },
1014 {
"image2D", QShaderDescription::Image2D },
1015 {
"image2DMS", QShaderDescription::Image2DMS },
1016 {
"image3D", QShaderDescription::Image3D },
1017 {
"imageCube", QShaderDescription::ImageCube },
1018 {
"image1DArray", QShaderDescription::Image1DArray },
1019 {
"image2DArray", QShaderDescription::Image2DArray },
1020 {
"image2DMSArray", QShaderDescription::Image2DMSArray },
1021 {
"image3DArray", QShaderDescription::Image3DArray },
1022 {
"imageCubeArray", QShaderDescription::ImageCubeArray },
1023 {
"imageRect", QShaderDescription::ImageRect },
1024 {
"imageBuffer", QShaderDescription::ImageBuffer },
1026 {
"half", QShaderDescription::Half },
1027 {
"half2", QShaderDescription::Half2 },
1028 {
"half3", QShaderDescription::Half3 },
1029 {
"half4", QShaderDescription::Half4 } };
1033 for (size_t i = 0; i <
sizeof(typeTab) /
sizeof(TypeTab); ++i) {
1034 if (typeTab[i].v == t)
1035 return QLatin1StringView(typeTab[i].k);
1044 {
"unknown", QShaderDescription::ImageFormatUnknown },
1045 {
"rgba32f", QShaderDescription::ImageFormatRgba32f },
1046 {
"rgba16", QShaderDescription::ImageFormatRgba16f },
1047 {
"r32f", QShaderDescription::ImageFormatR32f },
1048 {
"rgba8", QShaderDescription::ImageFormatRgba8 },
1049 {
"rgba8_snorm", QShaderDescription::ImageFormatRgba8Snorm },
1050 {
"rg32f", QShaderDescription::ImageFormatRg32f },
1051 {
"rg16f", QShaderDescription::ImageFormatRg16f },
1052 {
"r11f_g11f_b10f", QShaderDescription::ImageFormatR11fG11fB10f },
1053 {
"r16f", QShaderDescription::ImageFormatR16f },
1054 {
"rgba16", QShaderDescription::ImageFormatRgba16 },
1055 {
"rgb10_a2", QShaderDescription::ImageFormatRgb10A2 },
1056 {
"rg16", QShaderDescription::ImageFormatRg16 },
1057 {
"rg8", QShaderDescription::ImageFormatRg8 },
1058 {
"r16", QShaderDescription::ImageFormatR16 },
1059 {
"r8", QShaderDescription::ImageFormatR8 },
1060 {
"rgba16_snorm", QShaderDescription::ImageFormatRgba16Snorm },
1061 {
"rg16_snorm", QShaderDescription::ImageFormatRg16Snorm },
1062 {
"rg8_snorm", QShaderDescription::ImageFormatRg8Snorm },
1063 {
"r16_snorm", QShaderDescription::ImageFormatR16Snorm },
1064 {
"r8_snorm", QShaderDescription::ImageFormatR8Snorm },
1065 {
"rgba32i", QShaderDescription::ImageFormatRgba32i },
1066 {
"rgba16i", QShaderDescription::ImageFormatRgba16i },
1067 {
"rgba8i", QShaderDescription::ImageFormatRgba8i },
1068 {
"r32i", QShaderDescription::ImageFormatR32i },
1069 {
"rg32i", QShaderDescription::ImageFormatRg32i },
1070 {
"rg16i", QShaderDescription::ImageFormatRg16i },
1071 {
"rg8i", QShaderDescription::ImageFormatRg8i },
1072 {
"r16i", QShaderDescription::ImageFormatR16i },
1073 {
"r8i", QShaderDescription::ImageFormatR8i },
1074 {
"rgba32ui", QShaderDescription::ImageFormatRgba32ui },
1075 {
"rgba16ui", QShaderDescription::ImageFormatRgba16ui },
1076 {
"rgba8ui", QShaderDescription::ImageFormatRgba8ui },
1077 {
"r32ui", QShaderDescription::ImageFormatR32ui },
1078 {
"rgb10_a2ui", QShaderDescription::ImageFormatRgb10a2ui },
1079 {
"rg32ui", QShaderDescription::ImageFormatRg32ui },
1080 {
"rg16ui", QShaderDescription::ImageFormatRg16ui },
1081 {
"rg8ui", QShaderDescription::ImageFormatRg8ui },
1082 {
"r16ui", QShaderDescription::ImageFormatR16ui },
1083 {
"r8ui", QShaderDescription::ImageFormatR8ui }
1088 for (size_t i = 0; i <
sizeof(imageFormatTab) /
sizeof(ImageFormatTab); ++i) {
1089 if (imageFormatTab[i].v == f)
1090 return QLatin1StringView(imageFormatTab[i].k);
1098} builtinTypeTab[] = {
1099 {
"Position", QShaderDescription::PositionBuiltin },
1100 {
"PointSize", QShaderDescription::PointSizeBuiltin },
1101 {
"ClipDistance", QShaderDescription::ClipDistanceBuiltin },
1102 {
"CullDistance", QShaderDescription::CullDistanceBuiltin },
1103 {
"VertexId", QShaderDescription::VertexIdBuiltin },
1104 {
"InstanceId", QShaderDescription::InstanceIdBuiltin },
1105 {
"PrimitiveId", QShaderDescription::PrimitiveIdBuiltin },
1106 {
"InvocationId", QShaderDescription::InvocationIdBuiltin },
1107 {
"Layer", QShaderDescription::LayerBuiltin },
1108 {
"ViewportIndex", QShaderDescription::ViewportIndexBuiltin },
1109 {
"TessLevelOuter", QShaderDescription::TessLevelOuterBuiltin },
1110 {
"TessLevelInner", QShaderDescription::TessLevelInnerBuiltin },
1111 {
"TessCoord", QShaderDescription::TessCoordBuiltin },
1112 {
"PatchVertices", QShaderDescription::PatchVerticesBuiltin },
1113 {
"FragCoord", QShaderDescription::FragCoordBuiltin },
1114 {
"PointCoord", QShaderDescription::PointCoordBuiltin },
1115 {
"FrontFacing", QShaderDescription::FrontFacingBuiltin },
1116 {
"SampleId", QShaderDescription::SampleIdBuiltin },
1117 {
"SamplePosition", QShaderDescription::SamplePositionBuiltin },
1118 {
"SampleMask", QShaderDescription::SampleMaskBuiltin },
1119 {
"FragDepth", QShaderDescription::FragDepthBuiltin },
1120 {
"NumWorkGroups", QShaderDescription::NumWorkGroupsBuiltin },
1121 {
"WorkgroupSize", QShaderDescription::WorkgroupSizeBuiltin },
1122 {
"WorkgroupId", QShaderDescription::WorkgroupIdBuiltin },
1123 {
"LocalInvocationId", QShaderDescription::LocalInvocationIdBuiltin },
1124 {
"GlobalInvocationId", QShaderDescription::GlobalInvocationIdBuiltin },
1125 {
"LocalInvocationIndex", QShaderDescription::LocalInvocationIndexBuiltin },
1126 {
"VertexIndex", QShaderDescription::VertexIndexBuiltin },
1127 {
"InstanceIndex", QShaderDescription::InstanceIndexBuiltin },
1128 {
"ViewIndex", QShaderDescription::ViewIndexBuiltin }
1133 for (size_t i = 0; i <
sizeof(builtinTypeTab) /
sizeof(BuiltinTypeTab); ++i) {
1134 if (builtinTypeTab[i].v == t)
1135 return QLatin1StringView(builtinTypeTab[i].k);
1143} tessellationModeTab[] {
1144 {
"unknown", QShaderDescription::UnknownTessellationMode },
1145 {
"triangles", QShaderDescription::TrianglesTessellationMode },
1146 {
"quad", QShaderDescription::QuadTessellationMode },
1147 {
"isoline", QShaderDescription::IsolineTessellationMode }
1152 for (size_t i = 0; i <
sizeof(tessellationModeTab) /
sizeof(TessellationModeTab); ++i) {
1153 if (tessellationModeTab[i].v == mode)
1154 return QLatin1StringView(tessellationModeTab[i].k);
1162} tessellationWindingOrderTab[] {
1163 {
"unknown", QShaderDescription::UnknownTessellationWindingOrder },
1164 {
"cw", QShaderDescription::CwTessellationWindingOrder },
1165 {
"ccw", QShaderDescription::CcwTessellationWindingOrder }
1170 for (size_t i = 0; i <
sizeof(tessellationWindingOrderTab) /
sizeof(TessellationWindingOrderTab); ++i) {
1171 if (tessellationWindingOrderTab[i].v == w)
1172 return QLatin1StringView(tessellationWindingOrderTab[i].k);
1180} tessellationPartitioningTab[] {
1181 {
"unknown", QShaderDescription::UnknownTessellationPartitioning },
1182 {
"equal_spacing", QShaderDescription::EqualTessellationPartitioning },
1183 {
"fractional_even_spacing", QShaderDescription::FractionalEvenTessellationPartitioning },
1184 {
"fractional_odd_spacing", QShaderDescription::FractionalOddTessellationPartitioning }
1189 for (size_t i = 0; i <
sizeof(tessellationPartitioningTab) /
sizeof(TessellationPartitioningTab); ++i) {
1190 if (tessellationPartitioningTab[i].v == p)
1191 return QLatin1StringView(tessellationPartitioningTab[i].k);
1196#ifndef QT_NO_DEBUG_STREAM
1199 const QShaderDescriptionPrivate *d = sd.d;
1200 QDebugStateSaver saver(dbg);
1203 dbg.nospace() <<
"QShaderDescription("
1204 <<
"inVars " << d->inVars
1205 <<
" outVars " << d->outVars
1206 <<
" uniformBlocks " << d->uniformBlocks
1207 <<
" pcBlocks " << d->pushConstantBlocks
1208 <<
" storageBlocks " << d->storageBlocks
1209 <<
" combinedSamplers " << d->combinedImageSamplers
1210 <<
" storageImages " << d->storageImages
1211 <<
" separateImages " << d->separateImages
1212 <<
" separateSamplers " << d->separateSamplers
1213 <<
" inBuiltins " << d->inBuiltins
1214 <<
" outBuiltins " << d->outBuiltins
1217 dbg.nospace() <<
"QShaderDescription(null)";
1495QJsonDocument QShaderDescriptionPrivate::makeDoc()
1500 for (
const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1501 jinputs.append(inOutObject(v));
1502 if (!jinputs.isEmpty())
1503 root[inputsKey()] = jinputs;
1505 QJsonArray joutputs;
1506 for (
const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1507 joutputs.append(inOutObject(v));
1508 if (!joutputs.isEmpty())
1509 root[outputsKey()] = joutputs;
1511 QJsonArray juniformBlocks;
1512 for (
const QShaderDescription::UniformBlock &b : uniformBlocks) {
1513 QJsonObject juniformBlock;
1514 juniformBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1515 juniformBlock[structNameKey()] = QString::fromUtf8(b.structName);
1516 juniformBlock[sizeKey()] = b.size;
1518 juniformBlock[bindingKey()] = b.binding;
1519 if (b.descriptorSet >= 0)
1520 juniformBlock[setKey()] = b.descriptorSet;
1522 for (
const QShaderDescription::BlockVariable &v : b.members)
1523 members.append(blockMemberObject(v));
1524 juniformBlock[membersKey()] = members;
1525 juniformBlocks.append(juniformBlock);
1527 if (!juniformBlocks.isEmpty())
1528 root[uniformBlocksKey()] = juniformBlocks;
1530 QJsonArray jpushConstantBlocks;
1531 for (
const QShaderDescription::PushConstantBlock &b : pushConstantBlocks) {
1532 QJsonObject jpushConstantBlock;
1533 jpushConstantBlock[nameKey()] = QString::fromUtf8(b.name);
1534 jpushConstantBlock[sizeKey()] = b.size;
1536 for (
const QShaderDescription::BlockVariable &v : b.members)
1537 members.append(blockMemberObject(v));
1538 jpushConstantBlock[membersKey()] = members;
1539 jpushConstantBlocks.append(jpushConstantBlock);
1541 if (!jpushConstantBlocks.isEmpty())
1542 root[pushConstantBlocksKey()] = jpushConstantBlocks;
1544 QJsonArray jstorageBlocks;
1545 for (
const QShaderDescription::StorageBlock &b : storageBlocks) {
1546 QJsonObject jstorageBlock;
1547 jstorageBlock[blockNameKey()] = QString::fromUtf8(b.blockName);
1548 jstorageBlock[instanceNameKey()] = QString::fromUtf8(b.instanceName);
1549 jstorageBlock[knownSizeKey()] = b.knownSize;
1551 jstorageBlock[bindingKey()] = b.binding;
1552 if (b.descriptorSet >= 0)
1553 jstorageBlock[setKey()] = b.descriptorSet;
1554 if (b.runtimeArrayStride)
1555 jstorageBlock[runtimeArrayStrideKey()] = b.runtimeArrayStride;
1556 if (b.qualifierFlags)
1557 jstorageBlock[qualifierFlagsKey()] =
int(b.qualifierFlags);
1559 for (
const QShaderDescription::BlockVariable &v : b.members)
1560 members.append(blockMemberObject(v));
1561 jstorageBlock[membersKey()] = members;
1562 jstorageBlocks.append(jstorageBlock);
1564 if (!jstorageBlocks.isEmpty())
1565 root[storageBlocksKey()] = jstorageBlocks;
1567 QJsonArray jcombinedSamplers;
1568 for (
const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1569 QJsonObject sampler;
1570 sampler[nameKey()] = QString::fromUtf8(v.name);
1571 sampler[typeKey()] = typeStr(v.type);
1572 addDeco(&sampler, v);
1573 jcombinedSamplers.append(sampler);
1575 if (!jcombinedSamplers.isEmpty())
1576 root[combinedImageSamplersKey()] = jcombinedSamplers;
1578 QJsonArray jstorageImages;
1579 for (
const QShaderDescription::InOutVariable &v : std::as_const(storageImages)) {
1581 image[nameKey()] = QString::fromUtf8(v.name);
1582 image[typeKey()] = typeStr(v.type);
1584 jstorageImages.append(image);
1586 if (!jstorageImages.isEmpty())
1587 root[storageImagesKey()] = jstorageImages;
1589 QJsonArray jinBuiltins;
1590 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1591 jinBuiltins.append(builtinObject(v));
1592 if (!jinBuiltins.isEmpty())
1593 root[inBuiltinsKey()] = jinBuiltins;
1595 QJsonArray joutBuiltins;
1596 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1597 joutBuiltins.append(builtinObject(v));
1598 if (!joutBuiltins.isEmpty())
1599 root[outBuiltinsKey()] = joutBuiltins;
1601 if (localSize[0] || localSize[1] || localSize[2]) {
1602 QJsonArray jlocalSize;
1603 for (size_t i = 0; i < 3; ++i)
1604 jlocalSize.append(QJsonValue(
int(localSize[i])));
1605 root[computeLocalSizeKey()] = jlocalSize;
1608 if (tessOutVertCount)
1609 root[tessellationOutputVertexCountKey()] =
int(tessOutVertCount);
1611 if (tessMode != QShaderDescription::UnknownTessellationMode)
1612 root[tessellationModeKey()] = tessModeStr(tessMode);
1614 if (tessWind != QShaderDescription::UnknownTessellationWindingOrder)
1615 root[tessellationWindingOrderKey()] = tessWindStr(tessWind);
1617 if (tessPart != QShaderDescription::UnknownTessellationPartitioning)
1618 root[tessellationPartitioningKey()] = tessPartStr(tessPart);
1620 QJsonArray jseparateImages;
1621 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateImages)) {
1623 image[nameKey()] = QString::fromUtf8(v.name);
1624 image[typeKey()] = typeStr(v.type);
1626 jseparateImages.append(image);
1628 if (!jseparateImages.isEmpty())
1629 root[separateImagesKey()] = jseparateImages;
1631 QJsonArray jseparateSamplers;
1632 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1633 QJsonObject sampler;
1634 sampler[nameKey()] = QString::fromUtf8(v.name);
1635 sampler[typeKey()] = typeStr(v.type);
1636 addDeco(&sampler, v);
1637 jseparateSamplers.append(sampler);
1639 if (!jseparateSamplers.isEmpty())
1640 root[separateSamplersKey()] = jseparateSamplers;
1642 return QJsonDocument(root);
1645void QShaderDescriptionPrivate::writeToStream(QDataStream *stream,
int version)
1647 (*stream) <<
int(inVars.size());
1648 for (
const QShaderDescription::InOutVariable &v : std::as_const(inVars))
1649 serializeInOutVar(stream, v, version);
1651 (*stream) <<
int(outVars.size());
1652 for (
const QShaderDescription::InOutVariable &v : std::as_const(outVars))
1653 serializeInOutVar(stream, v, version);
1655 (*stream) <<
int(uniformBlocks.size());
1656 for (
const QShaderDescription::UniformBlock &b : uniformBlocks) {
1657 (*stream) << QString::fromUtf8(b.blockName);
1658 (*stream) << QString::fromUtf8(b.structName);
1659 (*stream) << b.size;
1660 (*stream) << b.binding;
1661 (*stream) << b.descriptorSet;
1662 (*stream) <<
int(b.members.size());
1663 for (
const QShaderDescription::BlockVariable &v : b.members)
1664 serializeBlockMemberVar(stream, v);
1667 (*stream) <<
int(pushConstantBlocks.size());
1668 for (
const QShaderDescription::PushConstantBlock &b : pushConstantBlocks) {
1669 (*stream) << QString::fromUtf8(b.name);
1670 (*stream) << b.size;
1671 (*stream) <<
int(b.members.size());
1672 for (
const QShaderDescription::BlockVariable &v : b.members)
1673 serializeBlockMemberVar(stream, v);
1676 (*stream) <<
int(storageBlocks.size());
1677 for (
const QShaderDescription::StorageBlock &b : storageBlocks) {
1678 (*stream) << QString::fromUtf8(b.blockName);
1679 (*stream) << QString::fromUtf8(b.instanceName);
1680 (*stream) << b.knownSize;
1681 (*stream) << b.binding;
1682 (*stream) << b.descriptorSet;
1683 (*stream) <<
int(b.members.size());
1684 for (
const QShaderDescription::BlockVariable &v : b.members)
1685 serializeBlockMemberVar(stream, v);
1686 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO) {
1687 (*stream) << b.runtimeArrayStride;
1688 (*stream) << b.qualifierFlags;
1692 (*stream) <<
int(combinedImageSamplers.size());
1693 for (
const QShaderDescription::InOutVariable &v : std::as_const(combinedImageSamplers)) {
1694 (*stream) << QString::fromUtf8(v.name);
1695 (*stream) <<
int(v.type);
1696 serializeDecorations(stream, v, version);
1699 (*stream) <<
int(storageImages.size());
1700 for (
const QShaderDescription::InOutVariable &v : std::as_const(storageImages)) {
1701 (*stream) << QString::fromUtf8(v.name);
1702 (*stream) <<
int(v.type);
1703 serializeDecorations(stream, v, version);
1706 for (size_t i = 0; i < 3; ++i)
1707 (*stream) << quint32(localSize[i]);
1709 (*stream) <<
int(separateImages.size());
1710 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateImages)) {
1711 (*stream) << QString::fromUtf8(v.name);
1712 (*stream) <<
int(v.type);
1713 serializeDecorations(stream, v, version);
1716 (*stream) <<
int(separateSamplers.size());
1717 for (
const QShaderDescription::InOutVariable &v : std::as_const(separateSamplers)) {
1718 (*stream) << QString::fromUtf8(v.name);
1719 (*stream) <<
int(v.type);
1720 serializeDecorations(stream, v, version);
1723 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
1724 (*stream) << quint32(tessOutVertCount);
1725 (*stream) << quint32(tessMode);
1726 (*stream) << quint32(tessWind);
1727 (*stream) << quint32(tessPart);
1729 (*stream) <<
int(inBuiltins.size());
1730 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(inBuiltins))
1731 serializeBuiltinVar(stream, v, version);
1733 (*stream) <<
int(outBuiltins.size());
1734 for (
const QShaderDescription::BuiltinVariable &v : std::as_const(outBuiltins))
1735 serializeBuiltinVar(stream, v, version);
1828void QShaderDescriptionPrivate::loadFromStream(QDataStream *stream,
int version)
1830 Q_ASSERT(ref.loadRelaxed() == 1);
1834 inVars.resize(count);
1835 for (
int i = 0; i < count; ++i)
1836 inVars[i] = deserializeInOutVar(stream, version);
1839 outVars.resize(count);
1840 for (
int i = 0; i < count; ++i)
1841 outVars[i] = deserializeInOutVar(stream, version);
1844 uniformBlocks.resize(count);
1845 for (
int i = 0; i < count; ++i) {
1848 uniformBlocks[i].blockName = tmp.toUtf8();
1850 uniformBlocks[i].structName = tmp.toUtf8();
1851 (*stream) >> uniformBlocks[i].size;
1852 (*stream) >> uniformBlocks[i].binding;
1853 (*stream) >> uniformBlocks[i].descriptorSet;
1855 (*stream) >> memberCount;
1856 uniformBlocks[i].members.resize(memberCount);
1857 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1858 uniformBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1862 pushConstantBlocks.resize(count);
1863 for (
int i = 0; i < count; ++i) {
1866 pushConstantBlocks[i].name = tmp.toUtf8();
1867 (*stream) >> pushConstantBlocks[i].size;
1869 (*stream) >> memberCount;
1870 pushConstantBlocks[i].members.resize(memberCount);
1871 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1872 pushConstantBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1876 storageBlocks.resize(count);
1877 for (
int i = 0; i < count; ++i) {
1880 storageBlocks[i].blockName = tmp.toUtf8();
1882 storageBlocks[i].instanceName = tmp.toUtf8();
1883 (*stream) >> storageBlocks[i].knownSize;
1884 (*stream) >> storageBlocks[i].binding;
1885 (*stream) >> storageBlocks[i].descriptorSet;
1887 (*stream) >> memberCount;
1888 storageBlocks[i].members.resize(memberCount);
1889 for (
int memberIdx = 0; memberIdx < memberCount; ++memberIdx)
1890 storageBlocks[i].members[memberIdx] = deserializeBlockMemberVar(stream, version);
1892 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO) {
1893 (*stream) >> storageBlocks[i].runtimeArrayStride;
1894 (*stream) >> storageBlocks[i].qualifierFlags;
1899 combinedImageSamplers.resize(count);
1900 for (
int i = 0; i < count; ++i) {
1903 combinedImageSamplers[i].name = tmp.toUtf8();
1906 combinedImageSamplers[i].type = QShaderDescription::VariableType(t);
1907 deserializeDecorations(stream, version, &combinedImageSamplers[i]);
1911 storageImages.resize(count);
1912 for (
int i = 0; i < count; ++i) {
1915 storageImages[i].name = tmp.toUtf8();
1918 storageImages[i].type = QShaderDescription::VariableType(t);
1919 deserializeDecorations(stream, version, &storageImages[i]);
1922 for (size_t i = 0; i < 3; ++i) {
1928 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS) {
1930 separateImages.resize(count);
1931 for (
int i = 0; i < count; ++i) {
1934 separateImages[i].name = tmp.toUtf8();
1937 separateImages[i].type = QShaderDescription::VariableType(t);
1938 deserializeDecorations(stream, version, &separateImages[i]);
1942 separateSamplers.resize(count);
1943 for (
int i = 0; i < count; ++i) {
1946 separateSamplers[i].name = tmp.toUtf8();
1949 separateSamplers[i].type = QShaderDescription::VariableType(t);
1950 deserializeDecorations(stream, version, &separateSamplers[i]);
1954 if (version > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
1957 tessOutVertCount = v;
1959 tessMode = QShaderDescription::TessellationMode(v);
1961 tessWind = QShaderDescription::TessellationWindingOrder(v);
1963 tessPart = QShaderDescription::TessellationPartitioning(v);
1966 inBuiltins.resize(count);
1967 for (
int i = 0; i < count; ++i)
1968 inBuiltins[i] = deserializeBuiltinVar(stream, version);
1971 outBuiltins.resize(count);
1972 for (
int i = 0; i < count; ++i)
1973 outBuiltins[i] = deserializeBuiltinVar(stream, version);