457QByteArray QShader::serialized(SerializedFormatVersion version)
const
459 static QShaderPrivate sd;
460 QShaderPrivate *dd = d ? d : &sd;
463 QDataStream ds(&buf);
464 ds.setVersion(QDataStream::Qt_5_10);
465 if (!buf.open(QIODevice::WriteOnly))
468 const int qsbVersion = QShaderPrivate::qtQsbVersion(version);
471 ds <<
int(dd->stage);
472 dd->desc.serialize(&ds, qsbVersion);
473 ds <<
int(dd->shaders.size());
474 for (
auto it = dd->shaders.cbegin(), itEnd = dd->shaders.cend(); it != itEnd; ++it) {
475 const QShaderKey &k(it.key());
476 writeShaderKey(&ds, k);
477 const QShaderCode &shader(dd->shaders.value(k));
478 ds << shader.shader();
479 ds << shader.entryPoint();
481 ds <<
int(dd->bindings.size());
482 for (
auto it = dd->bindings.cbegin(), itEnd = dd->bindings.cend(); it != itEnd; ++it) {
483 const QShaderKey &k(it.key());
484 writeShaderKey(&ds, k);
485 const NativeResourceBindingMap &map(it.value());
486 ds <<
int(map.size());
487 for (
auto mapIt = map.cbegin(), mapItEnd = map.cend(); mapIt != mapItEnd; ++mapIt) {
489 ds << mapIt.value().first;
490 ds << mapIt.value().second;
493 ds <<
int(dd->combinedImageMap.size());
494 for (
auto it = dd->combinedImageMap.cbegin(), itEnd = dd->combinedImageMap.cend(); it != itEnd; ++it) {
495 const QShaderKey &k(it.key());
496 writeShaderKey(&ds, k);
497 const SeparateToCombinedImageSamplerMappingList &list(it.value());
498 ds <<
int(list.size());
499 for (
auto listIt = list.cbegin(), listItEnd = list.cend(); listIt != listItEnd; ++listIt) {
500 ds << listIt->combinedSamplerName;
501 ds << listIt->textureBinding;
502 ds << listIt->samplerBinding;
505 if (qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
506 ds <<
int(dd->nativeShaderInfoMap.size());
507 for (
auto it = dd->nativeShaderInfoMap.cbegin(), itEnd = dd->nativeShaderInfoMap.cend(); it != itEnd; ++it) {
508 const QShaderKey &k(it.key());
509 writeShaderKey(&ds, k);
511 ds <<
int(it->extraBufferBindings.size());
512 for (
auto mapIt = it->extraBufferBindings.cbegin(), mapItEnd = it->extraBufferBindings.cend();
513 mapIt != mapItEnd; ++mapIt)
521 return qCompress(buf.buffer());
552QShader QShader::fromSerialized(
const QByteArray &data)
554 QByteArray udata = qUncompress(data);
556 QDataStream ds(&buf);
557 ds.setVersion(QDataStream::Qt_5_10);
558 if (!buf.open(QIODevice::ReadOnly))
563 QShaderPrivate *d = QShaderPrivate::get(&bs);
564 Q_ASSERT(d->ref.loadRelaxed() == 1);
567 d->qsbVersion = intVal;
568 if (d->qsbVersion != QShaderPrivate::QSB_VERSION
569 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_INPUT_OUTPUT_INTERFACE_BLOCKS
570 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO
571 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO
572 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS
573 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_VAR_ARRAYDIMS
574 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITH_CBOR
575 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITH_BINARY_JSON
576 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_BINDINGS)
578 qWarning(
"Attempted to deserialize QShader with unknown version %d.", d->qsbVersion);
583 d->stage = Stage(intVal);
584 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITH_CBOR) {
585 d->desc = QShaderDescription::deserialize(&ds, d->qsbVersion);
586 }
else if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITH_BINARY_JSON) {
587 qWarning(
"Can no longer load QShaderDescription from CBOR.");
588 d->desc = QShaderDescription();
590 qWarning(
"Can no longer load QShaderDescription from binary JSON.");
591 d->desc = QShaderDescription();
595 for (
int i = 0; i < count; ++i) {
597 readShaderKey(&ds, &k);
603 shader.setEntryPoint(s);
604 d->shaders[k] = shader;
607 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_BINDINGS) {
609 for (
int i = 0; i < count; ++i) {
611 readShaderKey(&ds, &k);
612 NativeResourceBindingMap map;
615 for (
int b = 0; b < mapSize; ++b) {
618 int firstNativeBinding;
619 ds >> firstNativeBinding;
620 int secondNativeBinding;
621 ds >> secondNativeBinding;
622 map.insert(binding, { firstNativeBinding, secondNativeBinding });
624 d->bindings.insert(k, map);
628 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS) {
630 for (
int i = 0; i < count; ++i) {
632 readShaderKey(&ds, &k);
633 SeparateToCombinedImageSamplerMappingList list;
636 for (
int b = 0; b < listSize; ++b) {
637 QByteArray combinedSamplerName;
638 ds >> combinedSamplerName;
640 ds >> textureBinding;
642 ds >> samplerBinding;
643 list.append({ combinedSamplerName, textureBinding, samplerBinding });
645 d->combinedImageMap.insert(k, list);
649 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
651 for (
int i = 0; i < count; ++i) {
653 readShaderKey(&ds, &k);
656 QMap<
int,
int> extraBufferBindings;
659 for (
int b = 0; b < mapSize; ++b) {
663 extraBufferBindings.insert(k, v);
665 d->nativeShaderInfoMap.insert(k, { flags, extraBufferBindings });
817 QtPrivate::QHashCombineWithSeed hash(seed);
818 seed = hash(seed, s.stage());
819 if (!s.d->shaders.isEmpty()) {
820 seed = hash(seed, s.d->shaders.firstKey());
821 seed = hash(seed, std::as_const(s.d->shaders).first());