Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qrhid3d11_p.h
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QRHID3D11_P_H
6#define QRHID3D11_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qrhi_p.h"
20#include <rhi/qshaderdescription.h>
21#include <QWindow>
22
23#include <d3d11_1.h>
24#include <dxgi1_6.h>
25#include <dcomp.h>
26
28
29class QRhiD3D11;
30
31struct QD3D11Buffer : public QRhiBuffer
32{
33 QD3D11Buffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size);
34 ~QD3D11Buffer();
35 void destroy() override;
36 bool create() override;
40
42
43 ID3D11Buffer *buffer = nullptr;
44 char *dynBuf = nullptr;
48 friend class QRhiD3D11;
49};
50
52{
53 QD3D11RenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
54 int sampleCount, QRhiRenderBuffer::Flags flags,
55 QRhiTexture::Format backingFormatHint);
57 void destroy() override;
58 bool create() override;
59 QRhiTexture::Format backingFormat() const override;
60
61 ID3D11Texture2D *tex = nullptr;
67 friend class QRhiD3D11;
68};
69
71{
72 QD3D11Texture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth,
73 int arraySize, int sampleCount, Flags flags);
75 void destroy() override;
76 bool create() override;
77 bool createFrom(NativeTexture src) override;
79
80 bool prepareCreate(QSize *adjustedSize = nullptr);
81 bool finishCreate();
84 {
85 if (tex)
86 return tex;
87 else if (tex1D)
88 return tex1D;
89 return tex3D;
90 }
91
92 ID3D11Texture2D *tex = nullptr;
95 bool owns = true;
102 friend class QRhiD3D11;
103};
104
106{
107 QD3D11Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
108 AddressMode u, AddressMode v, AddressMode w);
109 ~QD3D11Sampler();
110 void destroy() override;
111 bool create() override;
112
115 friend class QRhiD3D11;
116};
117
119{
120 QD3D11RenderPassDescriptor(QRhiImplementation *rhi);
122 void destroy() override;
123 bool isCompatible(const QRhiRenderPassDescriptor *other) const override;
125 QVector<quint32> serializedFormat() const override;
126};
127
129{
130 QD3D11RenderTargetData(QRhiImplementation *)
131 {
132 for (int i = 0; i < MAX_COLOR_ATTACHMENTS; ++i)
133 rtv[i] = nullptr;
134 }
135
138 float dpr = 1;
139 int sampleCount = 1;
141 int dsAttCount = 0;
142
143 static const int MAX_COLOR_ATTACHMENTS = 8;
146
148};
149
151{
152 QD3D11SwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain);
154 void destroy() override;
155
156 QSize pixelSize() const override;
157 float devicePixelRatio() const override;
158 int sampleCount() const override;
159
161};
162
164{
165 QD3D11TextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags);
167 void destroy() override;
168
169 QSize pixelSize() const override;
170 float devicePixelRatio() const override;
171 int sampleCount() const override;
172
174 bool create() override;
175
179 bool ownsDsv = false;
181 friend class QRhiD3D11;
182};
183
191
194
196{
197 QD3D11ShaderResourceBindings(QRhiImplementation *rhi);
199 void destroy() override;
200 bool create() override;
201 void updateResources(UpdateFlags flags) override;
202
203 bool hasDynamicOffset = false;
208
209 // Keep track of the generation number of each referenced QRhi* to be able
210 // to detect that the batched bindings are out of date.
216 int count;
217 struct {
222 } d[QRhiShaderResourceBinding::Data::MAX_TEX_SAMPLER_ARRAY_SIZE];
223 };
241
243 bool present = false;
248 void finish() {
249 present = ubufs.finish();
250 ubuforigbindings.finish();
251 ubufoffsets.finish();
252 ubufsizes.finish();
253 }
254 void clear() {
255 ubufs.clear();
256 ubuforigbindings.clear();
257 ubufoffsets.clear();
258 ubufsizes.clear();
259 }
260 };
261
263 bool present = false;
266 void finish() {
267 present = samplers.finish();
268 shaderresources.finish();
269 }
270 void clear() {
271 samplers.clear();
272 shaderresources.clear();
273 }
274 };
275
277 bool present = false;
279 void finish() {
280 present = uavs.finish();
281 }
282 void clear() {
283 uavs.clear();
284 }
285 };
286
294
301
304
305 void clear() {
306 vsUniformBufferBatches.clear();
307 hsUniformBufferBatches.clear();
308 dsUniformBufferBatches.clear();
309 gsUniformBufferBatches.clear();
310 fsUniformBufferBatches.clear();
311 csUniformBufferBatches.clear();
312
313 vsSamplerBatches.clear();
314 hsSamplerBatches.clear();
315 dsSamplerBatches.clear();
316 gsSamplerBatches.clear();
317 fsSamplerBatches.clear();
318 csSamplerBatches.clear();
319
320 csUavBatches.clear();
321 fsUavBatches.clear();
322 }
323 } resourceBatches;
324
325 friend class QRhiD3D11;
326};
327
329
331{
332 QD3D11GraphicsPipeline(QRhiImplementation *rhi);
334 void destroy() override;
335 bool create() override;
336
339 struct {
342 } vs;
343 struct {
345 QShader::NativeResourceBindingMap nativeResourceBindingMap;
346 } hs;
347 struct {
349 QShader::NativeResourceBindingMap nativeResourceBindingMap;
350 } ds;
351 struct {
353 QShader::NativeResourceBindingMap nativeResourceBindingMap;
354 } gs;
355 struct {
357 QShader::NativeResourceBindingMap nativeResourceBindingMap;
358 } fs;
363 friend class QRhiD3D11;
364};
365
367{
368 QD3D11ComputePipeline(QRhiImplementation *rhi);
370 void destroy() override;
371 bool create() override;
372
373 struct {
376 } cs;
378 friend class QRhiD3D11;
379};
380
381struct QD3D11SwapChain;
382
384{
385 QD3D11CommandBuffer(QRhiImplementation *rhi);
387 void destroy() override;
388
389 // these must be kept at a reasonably low value otherwise sizeof Command explodes
390 static const int MAX_DYNAMIC_OFFSET_COUNT = 8;
392
393 struct Command {
422 enum ClearFlag { Color = 1, Depth = 2, Stencil = 4 };
424
425 // QRhi*/QD3D11* references should be kept at minimum (so no
426 // QRhiTexture/Buffer/etc. pointers).
427 union Args {
428 struct {
432 } beginFrame;
433 struct {
434 ID3D11Query *tsQuery;
435 ID3D11Query *tsDisjointQuery;
436 } endFrame;
437 struct {
439 } setRenderTarget;
440 struct {
441 QRhiRenderTarget *rt;
442 int mask;
443 float c[4];
444 float d;
446 } clear;
447 struct {
448 float x, y, w, h;
449 float d0, d1;
450 } viewport;
451 struct {
452 int x, y, w, h;
453 } scissor;
454 struct {
460 } bindVertexBuffers;
461 struct {
465 } bindIndexBuffer;
466 struct {
468 } bindGraphicsPipeline;
469 struct {
473 uint dynamicOffsetPairs[MAX_DYNAMIC_OFFSET_COUNT * 2]; // binding, offsetInConstants
474 } bindShaderResources;
475 struct {
478 } stencilRef;
479 struct {
481 float c[4];
482 } blendConstants;
483 struct {
489 } draw;
490 struct {
493 quint32 instanceCount;
496 quint32 firstInstance;
497 } drawIndexed;
498 struct {
504 } drawIndirect;
505 struct {
507 QD3D11Buffer *indirectBuffer;
508 quint32 indirectBufferOffset;
509 quint32 drawCount;
510 quint32 stride;
511 } drawIndexedIndirect;
512 struct {
517 const void *src; // must come from retain*()
519 } updateSubRes;
520 struct {
521 ID3D11Resource *dst;
522 UINT dstSubRes;
530 } copySubRes;
531 struct {
532 ID3D11Resource *dst;
533 UINT dstSubRes;
534 ID3D11Resource *src;
535 UINT srcSubRes;
536 DXGI_FORMAT format;
537 } resolveSubRes;
538 struct {
540 } genMip;
541 struct {
542 char s[64];
543 } debugMark;
544 struct {
546 } bindComputePipeline;
547 struct {
551 } dispatch;
552 } args;
553 };
554
560
563 double lastGpuTime = 0;
577
582
583 // relies heavily on implicit sharing (no copies of the actual data will be made)
584 const uchar *retainData(const QByteArray &data) {
585 dataRetainPool.append(data);
586 return reinterpret_cast<const uchar *>(dataRetainPool.last().constData());
587 }
589 bufferDataRetainPool.append(data);
590 return reinterpret_cast<const uchar *>(bufferDataRetainPool.last().constData());
591 }
592 const uchar *retainImage(const QImage &image) {
593 imageRetainPool.append(image);
594 return imageRetainPool.last().constBits();
595 }
596 // except this one
598 resourceBatchRetainPool.append(resourceBatches);
599 return resourceBatchRetainPool.count() - 1;
600 }
602 commands.reset();
603 dataRetainPool.clear();
604 bufferDataRetainPool.clear();
605 imageRetainPool.clear();
606 resourceBatchRetainPool.clear();
607 }
608 void resetState() {
610 // do not zero lastGpuTime
611 currentTarget = nullptr;
612 prevRtD = nullptr;
615 }
617 currentGraphicsPipeline = nullptr;
618 currentComputePipeline = nullptr;
619 currentPipelineGeneration = 0;
620 currentGraphicsSrb = nullptr;
621 currentComputeSrb = nullptr;
622 currentSrbGeneration = 0;
623 currentIndexBuffer = nullptr;
624 currentIndexOffset = 0;
625 currentIndexFormat = DXGI_FORMAT_R16_UINT;
626 memset(currentVertexBuffers, 0, sizeof(currentVertexBuffers));
627 memset(currentVertexOffsets, 0, sizeof(currentVertexOffsets));
628 }
629};
630
632{
633 static const int TIMESTAMP_PAIRS = 2;
634
638
639 bool prepare(QRhiD3D11 *rhiD);
640 void destroy();
641 bool tryQueryTimestamps(int idx, ID3D11DeviceContext *context, double *elapsedSec);
642};
643
645{
646 QD3D11SwapChain(QRhiImplementation *rhi);
648 void destroy() override;
649
650 QRhiCommandBuffer *currentFrameCommandBuffer() override;
652 QRhiRenderTarget *currentFrameRenderTarget(StereoTargetBuffer targetBuffer) override;
653
654 QSize surfacePixelSize() override;
655 bool isFormatSupported(Format f) override;
657
660
661 void releaseBuffers();
662 bool newColorBuffer(const QSize &size, DXGI_FORMAT format, DXGI_SAMPLE_DESC sampleDesc,
663 ID3D11Texture2D **tex, ID3D11RenderTargetView **rtv) const;
664
665 QWindow *window = nullptr;
677 static const int BUFFER_COUNT = 2;
682 int frameCount = 0;
691};
692
694{
695public:
696 QRhiDriverInfo info() const override;
697
700};
701
703{
704public:
705 QRhiD3D11(QRhiD3D11InitParams *params, QRhiD3D11NativeHandles *importDevice = nullptr);
706
707 bool create(QRhi::Flags flags) override;
708 void destroy() override;
709 QRhi::AdapterList enumerateAdaptersBeforeCreate(QRhiNativeHandles *nativeHandles) const override;
710
714 QRhiBuffer *createBuffer(QRhiBuffer::Type type,
715 QRhiBuffer::UsageFlags usage,
716 quint32 size) override;
717 QRhiRenderBuffer *createRenderBuffer(QRhiRenderBuffer::Type type,
718 const QSize &pixelSize,
719 int sampleCount,
720 QRhiRenderBuffer::Flags flags,
721 QRhiTexture::Format backingFormatHint) override;
722 QRhiTexture *createTexture(QRhiTexture::Format format,
723 const QSize &pixelSize,
724 int depth,
725 int arraySize,
726 int sampleCount,
727 QRhiTexture::Flags flags) override;
728 QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
729 QRhiSampler::Filter minFilter,
730 QRhiSampler::Filter mipmapMode,
731 QRhiSampler:: AddressMode u,
732 QRhiSampler::AddressMode v,
733 QRhiSampler::AddressMode w) override;
734
735 QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
736 QRhiTextureRenderTarget::Flags flags) override;
737
738 QRhiShadingRateMap *createShadingRateMap() override;
739
740 QRhiSwapChain *createSwapChain() override;
741 QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override;
742 QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override;
743 QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override;
744 QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override;
745 QRhi::FrameOpResult finish() override;
746
747 void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
748
749 void beginPass(QRhiCommandBuffer *cb,
750 QRhiRenderTarget *rt,
751 const QColor &colorClearValue,
752 const QRhiDepthStencilClearValue &depthStencilClearValue,
753 QRhiResourceUpdateBatch *resourceUpdates,
754 QRhiCommandBuffer::BeginPassFlags flags) override;
755 void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
756
757 void setGraphicsPipeline(QRhiCommandBuffer *cb,
758 QRhiGraphicsPipeline *ps) override;
759
760 void setShaderResources(QRhiCommandBuffer *cb,
761 QRhiShaderResourceBindings *srb,
762 int dynamicOffsetCount,
763 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) override;
764
765 void setVertexInput(QRhiCommandBuffer *cb,
766 int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings,
767 QRhiBuffer *indexBuf, quint32 indexOffset,
768 QRhiCommandBuffer::IndexFormat indexFormat) override;
769
770 void setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport) override;
771 void setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor) override;
772 void setBlendConstants(QRhiCommandBuffer *cb, const QColor &c) override;
773 void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) override;
774 void setShadingRate(QRhiCommandBuffer *cb, const QSize &coarsePixelSize) override;
775
776 void draw(QRhiCommandBuffer *cb, quint32 vertexCount,
777 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) override;
778
779 void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
780 quint32 instanceCount, quint32 firstIndex,
781 qint32 vertexOffset, quint32 firstInstance) override;
782
783 void drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
784 quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override;
785
786 void drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
787 quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override;
788
789 void debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name) override;
790 void debugMarkEnd(QRhiCommandBuffer *cb) override;
791 void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override;
792
793 void beginComputePass(QRhiCommandBuffer *cb,
794 QRhiResourceUpdateBatch *resourceUpdates,
795 QRhiCommandBuffer::BeginPassFlags flags) override;
796 void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
797 void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override;
798 void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override;
799
800 const QRhiNativeHandles *nativeHandles(QRhiCommandBuffer *cb) override;
801 void beginExternal(QRhiCommandBuffer *cb) override;
802 void endExternal(QRhiCommandBuffer *cb) override;
803 double lastCompletedGpuTime(QRhiCommandBuffer *cb) override;
804
805 QList<int> supportedSampleCounts() const override;
806 QList<QSize> supportedShadingRates(int sampleCount) const override;
807 int ubufAlignment() const override;
808 bool isYUpInFramebuffer() const override;
809 bool isYUpInNDC() const override;
810 bool isClipDepthZeroToOne() const override;
811 QMatrix4x4 clipSpaceCorrMatrix() const override;
812 bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const override;
813 bool isFeatureSupported(QRhi::Feature feature) const override;
814 int resourceLimit(QRhi::ResourceLimit limit) const override;
815 const QRhiNativeHandles *nativeHandles() override;
816 QRhiDriverInfo driverInfo() const override;
817 QRhiStats statistics() override;
819 void setQueueSubmitParams(QRhiNativeHandles *params) override;
821 bool isDeviceLost() const override;
822
823 QByteArray pipelineCacheData() override;
824 void setPipelineCacheData(const QByteArray &data) override;
825
827 int layer, int level, const QRhiTextureSubresourceUploadDescription &subresDesc);
828 void enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates);
830 const QShader::NativeResourceBindingMap *nativeResourceBindingMaps[]);
832
834 const uint *dynOfsPairs, int dynOfsPairCount,
835 bool offsetOnlyChange, QD3D11RenderTargetData *rtD, RenderTargetUavUpdateState &rtUavState);
838 DXGI_SAMPLE_DESC effectiveSampleDesc(int sampleCount) const;
840 void reportLiveObjects(ID3D11Device *device);
841 void clearShaderCache();
842 QByteArray compileHlslShaderSource(const QShader &shader, QShader::Variant shaderVariant, uint flags,
843 QString *error, QShaderKey *usedShaderKey);
845
847 bool debugLayer = false;
848 UINT maxFrameLatency = 2; // 1-3, use 2 to keep CPU-GPU parallelism while reducing lag compared to tripple buffering
850 ID3D11Device *dev = nullptr;
860 bool deviceLost = false;
863
864 struct {
876 } contextState;
877
885
902
912
913 // This is what gets exposed as the "pipeline cache", not that that concept
914 // applies anyway. Here we are just storing the DX bytecode for a shader so
915 // we can skip the HLSL->DXBC compilation when the QShader has HLSL source
916 // code and the same shader source has already been compiled before.
917 // m_shaderCache seemingly does the same, but this here does not care about
918 // the ID3D11*Shader, this is just about the bytecode and about allowing
919 // the data to be serialized to persistent storage and then reloaded in
920 // future runs of the app, or when creating another QRhi, etc.
928};
929
932
933inline bool operator==(const QRhiD3D11::BytecodeCacheKey &a, const QRhiD3D11::BytecodeCacheKey &b) noexcept
934{
935 return a.sourceHash == b.sourceHash
936 && a.target == b.target
937 && a.entryPoint == b.entryPoint
938 && a.compileFlags == b.compileFlags;
939}
940
941inline bool operator!=(const QRhiD3D11::BytecodeCacheKey &a, const QRhiD3D11::BytecodeCacheKey &b) noexcept
942{
943 return !(a == b);
944}
945
946inline size_t qHash(const QRhiD3D11::BytecodeCacheKey &k, size_t seed = 0) noexcept
947{
948 return qHashMulti(seed, k.sourceHash, k.target, k.entryPoint, k.compileFlags);
949}
950
951QT_END_NAMESPACE
952
953#endif
QRhiDriverInfo info() const override
QRhiDriverInfo adapterInfo
const char * constData() const
Definition qrhi_p.h:372
int gsHighestActiveSrvBinding
void setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor) override
bool deviceLost
void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override
int dsHighestActiveSrvBinding
QRhiD3D11NativeHandles nativeHandlesStruct
bool isYUpInNDC() const override
void drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override
ID3D11Device * dev
QRhiSwapChain * createSwapChain() override
void enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
bool isFeatureSupported(QRhi::Feature feature) const override
QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override
bool isDeviceLost() const override
bool vsHasIndexBufferBound
void executeBufferHostWrites(QD3D11Buffer *bufD)
void updateShaderResourceBindings(QD3D11ShaderResourceBindings *srbD, const QShader::NativeResourceBindingMap *nativeResourceBindingMaps[])
QRhiStats statistics() override
QHash< BytecodeCacheKey, QByteArray > m_bytecodeCache
QList< QSize > supportedShadingRates(int sampleCount) const override
QRhiComputePipeline * createComputePipeline() override
void debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name) override
bool debugLayer
QRhi::FrameOpResult finish() override
void setVertexInput(QRhiCommandBuffer *cb, int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf, quint32 indexOffset, QRhiCommandBuffer::IndexFormat indexFormat) override
IDXGIAdapter1 * activeAdapter
QRhiGraphicsPipeline * createGraphicsPipeline() override
QRhiShaderResourceBindings * createShaderResourceBindings() override
QVarLengthArray< BufferReadback, 2 > activeBufferReadbacks
QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override
ID3D11DeviceContext1 * context
QList< int > supportedSampleCounts() const override
QRhiTextureRenderTarget * createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget::Flags flags) override
QRhi::Flags rhiFlags
QByteArray compileHlslShaderSource(const QShader &shader, QShader::Variant shaderVariant, uint flags, QString *error, QShaderKey *usedShaderKey)
void setBlendConstants(QRhiCommandBuffer *cb, const QColor &c) override
int csHighestActiveSrvBinding
bool isClipDepthZeroToOne() const override
IDCompositionDevice * dcompDevice
QRhiDriverInfo driverInfoStruct
QHash< QRhiShaderStage, Shader > m_shaderCache
bool ensureDirectCompositionDevice()
const QRhiNativeHandles * nativeHandles(QRhiCommandBuffer *cb) override
void beginComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
void draw(QRhiCommandBuffer *cb, quint32 vertexCount, quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) override
void enqueueSubresUpload(QD3D11Texture *texD, QD3D11CommandBuffer *cbD, int layer, int level, const QRhiTextureSubresourceUploadDescription &subresDesc)
QD3D11SwapChain * currentSwapChain
void reportLiveObjects(ID3D11Device *device)
void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
void destroy() override
QMatrix4x4 clipSpaceCorrMatrix() const override
bool isYUpInFramebuffer() const override
int resourceLimit(QRhi::ResourceLimit limit) const override
void beginExternal(QRhiCommandBuffer *cb) override
QRhiTexture * createTexture(QRhiTexture::Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, QRhiTexture::Flags flags) override
void setPipelineCacheData(const QByteArray &data) override
LUID adapterLuid
void executeCommandBuffer(QD3D11CommandBuffer *cbD)
void debugMarkEnd(QRhiCommandBuffer *cb) override
void releaseCachedResources() override
double lastCompletedGpuTime(QRhiCommandBuffer *cb) override
ID3DUserDefinedAnnotation * annotations
bool importedDeviceAndContext
void resetShaderResources(QD3D11RenderTargetData *rtD, RenderTargetUavUpdateState &rtUavState)
QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override
QRhiBuffer * createBuffer(QRhiBuffer::Type type, QRhiBuffer::UsageFlags usage, quint32 size) override
bool supportsAllowTearing
void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override
void endExternal(QRhiCommandBuffer *cb) override
void setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport) override
QVarLengthArray< TextureReadback, 2 > activeTextureReadbacks
QRhi::AdapterList enumerateAdaptersBeforeCreate(QRhiNativeHandles *nativeHandles) const override
UINT maxFrameLatency
void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override
QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override
QRhiShadingRateMap * createShadingRateMap() override
bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const override
void setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBindings *srb, int dynamicOffsetCount, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) override
void clearShaderCache()
D3D_FEATURE_LEVEL featureLevel
bool useLegacySwapchainModel
void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
bool makeThreadLocalNativeContextCurrent() override
bool create(QRhi::Flags flags) override
void bindShaderResources(const QD3D11ShaderResourceBindings::ResourceBatches &allResourceBatches, const uint *dynOfsPairs, int dynOfsPairCount, bool offsetOnlyChange, QD3D11RenderTargetData *rtD, RenderTargetUavUpdateState &rtUavState)
int csHighestActiveUavBinding
void finishActiveReadbacks()
IDXGIFactory1 * dxgiFactory
int fsHighestActiveSrvBinding
void setShadingRate(QRhiCommandBuffer *cb, const QSize &coarsePixelSize) override
QByteArray pipelineCacheData() override
const QRhiNativeHandles * nativeHandles() override
QRhiDriverInfo driverInfo() const override
void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
int ubufAlignment() const override
void beginPass(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount, quint32 instanceCount, quint32 firstIndex, qint32 vertexOffset, quint32 firstInstance) override
void setQueueSubmitParams(QRhiNativeHandles *params) override
QRhiSampler * createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler::Filter mipmapMode, QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w) override
int vsHighestActiveSrvBinding
QRhiRenderBuffer * createRenderBuffer(QRhiRenderBuffer::Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint) override
int hsHighestActiveSrvBinding
void setGraphicsPipeline(QRhiCommandBuffer *cb, QRhiGraphicsPipeline *ps) override
QRhiD3D11(QRhiD3D11InitParams *params, QRhiD3D11NativeHandles *importDevice=nullptr)
DXGI_SAMPLE_DESC effectiveSampleDesc(int sampleCount) const
int fsHighestActiveUavBinding
void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) override
int vsHighestActiveVertexBufferBinding
void drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override
static QRhiResourceUpdateBatchPrivate * get(QRhiResourceUpdateBatch *b)
Definition qrhi_p.h:597
void fillDriverInfo(QRhiDriverInfo *info, const DXGI_ADAPTER_DESC1 &desc)
Combined button and popup list for selecting options.
@ UnBounded
Definition qrhi_p.h:285
@ Bounded
Definition qrhi_p.h:286
#define QRHI_RES_RHI(t)
Definition qrhi_p.h:31
#define QRHI_RES(t, x)
Definition qrhi_p.h:30
static const DXGI_FORMAT DEFAULT_SRGB_FORMAT
static void applyDynamicOffsets(UINT *offsets, int batchIndex, const QRhiBatchedBindings< UINT > *originalBindings, const QRhiBatchedBindings< UINT > *staticOffsets, const uint *dynOfsPairs, int dynOfsPairCount)
static D3D11_TEXTURE_ADDRESS_MODE toD3DAddressMode(QRhiSampler::AddressMode m)
#define SETUAVBATCH(stagePrefixL, stagePrefixU)
static QByteArray sourceHash(const QByteArray &source)
#define SETSAMPLERBATCH(stagePrefixL, stagePrefixU)
static const int RBM_HULL
static uint toD3DBufferUsage(QRhiBuffer::UsageFlags usage)
static std::pair< int, int > mapBinding(int binding, int stageIndex, const QShader::NativeResourceBindingMap *nativeResourceBindingMaps[])
static const int RBM_FRAGMENT
#define SETUBUFBATCH(stagePrefixL, stagePrefixU)
Int aligned(Int v, Int byteAlign)
\variable QRhiVulkanQueueSubmitParams::waitSemaphoreCount
static DXGI_FORMAT toD3DDepthTextureDSVFormat(QRhiTexture::Format format)
static D3D11_BLEND toD3DBlendFactor(QRhiGraphicsPipeline::BlendFactor f, bool rgb)
static const int RBM_VERTEX
static D3D11_BLEND_OP toD3DBlendOp(QRhiGraphicsPipeline::BlendOp op)
#define D3D11_1_UAV_SLOT_COUNT
static const int RBM_DOMAIN
static D3D11_FILTER toD3DFilter(QRhiSampler::Filter minFilter, QRhiSampler::Filter magFilter, QRhiSampler::Filter mipFilter)
static QD3D11RenderTargetData * rtData(QRhiRenderTarget *rt)
static UINT8 toD3DColorWriteMask(QRhiGraphicsPipeline::ColorMask c)
static D3D11_STENCIL_OP toD3DStencilOp(QRhiGraphicsPipeline::StencilOp op)
void releasePipelineShader(T &s)
static D3D11_COMPARISON_FUNC toD3DTextureComparisonFunc(QRhiSampler::CompareOp op)
static DXGI_FORMAT toD3DAttributeFormat(QRhiVertexInputAttribute::Format format)
static const int RBM_GEOMETRY
static D3D11_PRIMITIVE_TOPOLOGY toD3DTopology(QRhiGraphicsPipeline::Topology t, int patchControlPointCount)
static IDXGIFactory1 * createDXGIFactory2()
static D3D11_FILL_MODE toD3DFillMode(QRhiGraphicsPipeline::PolygonMode mode)
static bool isDepthTextureFormat(QRhiTexture::Format format)
static const int RBM_COMPUTE
static D3D11_CULL_MODE toD3DCullMode(QRhiGraphicsPipeline::CullMode c)
#define SETSHADER(StageL, StageU)
static DXGI_FORMAT toD3DTextureFormat(QRhiTexture::Format format, QRhiTexture::Flags flags)
static const DXGI_FORMAT DEFAULT_FORMAT
static uint clampedResourceCount(uint startSlot, int countSlots, uint maxSlots, const char *resType)
#define D3D11_VS_INPUT_REGISTER_COUNT
#define DXGI_ADAPTER_FLAG_SOFTWARE
\variable QRhiD3D11NativeHandles::dev
static QRhiTexture::Format swapchainReadbackTextureFormat(DXGI_FORMAT format, QRhiTexture::Flags *flags)
static D3D11_COMPARISON_FUNC toD3DCompareOp(QRhiGraphicsPipeline::CompareOp op)
static DXGI_FORMAT toD3DDepthTextureSRVFormat(QRhiTexture::Format format)
static const int RBM_SUPPORTED_STAGES
size_t qHash(const QRhiD3D11::BytecodeCacheKey &k, size_t seed=0) noexcept
Q_DECLARE_TYPEINFO(QRhiD3D11::TextureReadback, Q_RELOCATABLE_TYPE)
bool operator!=(const QRhiD3D11::BytecodeCacheKey &a, const QRhiD3D11::BytecodeCacheKey &b) noexcept
Q_DECLARE_TYPEINFO(QRhiD3D11::BufferReadback, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(QD3D11ShaderResourceBindings::BoundResourceData, Q_RELOCATABLE_TYPE)
bool operator==(const QRhiD3D11::BytecodeCacheKey &a, const QRhiD3D11::BytecodeCacheKey &b) noexcept
bool hasPendingDynamicUpdates
Definition qrhid3d11_p.h:45
void endFullDynamicBufferUpdateForCurrentFrame() override
To be called when the entire contents of the buffer data has been updated in the memory block returne...
char * dynBuf
Definition qrhid3d11_p.h:44
ID3D11Buffer * buffer
Definition qrhid3d11_p.h:43
QD3D11Buffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
char * beginFullDynamicBufferUpdateForCurrentFrame() override
bool create() override
Creates the corresponding native graphics resources.
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QHash< quint32, ID3D11UnorderedAccessView * > uavs
Definition qrhid3d11_p.h:46
QRhiBuffer::NativeBuffer nativeBuffer() override
ID3D11UnorderedAccessView * unorderedAccessView(quint32 offset)
QRhiRenderTarget * currentTarget
QD3D11RenderTargetData * prevRtD
static const int MAX_DYNAMIC_OFFSET_COUNT
QVarLengthArray< QRhiBufferData, 4 > bufferDataRetainPool
const uchar * retainBufferData(const QRhiBufferData &data)
ID3D11Buffer * currentVertexBuffers[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]
QVarLengthArray< QImage, 4 > imageRetainPool
static const int MAX_VERTEX_BUFFER_BINDING_COUNT
int retainResourceBatches(const QD3D11ShaderResourceBindings::ResourceBatches &resourceBatches)
QRhiShaderResourceBindings * currentGraphicsSrb
const uchar * retainImage(const QImage &image)
QD3D11CommandBuffer(QRhiImplementation *rhi)
const uchar * retainData(const QByteArray &data)
QRhiShaderResourceBindings * currentComputeSrb
QRhiBackendCommandList< Command > commands
QVarLengthArray< QD3D11ShaderResourceBindings::ResourceBatches, 4 > resourceBatchRetainPool
QVarLengthArray< QByteArray, 4 > dataRetainPool
QRhiComputePipeline * currentComputePipeline
ID3D11Buffer * currentIndexBuffer
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
DXGI_FORMAT currentIndexFormat
quint32 currentVertexOffsets[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]
QRhiGraphicsPipeline * currentGraphicsPipeline
ID3D11ComputeShader * shader
QD3D11ComputePipeline(QRhiImplementation *rhi)
bool create() override
QShader::NativeResourceBindingMap nativeResourceBindingMap
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
ID3D11DomainShader * shader
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QD3D11GraphicsPipeline(QRhiImplementation *rhi)
ID3D11VertexShader * shader
ID3D11PixelShader * shader
ID3D11InputLayout * inputLayout
ID3D11BlendState * blendState
ID3D11RasterizerState * rastState
ID3D11GeometryShader * shader
D3D11_PRIMITIVE_TOPOLOGY d3dTopology
bool create() override
Creates the corresponding native graphics resources.
ID3D11DepthStencilState * dsState
QShader::NativeResourceBindingMap nativeResourceBindingMap
ID3D11HullShader * shader
QD3D11RenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint)
ID3D11RenderTargetView * rtv
Definition qrhid3d11_p.h:63
DXGI_FORMAT dxgiFormat
Definition qrhid3d11_p.h:64
ID3D11DepthStencilView * dsv
Definition qrhid3d11_p.h:62
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
DXGI_SAMPLE_DESC sampleDesc
Definition qrhid3d11_p.h:65
bool create() override
Creates the corresponding native graphics resources.
QRhiTexture::Format backingFormat() const override
ID3D11Texture2D * tex
Definition qrhid3d11_p.h:61
QD3D11RenderPassDescriptor(QRhiImplementation *rhi)
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
bool isCompatible(const QRhiRenderPassDescriptor *other) const override
QVector< quint32 > serializedFormat() const override
static const int MAX_COLOR_ATTACHMENTS
ID3D11RenderTargetView * rtv[MAX_COLOR_ATTACHMENTS]
QD3D11RenderTargetData(QRhiImplementation *)
ID3D11DepthStencilView * dsv
QD3D11RenderPassDescriptor * rp
QRhiRenderTargetAttachmentTracker::ResIdList currentResIdList
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QD3D11Sampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, AddressMode u, AddressMode v, AddressMode w)
ID3D11SamplerState * samplerState
bool create() override
StageUniformBufferBatches dsUniformBufferBatches
StageUniformBufferBatches hsUniformBufferBatches
StageUniformBufferBatches csUniformBufferBatches
StageUniformBufferBatches gsUniformBufferBatches
StageUniformBufferBatches vsUniformBufferBatches
StageUniformBufferBatches fsUniformBufferBatches
QRhiBatchedBindings< ID3D11SamplerState * > samplers
QRhiBatchedBindings< ID3D11ShaderResourceView * > shaderresources
QRhiBatchedBindings< ID3D11UnorderedAccessView * > uavs
QRhiBatchedBindings< ID3D11Buffer * > ubufs
QD3D11GraphicsPipeline * lastUsedGraphicsPipeline
bool create() override
Creates the corresponding resource binding set.
QVarLengthArray< BoundResourceData, 8 > boundResourceData
QVarLengthArray< QRhiShaderResourceBinding, 8 > sortedBindings
void updateResources(UpdateFlags flags) override
QD3D11ComputePipeline * lastUsedComputePipeline
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QD3D11ShaderResourceBindings(QRhiImplementation *rhi)
int sampleCount() const override
QD3D11SwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
float devicePixelRatio() const override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QD3D11RenderTargetData d
QSize pixelSize() const override
bool prepare(QRhiD3D11 *rhiD)
bool tryQueryTimestamps(int idx, ID3D11DeviceContext *context, double *elapsedSec)
bool active[TIMESTAMP_PAIRS]
ID3D11Query * query[TIMESTAMP_PAIRS *2]
ID3D11Query * disjointQuery[TIMESTAMP_PAIRS]
static const int TIMESTAMP_PAIRS
QRhiSwapChainHdrInfo hdrInfo() override
\variable QRhiSwapChainHdrInfo::limitsType
HANDLE frameLatencyWaitableObject
QD3D11SwapChainTimestamps timestamps
QD3D11CommandBuffer cb
ID3D11RenderTargetView * backBufferRtv
int lastFrameLatencyWaitSlot
QWindow * window
QD3D11RenderBuffer * ds
QRhiRenderTarget * currentFrameRenderTarget() override
QD3D11SwapChainRenderTarget rtRight
ID3D11RenderTargetView * backBufferRtvRight
ID3D11Texture2D * msaaTex[BUFFER_COUNT]
DXGI_FORMAT colorFormat
QD3D11SwapChain(QRhiImplementation *rhi)
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
IDCompositionTarget * dcompTarget
QRhiRenderTarget * currentFrameRenderTarget(StereoTargetBuffer targetBuffer) override
ID3D11RenderTargetView * msaaRtv[BUFFER_COUNT]
bool createOrResize() override
Creates the swapchain if not already done and resizes the swapchain buffers to match the current size...
QSize surfacePixelSize() override
bool newColorBuffer(const QSize &size, DXGI_FORMAT format, DXGI_SAMPLE_DESC sampleDesc, ID3D11Texture2D **tex, ID3D11RenderTargetView **rtv) const
static const int BUFFER_COUNT
QD3D11SwapChainRenderTarget rt
bool isFormatSupported(Format f) override
DXGI_SAMPLE_DESC sampleDesc
IDCompositionVisual * dcompVisual
QRhiCommandBuffer * currentFrameCommandBuffer() override
int currentTimestampPairIndex
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
IDXGISwapChain * swapChain
DXGI_FORMAT srgbAdjustedColorFormat
ID3D11Texture2D * backBufferTex
QSize pixelSize() const override
QD3D11TextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags)
ID3D11DepthStencilView * dsv
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
float devicePixelRatio() const override
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
int sampleCount() const override
bool ownsRtv[QD3D11RenderTargetData::MAX_COLOR_ATTACHMENTS]
ID3D11RenderTargetView * rtv[QD3D11RenderTargetData::MAX_COLOR_ATTACHMENTS]
bool create() override
Creates the corresponding native graphics resources.
QD3D11RenderTargetData d
ID3D11Texture1D * tex1D
Definition qrhid3d11_p.h:94
bool create() override
Creates the corresponding native graphics resources.
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
bool createFrom(NativeTexture src) override
Similar to create(), except that no new native textures are created.
NativeTexture nativeTexture() override
ID3D11UnorderedAccessView * perLevelViews[QRhi::MAX_MIP_LEVELS]
ID3D11Texture2D * tex
Definition qrhid3d11_p.h:92
bool prepareCreate(QSize *adjustedSize=nullptr)
DXGI_FORMAT dxgiFormat
Definition qrhid3d11_p.h:97
QD3D11Texture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, Flags flags)
ID3D11UnorderedAccessView * unorderedAccessViewForLevel(int level)
DXGI_SAMPLE_DESC sampleDesc
Definition qrhid3d11_p.h:99
bool finishCreate()
ID3D11ShaderResourceView * srv
Definition qrhid3d11_p.h:96
ID3D11Texture3D * tex3D
Definition qrhid3d11_p.h:93
ID3D11Resource * textureResource() const
Definition qrhid3d11_p.h:83
ID3D11Buffer * stagingBuf
QRhiReadbackResult * result
OffscreenFrame(QRhiImplementation *rhi)
ID3D11Query * tsDisjointQuery
ID3D11Query * tsQueries[2]
QD3D11CommandBuffer cbWrapper
Shader(IUnknown *s, const QByteArray &bytecode, const QShader::NativeResourceBindingMap &rbm)
QByteArray bytecode
QRhiReadbackResult * result
QRhiTexture::Format format
QRhiReadbackDescription desc
ID3D11Texture2D * stagingTex
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1867
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1557
ID3D11DepthStencilView * dsv
bool update(QD3D11RenderTargetData *data, ID3D11UnorderedAccessView *const *uavs=nullptr, int count=0)
ID3D11RenderTargetView * rtv[QD3D11RenderTargetData::MAX_COLOR_ATTACHMENTS]
std::array< ID3D11UnorderedAccessView *, QD3D11RenderTargetData::MAX_COLOR_ATTACHMENTS > uav
ID3D11Buffer * buffers[MAX_VERTEX_BUFFER_BINDING_COUNT]
QD3D11RenderTargetData * swapchainData
ID3D11ShaderResourceView * srv
UINT offsets[MAX_VERTEX_BUFFER_BINDING_COUNT]
uint dynamicOffsetPairs[MAX_DYNAMIC_OFFSET_COUNT *2]
QD3D11ComputePipeline * ps
QD3D11GraphicsPipeline * ps
UINT strides[MAX_VERTEX_BUFFER_BINDING_COUNT]