461QByteArray QShader::serialized(SerializedFormatVersion version)
const
463 static QShaderPrivate sd;
464 QShaderPrivate *dd = d ? d : &sd;
467 QDataStream ds(&buf);
468 ds.setVersion(QDataStream::Qt_5_10);
469 if (!buf.open(QIODevice::WriteOnly))
472 const int qsbVersion = QShaderPrivate::qtQsbVersion(version);
475 ds <<
int(dd->stage);
476 dd->desc.serialize(&ds, qsbVersion);
477 ds <<
int(dd->shaders.size());
478 for (
auto it = dd->shaders.cbegin(), itEnd = dd->shaders.cend(); it != itEnd; ++it) {
479 const QShaderKey &k(it.key());
480 writeShaderKey(&ds, k);
481 const QShaderCode &shader(dd->shaders.value(k));
482 ds << shader.shader();
483 ds << shader.entryPoint();
485 ds <<
int(dd->bindings.size());
486 for (
auto it = dd->bindings.cbegin(), itEnd = dd->bindings.cend(); it != itEnd; ++it) {
487 const QShaderKey &k(it.key());
488 writeShaderKey(&ds, k);
489 const NativeResourceBindingMap &map(it.value());
490 ds <<
int(map.size());
491 for (
auto mapIt = map.cbegin(), mapItEnd = map.cend(); mapIt != mapItEnd; ++mapIt) {
493 ds << mapIt.value().first;
494 ds << mapIt.value().second;
497 ds <<
int(dd->combinedImageMap.size());
498 for (
auto it = dd->combinedImageMap.cbegin(), itEnd = dd->combinedImageMap.cend(); it != itEnd; ++it) {
499 const QShaderKey &k(it.key());
500 writeShaderKey(&ds, k);
501 const SeparateToCombinedImageSamplerMappingList &list(it.value());
502 ds <<
int(list.size());
503 for (
auto listIt = list.cbegin(), listItEnd = list.cend(); listIt != listItEnd; ++listIt) {
504 ds << listIt->combinedSamplerName;
505 ds << listIt->textureBinding;
506 ds << listIt->samplerBinding;
509 if (qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
510 ds <<
int(dd->nativeShaderInfoMap.size());
511 for (
auto it = dd->nativeShaderInfoMap.cbegin(), itEnd = dd->nativeShaderInfoMap.cend(); it != itEnd; ++it) {
512 const QShaderKey &k(it.key());
513 writeShaderKey(&ds, k);
515 ds <<
int(it->extraBufferBindings.size());
516 for (
auto mapIt = it->extraBufferBindings.cbegin(), mapItEnd = it->extraBufferBindings.cend();
517 mapIt != mapItEnd; ++mapIt)
525 return qCompress(buf.buffer());
586QShader QShader::fromSerialized(
const QByteArray &data)
588 QByteArray udata = qUncompress(data);
590 QDataStream ds(&buf);
591 ds.setVersion(QDataStream::Qt_5_10);
592 if (!buf.open(QIODevice::ReadOnly))
597 QShaderPrivate *d = QShaderPrivate::get(&bs);
598 Q_ASSERT(d->ref.loadRelaxed() == 1);
601 d->qsbVersion = intVal;
602 if (d->qsbVersion != QShaderPrivate::QSB_VERSION
603 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_INPUT_OUTPUT_INTERFACE_BLOCKS
604 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_EXTENDED_STORAGE_BUFFER_INFO
605 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO
606 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS
607 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_VAR_ARRAYDIMS
608 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITH_CBOR
609 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITH_BINARY_JSON
610 && d->qsbVersion != QShaderPrivate::QSB_VERSION_WITHOUT_BINDINGS)
612 qWarning(
"Attempted to deserialize QShader with unknown version %d.", d->qsbVersion);
617 d->stage = Stage(intVal);
618 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITH_CBOR) {
619 d->desc = QShaderDescription::deserialize(&ds, d->qsbVersion);
620 }
else if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITH_BINARY_JSON) {
621 qWarning(
"Can no longer load QShaderDescription from CBOR.");
622 d->desc = QShaderDescription();
624 qWarning(
"Can no longer load QShaderDescription from binary JSON.");
625 d->desc = QShaderDescription();
628 QShaderPrivate::readCount(&ds, &count);
629 for (
int i = 0; i < count; ++i) {
631 readShaderKey(&ds, &k);
637 shader.setEntryPoint(s);
638 d->shaders[k] = shader;
641 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_BINDINGS) {
642 QShaderPrivate::readCount(&ds, &count);
643 for (
int i = 0; i < count; ++i) {
645 readShaderKey(&ds, &k);
646 NativeResourceBindingMap map;
648 if (!QShaderPrivate::readCount(&ds, &mapSize))
650 for (
int b = 0; b < mapSize; ++b) {
653 int firstNativeBinding;
654 ds >> firstNativeBinding;
655 int secondNativeBinding;
656 ds >> secondNativeBinding;
657 map.insert(binding, { firstNativeBinding, secondNativeBinding });
659 d->bindings.insert(k, map);
663 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_SEPARATE_IMAGES_AND_SAMPLERS) {
664 QShaderPrivate::readCount(&ds, &count);
665 for (
int i = 0; i < count; ++i) {
667 readShaderKey(&ds, &k);
668 SeparateToCombinedImageSamplerMappingList list;
670 if (!QShaderPrivate::readCount(&ds, &listSize))
672 for (
int b = 0; b < listSize; ++b) {
673 QByteArray combinedSamplerName;
674 ds >> combinedSamplerName;
676 ds >> textureBinding;
678 ds >> samplerBinding;
679 list.append({ combinedSamplerName, textureBinding, samplerBinding });
681 d->combinedImageMap.insert(k, list);
685 if (d->qsbVersion > QShaderPrivate::QSB_VERSION_WITHOUT_NATIVE_SHADER_INFO) {
686 QShaderPrivate::readCount(&ds, &count);
687 for (
int i = 0; i < count; ++i) {
689 readShaderKey(&ds, &k);
692 QMap<
int,
int> extraBufferBindings;
694 if (!QShaderPrivate::readCount(&ds, &mapSize))
696 for (
int b = 0; b < mapSize; ++b) {
700 extraBufferBindings.insert(k, v);
702 d->nativeShaderInfoMap.insert(k, { flags, extraBufferBindings });
706 if (ds.status() != QDataStream::Ok) {
707 qWarning(
"Failed to deserialize QShader: QDataStream status %d.",
int(ds.status()));