17#include <QtGui/qtguiglobal.h>
18#include <QtCore/qsize.h>
19#include <QtCore/qlist.h>
20#include <QtCore/qvarlengtharray.h>
21#include <QtCore/qthread.h>
22#include <QtGui/qmatrix4x4.h>
23#include <QtGui/qcolor.h>
24#include <QtGui/qimage.h>
28#include <rhi/qshader.h>
34class QRhiImplementation;
36class QRhiRenderBuffer;
39class QRhiCommandBuffer;
40class QRhiResourceUpdateBatch;
43class QRhiShadingRateMap;
48 QRhiDepthStencilClearValue() =
default;
49 QRhiDepthStencilClearValue(
float d, quint32 s);
51 float depthClearValue()
const {
return m_d; }
52 void setDepthClearValue(
float d) { m_d = d; }
54 quint32 stencilClearValue()
const {
return m_s; }
55 void setStencilClearValue(quint32 s) { m_s = s; }
61 friend bool operator==(
const QRhiDepthStencilClearValue &a,
const QRhiDepthStencilClearValue &b)
noexcept
63 return a.m_d == b.m_d && a.m_s == b.m_s;
66 friend bool operator!=(
const QRhiDepthStencilClearValue &a,
const QRhiDepthStencilClearValue &b)
noexcept
71 friend size_t qHash(
const QRhiDepthStencilClearValue &v, size_t seed = 0)
noexcept
73 QtPrivate::QHashCombine hash(seed);
74 seed = hash(seed, v.m_d);
75 seed = hash(seed, v.m_s);
82#ifndef QT_NO_DEBUG_STREAM
83Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiDepthStencilClearValue &);
89 QRhiViewport() =
default;
90 QRhiViewport(
float x,
float y,
float w,
float h,
float minDepth = 0.0f,
float maxDepth = 1.0f);
92 std::array<
float, 4> viewport()
const {
return m_rect; }
93 void setViewport(
float x,
float y,
float w,
float h) {
94 m_rect[0] = x; m_rect[1] = y; m_rect[2] = w; m_rect[3] = h;
97 float minDepth()
const {
return m_minDepth; }
98 void setMinDepth(
float minDepth) { m_minDepth = minDepth; }
100 float maxDepth()
const {
return m_maxDepth; }
101 void setMaxDepth(
float maxDepth) { m_maxDepth = maxDepth; }
104 std::array<
float, 4> m_rect { { 0.0f, 0.0f, 0.0f, 0.0f } };
105 float m_minDepth = 0.0f;
106 float m_maxDepth = 1.0f;
108 friend bool operator==(
const QRhiViewport &a,
const QRhiViewport &b)
noexcept
110 return a.m_rect == b.m_rect
111 && a.m_minDepth == b.m_minDepth
112 && a.m_maxDepth == b.m_maxDepth;
115 friend bool operator!=(
const QRhiViewport &a,
const QRhiViewport &b)
noexcept
120 friend size_t qHash(
const QRhiViewport &v, size_t seed = 0)
noexcept
122 QtPrivate::QHashCombine hash(seed);
123 seed = hash(seed, v.m_rect[0]);
124 seed = hash(seed, v.m_rect[1]);
125 seed = hash(seed, v.m_rect[2]);
126 seed = hash(seed, v.m_rect[3]);
127 seed = hash(seed, v.m_minDepth);
128 seed = hash(seed, v.m_maxDepth);
135#ifndef QT_NO_DEBUG_STREAM
136Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiViewport &);
142 QRhiScissor() =
default;
143 QRhiScissor(
int x,
int y,
int w,
int h);
145 std::array<
int, 4> scissor()
const {
return m_rect; }
146 void setScissor(
int x,
int y,
int w,
int h) {
147 m_rect[0] = x; m_rect[1] = y; m_rect[2] = w; m_rect[3] = h;
151 std::array<
int, 4> m_rect { { 0, 0, 0, 0 } };
153 friend bool operator==(
const QRhiScissor &a,
const QRhiScissor &b)
noexcept
155 return a.m_rect == b.m_rect;
158 friend bool operator!=(
const QRhiScissor &a,
const QRhiScissor &b)
noexcept
163 friend size_t qHash(
const QRhiScissor &v, size_t seed = 0)
noexcept
165 QtPrivate::QHashCombine hash(seed);
166 seed = hash(seed, v.m_rect[0]);
167 seed = hash(seed, v.m_rect[1]);
168 seed = hash(seed, v.m_rect[2]);
169 seed = hash(seed, v.m_rect[3]);
176#ifndef QT_NO_DEBUG_STREAM
177Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiScissor &);
183 enum Classification {
188 QRhiVertexInputBinding() =
default;
189 QRhiVertexInputBinding(quint32 stride, Classification cls = PerVertex, quint32 stepRate = 1);
191 quint32 stride()
const {
return m_stride; }
192 void setStride(quint32 s) { m_stride = s; }
194 Classification classification()
const {
return m_classification; }
195 void setClassification(Classification c) { m_classification = c; }
197 quint32 instanceStepRate()
const {
return m_instanceStepRate; }
198 void setInstanceStepRate(quint32 rate) { m_instanceStepRate = rate; }
201 quint32 m_stride = 0;
202 Classification m_classification = PerVertex;
203 quint32 m_instanceStepRate = 1;
205 friend bool operator==(
const QRhiVertexInputBinding &a,
const QRhiVertexInputBinding &b)
noexcept
207 return a.m_stride == b.m_stride
208 && a.m_classification == b.m_classification
209 && a.m_instanceStepRate == b.m_instanceStepRate;
212 friend bool operator!=(
const QRhiVertexInputBinding &a,
const QRhiVertexInputBinding &b)
noexcept
217 friend size_t qHash(
const QRhiVertexInputBinding &v, size_t seed = 0)
noexcept
219 QtPrivate::QHashCombine hash(seed);
220 seed = hash(seed, v.m_stride);
221 seed = hash(seed, v.m_classification);
222 seed = hash(seed, v.m_instanceStepRate);
229#ifndef QT_NO_DEBUG_STREAM
230Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiVertexInputBinding &);
266 QRhiVertexInputAttribute() =
default;
267 QRhiVertexInputAttribute(
int binding,
int location, Format format, quint32 offset,
int matrixSlice = -1);
269 int binding()
const {
return m_binding; }
270 void setBinding(
int b) { m_binding = b; }
272 int location()
const {
return m_location; }
273 void setLocation(
int loc) { m_location = loc; }
275 Format format()
const {
return m_format; }
276 void setFormat(Format f) { m_format = f; }
278 quint32 offset()
const {
return m_offset; }
279 void setOffset(quint32 ofs) { m_offset = ofs; }
281 int matrixSlice()
const {
return m_matrixSlice; }
282 void setMatrixSlice(
int slice) { m_matrixSlice = slice; }
287 Format m_format = Float4;
288 quint32 m_offset = 0;
289 int m_matrixSlice = -1;
291 friend bool operator==(
const QRhiVertexInputAttribute &a,
const QRhiVertexInputAttribute &b)
noexcept
293 return a.m_binding == b.m_binding
294 && a.m_location == b.m_location
295 && a.m_format == b.m_format
296 && a.m_offset == b.m_offset;
300 friend bool operator!=(
const QRhiVertexInputAttribute &a,
const QRhiVertexInputAttribute &b)
noexcept
305 friend size_t qHash(
const QRhiVertexInputAttribute &v, size_t seed = 0)
noexcept
307 QtPrivate::QHashCombine hash(seed);
308 seed = hash(seed, v.m_binding);
309 seed = hash(seed, v.m_location);
310 seed = hash(seed, v.m_format);
311 seed = hash(seed, v.m_offset);
318#ifndef QT_NO_DEBUG_STREAM
319Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiVertexInputAttribute &);
325 QRhiVertexInputLayout() =
default;
327 void setBindings(std::initializer_list<QRhiVertexInputBinding> list) { m_bindings = list; }
328 template<
typename InputIterator>
329 void setBindings(InputIterator first, InputIterator last)
332 std::copy(first, last, std::back_inserter(m_bindings));
334 const QRhiVertexInputBinding *cbeginBindings()
const {
return m_bindings.cbegin(); }
335 const QRhiVertexInputBinding *cendBindings()
const {
return m_bindings.cend(); }
336 const QRhiVertexInputBinding *bindingAt(qsizetype index)
const {
return &m_bindings.at(index); }
337 qsizetype bindingCount()
const {
return m_bindings.count(); }
339 void setAttributes(std::initializer_list<QRhiVertexInputAttribute> list) { m_attributes = list; }
340 template<
typename InputIterator>
341 void setAttributes(InputIterator first, InputIterator last)
343 m_attributes.clear();
344 std::copy(first, last, std::back_inserter(m_attributes));
346 const QRhiVertexInputAttribute *cbeginAttributes()
const {
return m_attributes.cbegin(); }
347 const QRhiVertexInputAttribute *cendAttributes()
const {
return m_attributes.cend(); }
348 const QRhiVertexInputAttribute *attributeAt(qsizetype index)
const {
return &m_attributes.at(index); }
349 qsizetype attributeCount()
const {
return m_attributes.count(); }
352 QVarLengthArray<QRhiVertexInputBinding, 8> m_bindings;
353 QVarLengthArray<QRhiVertexInputAttribute, 8> m_attributes;
355 friend bool operator==(
const QRhiVertexInputLayout &a,
const QRhiVertexInputLayout &b)
noexcept
357 return a.m_bindings == b.m_bindings && a.m_attributes == b.m_attributes;
360 friend bool operator!=(
const QRhiVertexInputLayout &a,
const QRhiVertexInputLayout &b)
noexcept
365 friend size_t qHash(
const QRhiVertexInputLayout &v, size_t seed = 0)
noexcept
367 QtPrivate::QHashCombine hash(seed);
368 seed = hash(seed, v.m_bindings);
369 seed = hash(seed, v.m_attributes);
373 friend Q_GUI_EXPORT QDebug operator<<(QDebug,
const QRhiVertexInputLayout &);
376#ifndef QT_NO_DEBUG_STREAM
377Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiVertexInputLayout &);
386 TessellationEvaluation,
392 QRhiShaderStage() =
default;
393 QRhiShaderStage(Type type,
const QShader &shader,
394 QShader::Variant v = QShader::StandardShader);
396 Type type()
const {
return m_type; }
397 void setType(Type t) { m_type = t; }
399 QShader shader()
const {
return m_shader; }
400 void setShader(
const QShader &s) { m_shader = s; }
402 QShader::Variant shaderVariant()
const {
return m_shaderVariant; }
403 void setShaderVariant(QShader::Variant v) { m_shaderVariant = v; }
406 Type m_type = Vertex;
408 QShader::Variant m_shaderVariant = QShader::StandardShader;
410 friend bool operator==(
const QRhiShaderStage &a,
const QRhiShaderStage &b)
noexcept
412 return a.m_type == b.m_type
413 && a.m_shader == b.m_shader
414 && a.m_shaderVariant == b.m_shaderVariant;
417 friend bool operator!=(
const QRhiShaderStage &a,
const QRhiShaderStage &b)
noexcept
422 friend size_t qHash(
const QRhiShaderStage &v, size_t seed = 0)
noexcept
424 QtPrivate::QHashCombine hash(seed);
425 seed = hash(seed, v.m_type);
426 seed = hash(seed, v.m_shader);
427 seed = hash(seed, v.m_shaderVariant);
434#ifndef QT_NO_DEBUG_STREAM
435Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiShaderStage &);
438using QRhiGraphicsShaderStage = QRhiShaderStage;
457 VertexStage = 1 << 0,
458 TessellationControlStage = 1 << 1,
459 TessellationEvaluationStage = 1 << 2,
460 GeometryStage = 1 << 3,
461 FragmentStage = 1 << 4,
462 ComputeStage = 1 << 5
464 Q_DECLARE_FLAGS(StageFlags, StageFlag)
466 QRhiShaderResourceBinding() =
default;
468 bool isLayoutCompatible(
const QRhiShaderResourceBinding &other)
const;
470 static QRhiShaderResourceBinding uniformBuffer(
int binding, StageFlags stage, QRhiBuffer *buf);
471 static QRhiShaderResourceBinding uniformBuffer(
int binding, StageFlags stage, QRhiBuffer *buf, quint32 offset, quint32 size);
472 static QRhiShaderResourceBinding uniformBufferWithDynamicOffset(
int binding, StageFlags stage, QRhiBuffer *buf, quint32 size);
474 static QRhiShaderResourceBinding sampledTexture(
int binding, StageFlags stage, QRhiTexture *tex, QRhiSampler *sampler);
476 struct TextureAndSampler {
478 QRhiSampler *sampler;
480 static QRhiShaderResourceBinding sampledTextures(
int binding, StageFlags stage,
int count,
const TextureAndSampler *texSamplers);
482 static QRhiShaderResourceBinding texture(
int binding, StageFlags stage, QRhiTexture *tex);
483 static QRhiShaderResourceBinding textures(
int binding, StageFlags stage,
int count, QRhiTexture **tex);
484 static QRhiShaderResourceBinding sampler(
int binding, StageFlags stage, QRhiSampler *sampler);
486 static QRhiShaderResourceBinding imageLoad(
int binding, StageFlags stage, QRhiTexture *tex,
int level);
487 static QRhiShaderResourceBinding imageStore(
int binding, StageFlags stage, QRhiTexture *tex,
int level);
488 static QRhiShaderResourceBinding imageLoadStore(
int binding, StageFlags stage, QRhiTexture *tex,
int level);
490 static QRhiShaderResourceBinding bufferLoad(
int binding, StageFlags stage, QRhiBuffer *buf);
491 static QRhiShaderResourceBinding bufferLoad(
int binding, StageFlags stage, QRhiBuffer *buf, quint32 offset, quint32 size);
492 static QRhiShaderResourceBinding bufferStore(
int binding, StageFlags stage, QRhiBuffer *buf);
493 static QRhiShaderResourceBinding bufferStore(
int binding, StageFlags stage, QRhiBuffer *buf, quint32 offset, quint32 size);
494 static QRhiShaderResourceBinding bufferLoadStore(
int binding, StageFlags stage, QRhiBuffer *buf);
495 static QRhiShaderResourceBinding bufferLoadStore(
int binding, StageFlags stage, QRhiBuffer *buf, quint32 offset, quint32 size);
500 QRhiShaderResourceBinding::StageFlags stage;
501 QRhiShaderResourceBinding::Type type;
502 struct UniformBufferData {
506 bool hasDynamicOffset;
508 static constexpr int MAX_TEX_SAMPLER_ARRAY_SIZE = 16;
509 struct TextureAndOrSamplerData {
511 TextureAndSampler texSamplers[MAX_TEX_SAMPLER_ARRAY_SIZE];
513 struct StorageImageData {
517 struct StorageBufferData {
523 UniformBufferData ubuf;
524 TextureAndOrSamplerData stex;
525 StorageImageData simage;
526 StorageBufferData sbuf;
529 int arraySize()
const
531 return type == QRhiShaderResourceBinding::SampledTexture || type == QRhiShaderResourceBinding::Texture
536 template<
typename Output>
537 Output serialize(Output dst)
const
540 *dst++ = quint32(binding);
541 *dst++ = quint32(stage);
542 *dst++ = quint32(type);
543 *dst++ = quint32(arraySize());
548 static constexpr int LAYOUT_DESC_ENTRIES_PER_BINDING = 4;
550 template<
typename Output>
551 static void serializeLayoutDescription(
const QRhiShaderResourceBinding *first,
552 const QRhiShaderResourceBinding *last,
555 while (first != last) {
556 dst = first->d.serialize(dst);
563 friend class QRhiImplementation;
566Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiShaderResourceBinding::StageFlags)
568Q_DECLARE_TYPEINFO(QRhiShaderResourceBinding, Q_PRIMITIVE_TYPE);
570Q_GUI_EXPORT
bool operator==(
const QRhiShaderResourceBinding &a,
const QRhiShaderResourceBinding &b)
noexcept;
571Q_GUI_EXPORT
bool operator!=(
const QRhiShaderResourceBinding &a,
const QRhiShaderResourceBinding &b)
noexcept;
572Q_GUI_EXPORT size_t qHash(
const QRhiShaderResourceBinding &b, size_t seed = 0)
noexcept;
573#ifndef QT_NO_DEBUG_STREAM
574Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiShaderResourceBinding &);
580 QRhiColorAttachment() =
default;
581 QRhiColorAttachment(QRhiTexture *texture);
582 QRhiColorAttachment(QRhiRenderBuffer *renderBuffer);
584 QRhiTexture *texture()
const {
return m_texture; }
585 void setTexture(QRhiTexture *tex) { m_texture = tex; }
587 QRhiRenderBuffer *renderBuffer()
const {
return m_renderBuffer; }
588 void setRenderBuffer(QRhiRenderBuffer *rb) { m_renderBuffer = rb; }
590 int layer()
const {
return m_layer; }
591 void setLayer(
int layer) { m_layer = layer; }
593 int level()
const {
return m_level; }
594 void setLevel(
int level) { m_level = level; }
596 QRhiTexture *resolveTexture()
const {
return m_resolveTexture; }
597 void setResolveTexture(QRhiTexture *tex) { m_resolveTexture = tex; }
599 int resolveLayer()
const {
return m_resolveLayer; }
600 void setResolveLayer(
int layer) { m_resolveLayer = layer; }
602 int resolveLevel()
const {
return m_resolveLevel; }
603 void setResolveLevel(
int level) { m_resolveLevel = level; }
605 int multiViewCount()
const {
return m_multiViewCount; }
606 void setMultiViewCount(
int count) { m_multiViewCount = count; }
609 QRhiTexture *m_texture =
nullptr;
610 QRhiRenderBuffer *m_renderBuffer =
nullptr;
613 QRhiTexture *m_resolveTexture =
nullptr;
614 int m_resolveLayer = 0;
615 int m_resolveLevel = 0;
616 int m_multiViewCount = 0;
624 QRhiTextureRenderTargetDescription() =
default;
625 QRhiTextureRenderTargetDescription(
const QRhiColorAttachment &colorAttachment);
626 QRhiTextureRenderTargetDescription(
const QRhiColorAttachment &colorAttachment, QRhiRenderBuffer *depthStencilBuffer);
627 QRhiTextureRenderTargetDescription(
const QRhiColorAttachment &colorAttachment, QRhiTexture *depthTexture);
629 void setColorAttachments(std::initializer_list<QRhiColorAttachment> list) { m_colorAttachments = list; }
630 template<
typename InputIterator>
631 void setColorAttachments(InputIterator first, InputIterator last)
633 m_colorAttachments.clear();
634 std::copy(first, last, std::back_inserter(m_colorAttachments));
636 const QRhiColorAttachment *cbeginColorAttachments()
const {
return m_colorAttachments.cbegin(); }
637 const QRhiColorAttachment *cendColorAttachments()
const {
return m_colorAttachments.cend(); }
638 const QRhiColorAttachment *colorAttachmentAt(qsizetype index)
const {
return &m_colorAttachments.at(index); }
639 qsizetype colorAttachmentCount()
const {
return m_colorAttachments.count(); }
641 QRhiRenderBuffer *depthStencilBuffer()
const {
return m_depthStencilBuffer; }
642 void setDepthStencilBuffer(QRhiRenderBuffer *renderBuffer) { m_depthStencilBuffer = renderBuffer; }
644 QRhiTexture *depthTexture()
const {
return m_depthTexture; }
645 void setDepthTexture(QRhiTexture *texture) { m_depthTexture = texture; }
647 QRhiTexture *depthResolveTexture()
const {
return m_depthResolveTexture; }
648 void setDepthResolveTexture(QRhiTexture *tex) { m_depthResolveTexture = tex; }
650 QRhiShadingRateMap *shadingRateMap()
const {
return m_shadingRateMap; }
651 void setShadingRateMap(QRhiShadingRateMap *map) { m_shadingRateMap = map; }
654 QVarLengthArray<QRhiColorAttachment, 8> m_colorAttachments;
655 QRhiRenderBuffer *m_depthStencilBuffer =
nullptr;
656 QRhiTexture *m_depthTexture =
nullptr;
657 QRhiTexture *m_depthResolveTexture =
nullptr;
658 QRhiShadingRateMap *m_shadingRateMap =
nullptr;
664 QRhiTextureSubresourceUploadDescription() =
default;
665 explicit QRhiTextureSubresourceUploadDescription(
const QImage &image);
666 QRhiTextureSubresourceUploadDescription(
const void *data, quint32 size);
667 explicit QRhiTextureSubresourceUploadDescription(
const QByteArray &data);
669 QImage image()
const {
return m_image; }
670 void setImage(
const QImage &image) { m_image = image; }
672 QByteArray data()
const {
return m_data; }
673 void setData(
const QByteArray &data) { m_data = data; }
675 quint32 dataStride()
const {
return m_dataStride; }
676 void setDataStride(quint32 stride) { m_dataStride = stride; }
678 QPoint destinationTopLeft()
const {
return m_destinationTopLeft; }
679 void setDestinationTopLeft(
const QPoint &p) { m_destinationTopLeft = p; }
681 QSize sourceSize()
const {
return m_sourceSize; }
682 void setSourceSize(
const QSize &size) { m_sourceSize = size; }
684 QPoint sourceTopLeft()
const {
return m_sourceTopLeft; }
685 void setSourceTopLeft(
const QPoint &p) { m_sourceTopLeft = p; }
690 quint32 m_dataStride = 0;
691 QPoint m_destinationTopLeft;
693 QPoint m_sourceTopLeft;
701 QRhiTextureUploadEntry() =
default;
702 QRhiTextureUploadEntry(
int layer,
int level,
const QRhiTextureSubresourceUploadDescription &desc);
704 int layer()
const {
return m_layer; }
705 void setLayer(
int layer) { m_layer = layer; }
707 int level()
const {
return m_level; }
708 void setLevel(
int level) { m_level = level; }
710 QRhiTextureSubresourceUploadDescription description()
const {
return m_desc; }
711 void setDescription(
const QRhiTextureSubresourceUploadDescription &desc) { m_desc = desc; }
716 QRhiTextureSubresourceUploadDescription m_desc;
724 QRhiTextureUploadDescription() =
default;
725 QRhiTextureUploadDescription(
const QRhiTextureUploadEntry &entry);
726 QRhiTextureUploadDescription(std::initializer_list<QRhiTextureUploadEntry> list);
728 void setEntries(std::initializer_list<QRhiTextureUploadEntry> list) { m_entries = list; }
729 template<
typename InputIterator>
730 void setEntries(InputIterator first, InputIterator last)
733 std::copy(first, last, std::back_inserter(m_entries));
735 const QRhiTextureUploadEntry *cbeginEntries()
const {
return m_entries.cbegin(); }
736 const QRhiTextureUploadEntry *cendEntries()
const {
return m_entries.cend(); }
737 const QRhiTextureUploadEntry *entryAt(qsizetype index)
const {
return &m_entries.at(index); }
738 qsizetype entryCount()
const {
return m_entries.count(); }
741 QVarLengthArray<QRhiTextureUploadEntry, 16> m_entries;
747 QRhiTextureCopyDescription() =
default;
749 QSize pixelSize()
const {
return m_pixelSize; }
750 void setPixelSize(
const QSize &sz) { m_pixelSize = sz; }
752 int sourceLayer()
const {
return m_sourceLayer; }
753 void setSourceLayer(
int layer) { m_sourceLayer = layer; }
755 int sourceLevel()
const {
return m_sourceLevel; }
756 void setSourceLevel(
int level) { m_sourceLevel = level; }
758 QPoint sourceTopLeft()
const {
return m_sourceTopLeft; }
759 void setSourceTopLeft(
const QPoint &p) { m_sourceTopLeft = p; }
761 int destinationLayer()
const {
return m_destinationLayer; }
762 void setDestinationLayer(
int layer) { m_destinationLayer = layer; }
764 int destinationLevel()
const {
return m_destinationLevel; }
765 void setDestinationLevel(
int level) { m_destinationLevel = level; }
767 QPoint destinationTopLeft()
const {
return m_destinationTopLeft; }
768 void setDestinationTopLeft(
const QPoint &p) { m_destinationTopLeft = p; }
772 int m_sourceLayer = 0;
773 int m_sourceLevel = 0;
774 QPoint m_sourceTopLeft;
775 int m_destinationLayer = 0;
776 int m_destinationLevel = 0;
777 QPoint m_destinationTopLeft;
785 QRhiReadbackDescription() =
default;
786 QRhiReadbackDescription(QRhiTexture *texture);
788 QRhiTexture *texture()
const {
return m_texture; }
789 void setTexture(QRhiTexture *tex) { m_texture = tex; }
791 int layer()
const {
return m_layer; }
792 void setLayer(
int layer) { m_layer = layer; }
794 int level()
const {
return m_level; }
795 void setLevel(
int level) { m_level = level; }
797 QRect rect()
const {
return m_rect; }
798 void setRect(
const QRect &rectangle) { m_rect = rectangle; }
801 QRhiTexture *m_texture =
nullptr;
821 RenderPassDescriptor,
822 SwapChainRenderTarget,
824 ShaderResourceBindings,
832 virtual ~QRhiResource();
834 virtual Type resourceType()
const = 0;
836 virtual void destroy() = 0;
840 QByteArray name()
const;
841 void setName(
const QByteArray &name);
843 quint64 globalResourceId()
const;
848 QRhiResource(QRhiImplementation *rhi);
849 Q_DISABLE_COPY(QRhiResource)
850 friend class QRhiImplementation;
851 QRhiImplementation *m_rhi =
nullptr;
853 QByteArray m_objectName;
866 VertexBuffer = 1 << 0,
867 IndexBuffer = 1 << 1,
868 UniformBuffer = 1 << 2,
869 StorageBuffer = 1 << 3
871 Q_DECLARE_FLAGS(UsageFlags, UsageFlag)
873 struct NativeBuffer {
874 const void *objects[3];
878 QRhiResource::Type resourceType()
const override;
880 Type type()
const {
return m_type; }
881 void setType(Type t) { m_type = t; }
883 UsageFlags usage()
const {
return m_usage; }
884 void setUsage(UsageFlags u) { m_usage = u; }
886 quint32 size()
const {
return m_size; }
887 void setSize(quint32 sz) { m_size = sz; }
889 virtual bool create() = 0;
891 virtual NativeBuffer nativeBuffer();
893 virtual char *beginFullDynamicBufferUpdateForCurrentFrame();
894 virtual void endFullDynamicBufferUpdateForCurrentFrame();
895 virtual void fullDynamicBufferUpdateForCurrentFrame(
const void *data, quint32 size = 0);
898 QRhiBuffer(QRhiImplementation *rhi, Type type_, UsageFlags usage_, quint32 size_);
904Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiBuffer::UsageFlags)
906class Q_GUI_EXPORT QRhiTexture :
public QRhiResource
910 RenderTarget = 1 << 0,
914 UsedAsTransferSource = 1 << 5,
915 UsedWithGenerateMips = 1 << 6,
916 UsedWithLoadStore = 1 << 7,
917 UsedAsCompressedAtlas = 1 << 8,
918 ExternalOES = 1 << 9,
919 ThreeDimensional = 1 << 10,
920 TextureRectangleGL = 1 << 11,
921 TextureArray = 1 << 12,
922 OneDimensional = 1 << 13,
923 UsedAsShadingRateMap = 1 << 14
925 Q_DECLARE_FLAGS(Flags, Flag)
989 struct NativeTexture {
994 QRhiResource::Type resourceType()
const override;
996 Format format()
const {
return m_format; }
997 void setFormat(Format fmt) { m_format = fmt; }
999 QSize pixelSize()
const {
return m_pixelSize; }
1000 void setPixelSize(
const QSize &sz) { m_pixelSize = sz; }
1002 int depth()
const {
return m_depth; }
1003 void setDepth(
int depth) { m_depth = depth; }
1005 int arraySize()
const {
return m_arraySize; }
1006 void setArraySize(
int arraySize) { m_arraySize = arraySize; }
1008 int arrayRangeStart()
const {
return m_arrayRangeStart; }
1009 int arrayRangeLength()
const {
return m_arrayRangeLength; }
1010 void setArrayRange(
int startIndex,
int count)
1012 m_arrayRangeStart = startIndex;
1013 m_arrayRangeLength = count;
1016 Flags flags()
const {
return m_flags; }
1017 void setFlags(Flags f) { m_flags = f; }
1019 int sampleCount()
const {
return m_sampleCount; }
1020 void setSampleCount(
int s) { m_sampleCount = s; }
1023 QRhiTexture::Format format;
1026 ViewFormat readViewFormat()
const {
return m_readViewFormat; }
1027 void setReadViewFormat(
const ViewFormat &fmt) { m_readViewFormat = fmt; }
1028 ViewFormat writeViewFormat()
const {
return m_writeViewFormat; }
1029 void setWriteViewFormat(
const ViewFormat &fmt) { m_writeViewFormat = fmt; }
1031 virtual bool create() = 0;
1032 virtual NativeTexture nativeTexture();
1033 virtual bool createFrom(NativeTexture src);
1034 virtual void setNativeLayout(
int layout);
1037 QRhiTexture(QRhiImplementation *rhi, Format format_,
const QSize &pixelSize_,
int depth_,
1038 int arraySize_,
int sampleCount_, Flags flags_);
1045 int m_arrayRangeStart = -1;
1046 int m_arrayRangeLength = -1;
1047 ViewFormat m_readViewFormat = { UnknownFormat,
false };
1048 ViewFormat m_writeViewFormat = { UnknownFormat,
false };
1051Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiTexture::Flags)
1053class Q_GUI_EXPORT QRhiSampler :
public QRhiResource
1079 QRhiResource::Type resourceType()
const override;
1081 Filter magFilter()
const {
return m_magFilter; }
1082 void setMagFilter(Filter f) { m_magFilter = f; }
1084 Filter minFilter()
const {
return m_minFilter; }
1085 void setMinFilter(Filter f) { m_minFilter = f; }
1087 Filter mipmapMode()
const {
return m_mipmapMode; }
1088 void setMipmapMode(Filter f) { m_mipmapMode = f; }
1090 AddressMode addressU()
const {
return m_addressU; }
1091 void setAddressU(AddressMode mode) { m_addressU = mode; }
1093 AddressMode addressV()
const {
return m_addressV; }
1094 void setAddressV(AddressMode mode) { m_addressV = mode; }
1096 AddressMode addressW()
const {
return m_addressW; }
1097 void setAddressW(AddressMode mode) { m_addressW = mode; }
1099 CompareOp textureCompareOp()
const {
return m_compareOp; }
1100 void setTextureCompareOp(CompareOp op) { m_compareOp = op; }
1102 virtual bool create() = 0;
1105 QRhiSampler(QRhiImplementation *rhi,
1106 Filter magFilter_, Filter minFilter_, Filter mipmapMode_,
1107 AddressMode u_, AddressMode v_, AddressMode w_);
1110 Filter m_mipmapMode;
1111 AddressMode m_addressU;
1112 AddressMode m_addressV;
1113 AddressMode m_addressW;
1114 CompareOp m_compareOp;
1126 UsedWithSwapChainOnly = 1 << 0
1128 Q_DECLARE_FLAGS(Flags, Flag)
1130 struct NativeRenderBuffer {
1134 QRhiResource::Type resourceType()
const override;
1136 Type type()
const {
return m_type; }
1137 void setType(Type t) { m_type = t; }
1139 QSize pixelSize()
const {
return m_pixelSize; }
1140 void setPixelSize(
const QSize &sz) { m_pixelSize = sz; }
1142 int sampleCount()
const {
return m_sampleCount; }
1143 void setSampleCount(
int s) { m_sampleCount = s; }
1145 Flags flags()
const {
return m_flags; }
1146 void setFlags(Flags f) { m_flags = f; }
1148 virtual bool create() = 0;
1149 virtual bool createFrom(NativeRenderBuffer src);
1151 virtual QRhiTexture::Format backingFormat()
const = 0;
1154 QRhiRenderBuffer(QRhiImplementation *rhi, Type type_,
const QSize &pixelSize_,
1155 int sampleCount_, Flags flags_, QRhiTexture::Format backingFormatHint_);
1160 QRhiTexture::Format m_backingFormatHint;
1163Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiRenderBuffer::Flags)
1165class Q_GUI_EXPORT QRhiShadingRateMap :
public QRhiResource
1168 struct NativeShadingRateMap {
1172 QRhiResource::Type resourceType()
const override;
1174 virtual bool createFrom(NativeShadingRateMap src);
1175 virtual bool createFrom(QRhiTexture *src);
1178 QRhiShadingRateMap(QRhiImplementation *rhi);
1184 QRhiResource::Type resourceType()
const override;
1186 virtual bool isCompatible(
const QRhiRenderPassDescriptor *other)
const = 0;
1187 virtual const QRhiNativeHandles *nativeHandles();
1189 virtual QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor()
const = 0;
1191 virtual QVector<quint32> serializedFormat()
const = 0;
1194 QRhiRenderPassDescriptor(QRhiImplementation *rhi);
1200 virtual QSize pixelSize()
const = 0;
1201 virtual float devicePixelRatio()
const = 0;
1202 virtual int sampleCount()
const = 0;
1204 QRhiRenderPassDescriptor *renderPassDescriptor()
const {
return m_renderPassDesc; }
1205 void setRenderPassDescriptor(QRhiRenderPassDescriptor *desc) { m_renderPassDesc = desc; }
1208 QRhiRenderTarget(QRhiImplementation *rhi);
1209 QRhiRenderPassDescriptor *m_renderPassDesc =
nullptr;
1215 QRhiResource::Type resourceType()
const override;
1216 QRhiSwapChain *swapChain()
const {
return m_swapchain; }
1219 QRhiSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain_);
1220 QRhiSwapChain *m_swapchain;
1227 PreserveColorContents = 1 << 0,
1228 PreserveDepthStencilContents = 1 << 1,
1229 DoNotStoreDepthStencilContents = 1 << 2
1231 Q_DECLARE_FLAGS(Flags, Flag)
1233 QRhiResource::Type resourceType()
const override;
1235 QRhiTextureRenderTargetDescription description()
const {
return m_desc; }
1236 void setDescription(
const QRhiTextureRenderTargetDescription &desc) { m_desc = desc; }
1238 Flags flags()
const {
return m_flags; }
1239 void setFlags(Flags f) { m_flags = f; }
1241 virtual QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() = 0;
1243 virtual bool create() = 0;
1246 QRhiTextureRenderTarget(QRhiImplementation *rhi,
const QRhiTextureRenderTargetDescription &desc_, Flags flags_);
1247 QRhiTextureRenderTargetDescription m_desc;
1251Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiTextureRenderTarget::Flags)
1253class Q_GUI_EXPORT QRhiShaderResourceBindings :
public QRhiResource
1256 QRhiResource::Type resourceType()
const override;
1258 void setBindings(std::initializer_list<QRhiShaderResourceBinding> list) { m_bindings = list; }
1259 template<
typename InputIterator>
1260 void setBindings(InputIterator first, InputIterator last)
1263 std::copy(first, last, std::back_inserter(m_bindings));
1265 const QRhiShaderResourceBinding *cbeginBindings()
const {
return m_bindings.cbegin(); }
1266 const QRhiShaderResourceBinding *cendBindings()
const {
return m_bindings.cend(); }
1267 const QRhiShaderResourceBinding *bindingAt(qsizetype index)
const {
return &m_bindings.at(index); }
1268 qsizetype bindingCount()
const {
return m_bindings.count(); }
1270 bool isLayoutCompatible(
const QRhiShaderResourceBindings *other)
const;
1272 QVector<quint32> serializedLayoutDescription()
const {
return m_layoutDesc; }
1274 virtual bool create() = 0;
1277 BindingsAreSorted = 0x01
1279 Q_DECLARE_FLAGS(UpdateFlags, UpdateFlag)
1281 virtual void updateResources(UpdateFlags flags = {}) = 0;
1284 static constexpr int BINDING_PREALLOC = 12;
1285 QRhiShaderResourceBindings(QRhiImplementation *rhi);
1286 QVarLengthArray<QRhiShaderResourceBinding, BINDING_PREALLOC> m_bindings;
1287 size_t m_layoutDescHash = 0;
1291 QVector<quint32> m_layoutDesc;
1292 friend class QRhiImplementation;
1293#ifndef QT_NO_DEBUG_STREAM
1294 friend Q_GUI_EXPORT QDebug operator<<(QDebug,
const QRhiShaderResourceBindings &);
1298Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiShaderResourceBindings::UpdateFlags)
1300#ifndef QT_NO_DEBUG_STREAM
1301Q_GUI_EXPORT QDebug operator<<(QDebug,
const QRhiShaderResourceBindings &);
1307using QRhiShaderResourceBindingSet = QRhiShaderResourceBindings;
1313 UsesBlendConstants = 1 << 0,
1314 UsesStencilRef = 1 << 1,
1315 UsesScissor = 1 << 2,
1316 CompileShadersWithDebugInfo = 1 << 3,
1317 UsesShadingRate = 1 << 4
1319 Q_DECLARE_FLAGS(Flags, Flag)
1342 enum ColorMaskComponent {
1348 Q_DECLARE_FLAGS(ColorMask, ColorMaskComponent)
1362 OneMinusConstantColor,
1364 OneMinusConstantAlpha,
1380 struct TargetBlend {
1381 ColorMask colorWrite = ColorMask(0xF);
1382 bool enable =
false;
1383 BlendFactor srcColor = One;
1384 BlendFactor dstColor = OneMinusSrcAlpha;
1385 BlendOp opColor = Add;
1386 BlendFactor srcAlpha = One;
1387 BlendFactor dstAlpha = OneMinusSrcAlpha;
1388 BlendOp opAlpha = Add;
1413 struct StencilOpState {
1414 StencilOp failOp = Keep;
1415 StencilOp depthFailOp = Keep;
1416 StencilOp passOp = Keep;
1417 CompareOp compareOp = Always;
1425 QRhiResource::Type resourceType()
const override;
1427 Flags flags()
const {
return m_flags; }
1428 void setFlags(Flags f) { m_flags = f; }
1430 Topology topology()
const {
return m_topology; }
1431 void setTopology(Topology t) { m_topology = t; }
1433 CullMode cullMode()
const {
return m_cullMode; }
1434 void setCullMode(CullMode mode) { m_cullMode = mode; }
1436 FrontFace frontFace()
const {
return m_frontFace; }
1437 void setFrontFace(FrontFace f) { m_frontFace = f; }
1439 void setTargetBlends(std::initializer_list<TargetBlend> list) { m_targetBlends = list; }
1440 template<
typename InputIterator>
1441 void setTargetBlends(InputIterator first, InputIterator last)
1443 m_targetBlends.clear();
1444 std::copy(first, last, std::back_inserter(m_targetBlends));
1446 const TargetBlend *cbeginTargetBlends()
const {
return m_targetBlends.cbegin(); }
1447 const TargetBlend *cendTargetBlends()
const {
return m_targetBlends.cend(); }
1448 const TargetBlend *targetBlendAt(qsizetype index)
const {
return &m_targetBlends.at(index); }
1449 qsizetype targetBlendCount()
const {
return m_targetBlends.count(); }
1451 bool hasDepthTest()
const {
return m_depthTest; }
1452 void setDepthTest(
bool enable) { m_depthTest = enable; }
1454 bool hasDepthWrite()
const {
return m_depthWrite; }
1455 void setDepthWrite(
bool enable) { m_depthWrite = enable; }
1457 bool hasDepthClamp()
const {
return m_depthClamp; }
1458 void setDepthClamp(
bool enable) { m_depthClamp = enable; }
1460 CompareOp depthOp()
const {
return m_depthOp; }
1461 void setDepthOp(CompareOp op) { m_depthOp = op; }
1463 bool hasStencilTest()
const {
return m_stencilTest; }
1464 void setStencilTest(
bool enable) { m_stencilTest = enable; }
1466 StencilOpState stencilFront()
const {
return m_stencilFront; }
1467 void setStencilFront(
const StencilOpState &state) { m_stencilFront = state; }
1469 StencilOpState stencilBack()
const {
return m_stencilBack; }
1470 void setStencilBack(
const StencilOpState &state) { m_stencilBack = state; }
1472 quint32 stencilReadMask()
const {
return m_stencilReadMask; }
1473 void setStencilReadMask(quint32 mask) { m_stencilReadMask = mask; }
1475 quint32 stencilWriteMask()
const {
return m_stencilWriteMask; }
1476 void setStencilWriteMask(quint32 mask) { m_stencilWriteMask = mask; }
1478 int sampleCount()
const {
return m_sampleCount; }
1479 void setSampleCount(
int s) { m_sampleCount = s; }
1481 float lineWidth()
const {
return m_lineWidth; }
1482 void setLineWidth(
float width) { m_lineWidth = width; }
1484 int depthBias()
const {
return m_depthBias; }
1485 void setDepthBias(
int bias) { m_depthBias = bias; }
1487 float slopeScaledDepthBias()
const {
return m_slopeScaledDepthBias; }
1488 void setSlopeScaledDepthBias(
float bias) { m_slopeScaledDepthBias = bias; }
1490 void setShaderStages(std::initializer_list<QRhiShaderStage> list) { m_shaderStages = list; }
1491 template<
typename InputIterator>
1492 void setShaderStages(InputIterator first, InputIterator last)
1494 m_shaderStages.clear();
1495 std::copy(first, last, std::back_inserter(m_shaderStages));
1497 const QRhiShaderStage *cbeginShaderStages()
const {
return m_shaderStages.cbegin(); }
1498 const QRhiShaderStage *cendShaderStages()
const {
return m_shaderStages.cend(); }
1499 const QRhiShaderStage *shaderStageAt(qsizetype index)
const {
return &m_shaderStages.at(index); }
1500 qsizetype shaderStageCount()
const {
return m_shaderStages.count(); }
1502 QRhiVertexInputLayout vertexInputLayout()
const {
return m_vertexInputLayout; }
1503 void setVertexInputLayout(
const QRhiVertexInputLayout &layout) { m_vertexInputLayout = layout; }
1505 QRhiShaderResourceBindings *shaderResourceBindings()
const {
return m_shaderResourceBindings; }
1506 void setShaderResourceBindings(QRhiShaderResourceBindings *srb) { m_shaderResourceBindings = srb; }
1508 QRhiRenderPassDescriptor *renderPassDescriptor()
const {
return m_renderPassDesc; }
1509 void setRenderPassDescriptor(QRhiRenderPassDescriptor *desc) { m_renderPassDesc = desc; }
1511 int patchControlPointCount()
const {
return m_patchControlPointCount; }
1512 void setPatchControlPointCount(
int count) { m_patchControlPointCount = count; }
1514 PolygonMode polygonMode()
const {
return m_polygonMode; }
1515 void setPolygonMode(PolygonMode mode) {m_polygonMode = mode; }
1517 int multiViewCount()
const {
return m_multiViewCount; }
1518 void setMultiViewCount(
int count) { m_multiViewCount = count; }
1520 virtual bool create() = 0;
1523 QRhiGraphicsPipeline(QRhiImplementation *rhi);
1525 Topology m_topology = Triangles;
1526 CullMode m_cullMode = None;
1527 FrontFace m_frontFace = CCW;
1528 QVarLengthArray<TargetBlend, 8> m_targetBlends;
1529 bool m_depthTest =
false;
1530 bool m_depthWrite =
false;
1531 bool m_depthClamp =
false;
1532 CompareOp m_depthOp = Less;
1533 bool m_stencilTest =
false;
1534 StencilOpState m_stencilFront;
1535 StencilOpState m_stencilBack;
1536 quint32 m_stencilReadMask = 0xFF;
1537 quint32 m_stencilWriteMask = 0xFF;
1538 int m_sampleCount = 1;
1539 float m_lineWidth = 1.0f;
1540 int m_depthBias = 0;
1541 float m_slopeScaledDepthBias = 0.0f;
1542 int m_patchControlPointCount = 3;
1543 PolygonMode m_polygonMode = Fill;
1544 int m_multiViewCount = 0;
1545 QVarLengthArray<QRhiShaderStage, 4> m_shaderStages;
1546 QRhiVertexInputLayout m_vertexInputLayout;
1547 QRhiShaderResourceBindings *m_shaderResourceBindings =
nullptr;
1548 QRhiRenderPassDescriptor *m_renderPassDesc =
nullptr;
1551Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiGraphicsPipeline::Flags)
1552Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiGraphicsPipeline::ColorMask)
1553Q_DECLARE_TYPEINFO(QRhiGraphicsPipeline::TargetBlend, Q_RELOCATABLE_TYPE);
1576 } colorComponentValue;
1584#ifndef QT_NO_DEBUG_STREAM
1585Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiSwapChainHdrInfo &);
1597 SurfaceHasPreMulAlpha = 1 << 0,
1598 SurfaceHasNonPreMulAlpha = 1 << 1,
1600 UsedAsTransferSource = 1 << 3,
1602 MinimalBufferCount = 1 << 5
1604 Q_DECLARE_FLAGS(Flags, Flag)
1608 HDRExtendedSrgbLinear,
1610 HDRExtendedDisplayP3Linear
1613 enum StereoTargetBuffer {
1618 QRhiResource::Type resourceType()
const override;
1620 QWindow *window()
const {
return m_window; }
1621 void setWindow(QWindow *window) { m_window = window; }
1623 QRhiSwapChainProxyData proxyData()
const {
return m_proxyData; }
1624 void setProxyData(
const QRhiSwapChainProxyData &d) { m_proxyData = d; }
1626 Flags flags()
const {
return m_flags; }
1627 void setFlags(Flags f) { m_flags = f; }
1629 Format format()
const {
return m_format; }
1630 void setFormat(Format f) { m_format = f; }
1632 QRhiRenderBuffer *depthStencil()
const {
return m_depthStencil; }
1633 void setDepthStencil(QRhiRenderBuffer *ds) { m_depthStencil = ds; }
1635 int sampleCount()
const {
return m_sampleCount; }
1636 void setSampleCount(
int samples) { m_sampleCount = samples; }
1638 QRhiRenderPassDescriptor *renderPassDescriptor()
const {
return m_renderPassDesc; }
1639 void setRenderPassDescriptor(QRhiRenderPassDescriptor *desc) { m_renderPassDesc = desc; }
1641 QRhiShadingRateMap *shadingRateMap()
const {
return m_shadingRateMap; }
1642 void setShadingRateMap(QRhiShadingRateMap *map) { m_shadingRateMap = map; }
1644 QSize currentPixelSize()
const {
return m_currentPixelSize; }
1646 virtual QRhiCommandBuffer *currentFrameCommandBuffer() = 0;
1647 virtual QRhiRenderTarget *currentFrameRenderTarget() = 0;
1648 virtual QRhiRenderTarget *currentFrameRenderTarget(StereoTargetBuffer targetBuffer);
1649 virtual QSize surfacePixelSize() = 0;
1650 virtual bool isFormatSupported(Format f) = 0;
1651 virtual QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() = 0;
1652 virtual bool createOrResize() = 0;
1653 virtual QRhiSwapChainHdrInfo hdrInfo();
1656 QRhiSwapChain(QRhiImplementation *rhi);
1657 QWindow *m_window =
nullptr;
1659 Format m_format = SDR;
1660 QRhiRenderBuffer *m_depthStencil =
nullptr;
1661 int m_sampleCount = 1;
1662 QRhiRenderPassDescriptor *m_renderPassDesc =
nullptr;
1663 QSize m_currentPixelSize;
1664 QRhiSwapChainProxyData m_proxyData;
1665 QRhiShadingRateMap *m_shadingRateMap =
nullptr;
1668Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiSwapChain::Flags)
1670class Q_GUI_EXPORT QRhiComputePipeline :
public QRhiResource
1674 CompileShadersWithDebugInfo = 1 << 0
1676 Q_DECLARE_FLAGS(Flags, Flag)
1678 QRhiResource::Type resourceType()
const override;
1679 virtual bool create() = 0;
1681 Flags flags()
const {
return m_flags; }
1682 void setFlags(Flags f) { m_flags = f; }
1684 QRhiShaderStage shaderStage()
const {
return m_shaderStage; }
1685 void setShaderStage(
const QRhiShaderStage &stage) { m_shaderStage = stage; }
1687 QRhiShaderResourceBindings *shaderResourceBindings()
const {
return m_shaderResourceBindings; }
1688 void setShaderResourceBindings(QRhiShaderResourceBindings *srb) { m_shaderResourceBindings = srb; }
1691 QRhiComputePipeline(QRhiImplementation *rhi);
1693 QRhiShaderStage m_shaderStage;
1694 QRhiShaderResourceBindings *m_shaderResourceBindings =
nullptr;
1697Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiComputePipeline::Flags)
1699class Q_GUI_EXPORT QRhiCommandBuffer :
public QRhiResource
1707 enum BeginPassFlag {
1708 ExternalContent = 0x01,
1709 DoNotTrackResourcesForCompute = 0x02
1711 Q_DECLARE_FLAGS(BeginPassFlags, BeginPassFlag)
1713 QRhiResource::Type resourceType()
const override;
1715 void resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates);
1717 void beginPass(QRhiRenderTarget *rt,
1718 const QColor &colorClearValue,
1719 const QRhiDepthStencilClearValue &depthStencilClearValue,
1720 QRhiResourceUpdateBatch *resourceUpdates =
nullptr,
1721 BeginPassFlags flags = {});
1722 void endPass(QRhiResourceUpdateBatch *resourceUpdates =
nullptr);
1724 void setGraphicsPipeline(QRhiGraphicsPipeline *ps);
1725 using DynamicOffset = std::pair<
int, quint32>;
1726 void setShaderResources(QRhiShaderResourceBindings *srb =
nullptr,
1727 int dynamicOffsetCount = 0,
1728 const DynamicOffset *dynamicOffsets =
nullptr);
1729 using VertexInput = std::pair<QRhiBuffer *, quint32>;
1730 void setVertexInput(
int startBinding,
int bindingCount,
const VertexInput *bindings,
1731 QRhiBuffer *indexBuf =
nullptr, quint32 indexOffset = 0,
1732 IndexFormat indexFormat = IndexUInt16);
1734 void setViewport(
const QRhiViewport &viewport);
1735 void setScissor(
const QRhiScissor &scissor);
1736 void setBlendConstants(
const QColor &c);
1737 void setStencilRef(quint32 refValue);
1738 void setShadingRate(
const QSize &coarsePixelSize);
1740 void draw(quint32 vertexCount,
1741 quint32 instanceCount = 1,
1742 quint32 firstVertex = 0,
1743 quint32 firstInstance = 0);
1745 void drawIndexed(quint32 indexCount,
1746 quint32 instanceCount = 1,
1747 quint32 firstIndex = 0,
1748 qint32 vertexOffset = 0,
1749 quint32 firstInstance = 0);
1751 void debugMarkBegin(
const QByteArray &name);
1752 void debugMarkEnd();
1753 void debugMarkMsg(
const QByteArray &msg);
1755 void beginComputePass(QRhiResourceUpdateBatch *resourceUpdates =
nullptr, BeginPassFlags flags = {});
1756 void endComputePass(QRhiResourceUpdateBatch *resourceUpdates =
nullptr);
1757 void setComputePipeline(QRhiComputePipeline *ps);
1758 void dispatch(
int x,
int y,
int z);
1760 const QRhiNativeHandles *nativeHandles();
1761 void beginExternal();
1764 double lastCompletedGpuTime();
1767 QRhiCommandBuffer(QRhiImplementation *rhi);
1770Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiCommandBuffer::BeginPassFlags)
1772struct Q_GUI_EXPORT QRhiReadbackResult
1774 std::function<
void()> completed =
nullptr;
1775 QRhiTexture::Format format;
1783 ~QRhiResourceUpdateBatch();
1787 void merge(QRhiResourceUpdateBatch *other);
1788 bool hasOptimalCapacity()
const;
1790 void updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size,
const void *data);
1791 void updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data);
1792 void uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size,
const void *data);
1793 void uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data);
1794 void uploadStaticBuffer(QRhiBuffer *buf,
const void *data);
1795 void uploadStaticBuffer(QRhiBuffer *buf, QByteArray data);
1796 void readBackBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, QRhiReadbackResult *result);
1797 void uploadTexture(QRhiTexture *tex,
const QRhiTextureUploadDescription &desc);
1798 void uploadTexture(QRhiTexture *tex,
const QImage &image);
1799 void copyTexture(QRhiTexture *dst, QRhiTexture *src,
const QRhiTextureCopyDescription &desc = QRhiTextureCopyDescription());
1800 void readBackTexture(
const QRhiReadbackDescription &rb, QRhiReadbackResult *result);
1801 void generateMips(QRhiTexture *tex);
1804 QRhiResourceUpdateBatch(QRhiImplementation *rhi);
1805 Q_DISABLE_COPY(QRhiResourceUpdateBatch)
1806 QRhiResourceUpdateBatchPrivate *d;
1807 friend class QRhiResourceUpdateBatchPrivate;
1822 QByteArray deviceName;
1823 quint64 deviceId = 0;
1824 quint64 vendorId = 0;
1825 DeviceType deviceType = UnknownDevice;
1830#ifndef QT_NO_DEBUG_STREAM
1831Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiDriverInfo &);
1836 qint64 totalPipelineCreationTime = 0;
1838 quint32 blockCount = 0;
1839 quint32 allocCount = 0;
1840 quint64 usedBytes = 0;
1841 quint64 unusedBytes = 0;
1843 quint64 totalUsageBytes = 0;
1848#ifndef QT_NO_DEBUG_STREAM
1849Q_GUI_EXPORT
QDebug operator<<(QDebug,
const QRhiStats &);
1855 virtual ~QRhiAdapter();
1856 virtual QRhiDriverInfo info()
const = 0;
1866 enum Implementation {
1876 EnableDebugMarkers = 1 << 0,
1877 PreferSoftwareRenderer = 1 << 1,
1878 EnablePipelineCacheDataSave = 1 << 2,
1879 EnableTimestamps = 1 << 3,
1880 SuppressSmokeTestWarnings = 1 << 4
1882 Q_DECLARE_FLAGS(Flags, Flag)
1884 enum FrameOpResult {
1887 FrameOpSwapChainOutOfDate,
1892 MultisampleTexture = 1,
1893 MultisampleRenderBuffer,
1897 CustomInstanceStepRate,
1899 NonDynamicUniformBuffers,
1900 NonFourAlignedEffectiveIndexBufferOffset,
1906 VertexShaderPointSize,
1909 TriangleFanTopology,
1910 ReadBackNonUniformBuffer,
1911 ReadBackNonBaseMipLevel,
1913 RenderToNonBaseMipLevel,
1915 ScreenSpaceDerivatives,
1916 ReadBackAnyTextureFormat,
1917 PipelineCacheDataLoadSave,
1920 ThreeDimensionalTextures,
1921 RenderTo3DTextureSlice,
1927 OneDimensionalTextures,
1928 OneDimensionalTextureMipmaps,
1930 RenderToOneDimensionalTexture,
1931 ThreeDimensionalTextureMipmaps,
1934 ResolveDepthStencil,
1935 VariableRateShading,
1936 VariableRateShadingMap,
1937 VariableRateShadingMapWithTexture,
1938 PerRenderTargetBlending,
1940 InstanceIndexIncludesBaseInstance,
1944 enum BeginFrameFlag {
1946 Q_DECLARE_FLAGS(BeginFrameFlags, BeginFrameFlag)
1949 SkipPresent = 1 << 0
1951 Q_DECLARE_FLAGS(EndFrameFlags, EndFrameFlag)
1953 enum ResourceLimit {
1956 MaxColorAttachments,
1958 MaxAsyncReadbackFrames,
1959 MaxThreadGroupsPerDimension,
1960 MaxThreadsPerThreadGroup,
1964 TextureArraySizeMax,
1965 MaxUniformBufferRange,
1968 ShadingRateImageTileSize
1973 static QRhi *create(Implementation impl,
1974 QRhiInitParams *params,
1976 QRhiNativeHandles *importDevice =
nullptr);
1977 static QRhi *create(Implementation impl,
1978 QRhiInitParams *params,
1980 QRhiNativeHandles *importDevice,
1981 QRhiAdapter *adapter);
1982 static bool probe(Implementation impl, QRhiInitParams *params);
1983 using AdapterList = QVector<QRhiAdapter *>;
1984 static AdapterList enumerateAdapters(Implementation impl,
1985 QRhiInitParams *params,
1986 QRhiNativeHandles *nativeHandles =
nullptr);
1988 Implementation backend()
const;
1989 const char *backendName()
const;
1990 static const char *backendName(Implementation impl);
1991 QRhiDriverInfo driverInfo()
const;
1992 QThread *thread()
const;
1994 using CleanupCallback = std::function<
void(QRhi *)>;
1995 void addCleanupCallback(
const CleanupCallback &callback);
1996 void addCleanupCallback(
const void *key,
const CleanupCallback &callback);
1997 void removeCleanupCallback(
const void *key);
1999 QRhiGraphicsPipeline *newGraphicsPipeline();
2000 QRhiComputePipeline *newComputePipeline();
2001 QRhiShaderResourceBindings *newShaderResourceBindings();
2003 QRhiBuffer *newBuffer(QRhiBuffer::Type type,
2004 QRhiBuffer::UsageFlags usage,
2007 QRhiRenderBuffer *newRenderBuffer(QRhiRenderBuffer::Type type,
2008 const QSize &pixelSize,
2009 int sampleCount = 1,
2010 QRhiRenderBuffer::Flags flags = {},
2011 QRhiTexture::Format backingFormatHint = QRhiTexture::UnknownFormat);
2013 QRhiTexture *newTexture(QRhiTexture::Format format,
2014 const QSize &pixelSize,
2015 int sampleCount = 1,
2016 QRhiTexture::Flags flags = {});
2018 QRhiTexture *newTexture(QRhiTexture::Format format,
2019 int width,
int height,
int depth,
2020 int sampleCount = 1,
2021 QRhiTexture::Flags flags = {});
2023 QRhiTexture *newTextureArray(QRhiTexture::Format format,
2025 const QSize &pixelSize,
2026 int sampleCount = 1,
2027 QRhiTexture::Flags flags = {});
2029 QRhiSampler *newSampler(QRhiSampler::Filter magFilter,
2030 QRhiSampler::Filter minFilter,
2031 QRhiSampler::Filter mipmapMode,
2032 QRhiSampler::AddressMode addressU,
2033 QRhiSampler::AddressMode addressV,
2034 QRhiSampler::AddressMode addressW = QRhiSampler::Repeat);
2036 QRhiShadingRateMap *newShadingRateMap();
2038 QRhiTextureRenderTarget *newTextureRenderTarget(
const QRhiTextureRenderTargetDescription &desc,
2039 QRhiTextureRenderTarget::Flags flags = {});
2041 QRhiSwapChain *newSwapChain();
2042 FrameOpResult beginFrame(QRhiSwapChain *swapChain, BeginFrameFlags flags = {});
2043 FrameOpResult endFrame(QRhiSwapChain *swapChain, EndFrameFlags flags = {});
2044 bool isRecordingFrame()
const;
2045 int currentFrameSlot()
const;
2047 FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, BeginFrameFlags flags = {});
2048 FrameOpResult endOffscreenFrame(EndFrameFlags flags = {});
2050 QRhi::FrameOpResult finish();
2052 QRhiResourceUpdateBatch *nextResourceUpdateBatch();
2054 QList<
int> supportedSampleCounts()
const;
2056 int ubufAlignment()
const;
2057 int ubufAligned(
int v)
const;
2059 static int mipLevelsForSize(
const QSize &size);
2060 static QSize sizeForMipLevel(
int mipLevel,
const QSize &baseLevelSize);
2062 bool isYUpInFramebuffer()
const;
2063 bool isYUpInNDC()
const;
2064 bool isClipDepthZeroToOne()
const;
2066 QMatrix4x4 clipSpaceCorrMatrix()
const;
2068 bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags = {})
const;
2069 bool isFeatureSupported(QRhi::Feature feature)
const;
2070 int resourceLimit(ResourceLimit limit)
const;
2072 const QRhiNativeHandles *nativeHandles();
2073 bool makeThreadLocalNativeContextCurrent();
2074 void setQueueSubmitParams(QRhiNativeHandles *params);
2076 static constexpr int MAX_MIP_LEVELS = 16;
2078 void releaseCachedResources();
2080 bool isDeviceLost()
const;
2082 QByteArray pipelineCacheData();
2083 void setPipelineCacheData(
const QByteArray &data);
2085 QRhiStats statistics()
const;
2087 static QRhiSwapChainProxyData updateSwapChainProxyData(Implementation impl, QWindow *window);
2089 QList<QSize> supportedShadingRates(
int sampleCount)
const;
2095 Q_DISABLE_COPY(QRhi)
2096 QRhiImplementation *d =
nullptr;
2099Q_DECLARE_OPERATORS_FOR_FLAGS(QRhi::Flags)
2100Q_DECLARE_OPERATORS_FOR_FLAGS(QRhi::BeginFrameFlags)
2101Q_DECLARE_OPERATORS_FOR_FLAGS(QRhi::EndFrameFlags)
2105#include <rhi/qrhi_platform.h>
friend bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are equal, otherwise returns false.
friend bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are different, otherwise returns false.
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Combined button and popup list for selecting options.
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Q_DECLARE_TYPEINFO(QRhiSwapChainHdrInfo, Q_RELOCATABLE_TYPE)
int main(int argc, char *argv[])
[ctor_close]
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\variable QRhiReadbackResult::completed
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
LuminanceBehavior
\value SceneReferred Indicates that the color value of 1.0 is interpreted as 80 nits.
float maxPotentialColorComponentValue
LimitsType
\value LuminanceInNits Indicates that the \l limits union has its luminanceInNits struct set
LuminanceBehavior luminanceBehavior
float maxColorComponentValue
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h