36class QRhiImplementation
39 virtual ~QRhiImplementation();
41 virtual bool create(QRhi::Flags flags) = 0;
42 virtual void destroy() = 0;
43 virtual QRhi::AdapterList enumerateAdaptersBeforeCreate(QRhiNativeHandles *nativeHandles)
const;
45 virtual QRhiGraphicsPipeline *createGraphicsPipeline() = 0;
46 virtual QRhiComputePipeline *createComputePipeline() = 0;
47 virtual QRhiShaderResourceBindings *createShaderResourceBindings() = 0;
48 virtual QRhiBuffer *createBuffer(QRhiBuffer::Type type,
49 QRhiBuffer::UsageFlags usage,
51 virtual QRhiRenderBuffer *createRenderBuffer(QRhiRenderBuffer::Type type,
52 const QSize &pixelSize,
54 QRhiRenderBuffer::Flags flags,
55 QRhiTexture::Format backingFormatHint) = 0;
56 virtual QRhiTexture *createTexture(QRhiTexture::Format format,
57 const QSize &pixelSize,
61 QRhiTexture::Flags flags) = 0;
62 virtual QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
63 QRhiSampler::Filter minFilter,
64 QRhiSampler::Filter mipmapMode,
65 QRhiSampler:: AddressMode u,
66 QRhiSampler::AddressMode v,
67 QRhiSampler::AddressMode w) = 0;
69 virtual QRhiTextureRenderTarget *createTextureRenderTarget(
const QRhiTextureRenderTargetDescription &desc,
70 QRhiTextureRenderTarget::Flags flags) = 0;
72 virtual QRhiShadingRateMap *createShadingRateMap() = 0;
74 virtual QRhiIndirectCommandBuffer *createIndirectCommandBuffer(QRhiIndirectCommandBuffer::Type type,
75 quint32 maxCommandCount);
76 virtual void buildIndirect(QRhiCommandBuffer *cb, QRhiIndirectCommandBuffer *icb,
77 const QRhiIndirectCommandBufferBuildInfo &info);
78 virtual void executeIndirect(QRhiCommandBuffer *cb, QRhiIndirectCommandBuffer *icb,
79 quint32 firstCommand, quint32 commandCount);
80 virtual void commitIndirectCommandBuffer(QRhiResourceUpdateBatch *u,
81 QRhiIndirectCommandBuffer *icb);
83 virtual QRhiSwapChain *createSwapChain() = 0;
84 virtual QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) = 0;
85 virtual QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) = 0;
86 virtual QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) = 0;
87 virtual QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) = 0;
88 virtual QRhi::FrameOpResult finish() = 0;
90 virtual void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) = 0;
92 virtual void beginPass(QRhiCommandBuffer *cb,
94 const QColor &colorClearValue,
95 const QRhiDepthStencilClearValue &depthStencilClearValue,
96 QRhiResourceUpdateBatch *resourceUpdates,
97 QRhiCommandBuffer::BeginPassFlags flags) = 0;
98 virtual void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) = 0;
100 virtual void setGraphicsPipeline(QRhiCommandBuffer *cb,
101 QRhiGraphicsPipeline *ps) = 0;
103 virtual void setShaderResources(QRhiCommandBuffer *cb,
104 QRhiShaderResourceBindings *srb,
105 int dynamicOffsetCount,
106 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) = 0;
108 virtual void setVertexInput(QRhiCommandBuffer *cb,
109 int startBinding,
int bindingCount,
const QRhiCommandBuffer::VertexInput *bindings,
110 QRhiBuffer *indexBuf, quint32 indexOffset,
111 QRhiCommandBuffer::IndexFormat indexFormat) = 0;
113 virtual void setViewport(QRhiCommandBuffer *cb,
const QRhiViewport &viewport) = 0;
114 virtual void setScissor(QRhiCommandBuffer *cb,
const QRhiScissor &scissor) = 0;
115 virtual void setBlendConstants(QRhiCommandBuffer *cb,
const QColor &c) = 0;
116 virtual void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) = 0;
117 virtual void setShadingRate(QRhiCommandBuffer *cb,
const QSize &coarsePixelSize) = 0;
119 virtual void draw(QRhiCommandBuffer *cb, quint32 vertexCount,
120 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) = 0;
121 virtual void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
122 quint32 instanceCount, quint32 firstIndex,
123 qint32 vertexOffset, quint32 firstInstance) = 0;
124 virtual void drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
125 quint32 offset, quint32 drawCount, quint32 stride) = 0;
126 virtual void drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
127 quint32 offset, quint32 drawCount, quint32 stride) = 0;
128 virtual void drawIndirectCount(QRhiCommandBuffer *cb,
129 QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset,
130 QRhiBuffer *countBuffer, quint32 countBufferOffset,
131 quint32 maxDrawCount, quint32 stride) = 0;
132 virtual void drawIndexedIndirectCount(QRhiCommandBuffer *cb,
133 QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset,
134 QRhiBuffer *countBuffer, quint32 countBufferOffset,
135 quint32 maxDrawCount, quint32 stride) = 0;
137 virtual void debugMarkBegin(QRhiCommandBuffer *cb,
const QByteArray &name) = 0;
138 virtual void debugMarkEnd(QRhiCommandBuffer *cb) = 0;
139 virtual void debugMarkMsg(QRhiCommandBuffer *cb,
const QByteArray &msg) = 0;
141 virtual void beginComputePass(QRhiCommandBuffer *cb,
142 QRhiResourceUpdateBatch *resourceUpdates,
143 QRhiCommandBuffer::BeginPassFlags flags) = 0;
144 virtual void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) = 0;
145 virtual void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) = 0;
146 virtual void dispatch(QRhiCommandBuffer *cb,
int x,
int y,
int z) = 0;
147 virtual void dispatchIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
150 virtual const QRhiNativeHandles *nativeHandles(QRhiCommandBuffer *cb) = 0;
151 virtual void beginExternal(QRhiCommandBuffer *cb) = 0;
152 virtual void endExternal(QRhiCommandBuffer *cb) = 0;
153 virtual double lastCompletedGpuTime(QRhiCommandBuffer *cb) = 0;
155 virtual QList<
int> supportedSampleCounts()
const = 0;
156 virtual int ubufAlignment()
const = 0;
157 virtual QList<QSize> supportedShadingRates(
int sampleCount)
const = 0;
158 virtual bool isYUpInFramebuffer()
const = 0;
159 virtual bool isYUpInNDC()
const = 0;
160 virtual bool isClipDepthZeroToOne()
const = 0;
161 virtual QMatrix4x4 clipSpaceCorrMatrix()
const = 0;
162 virtual bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags)
const = 0;
163 virtual bool isFeatureSupported(QRhi::Feature feature)
const = 0;
164 virtual int resourceLimit(QRhi::ResourceLimit limit)
const = 0;
165 virtual const QRhiNativeHandles *nativeHandles() = 0;
166 virtual QRhiDriverInfo driverInfo()
const = 0;
167 virtual QRhiStats statistics() = 0;
168 virtual bool makeThreadLocalNativeContextCurrent() = 0;
169 virtual void setQueueSubmitParams(QRhiNativeHandles *params) = 0;
170 virtual void releaseCachedResources() = 0;
171 virtual bool isDeviceLost()
const = 0;
173 virtual QByteArray pipelineCacheData() = 0;
174 virtual void setPipelineCacheData(
const QByteArray &data) = 0;
176 static QRhiImplementation *newInstance(QRhi::Implementation impl, QRhiInitParams *params, QRhiNativeHandles *importDevice);
177 void prepareForCreate(QRhi *rhi, QRhi::Implementation impl, QRhi::Flags flags, QRhiAdapter *adapter);
179 bool isCompressedFormat(QRhiTexture::Format format)
const;
180 bool compressedFormatInfo(QRhiTexture::Format format,
const QSize &size,
181 quint32 *bpl, quint32 *byteSize,
182 QSize *blockDim)
const;
183 bool textureFormatInfo(QRhiTexture::Format format,
const QSize &size,
184 quint32 *bpl, quint32 *byteSize, quint32 *bytesPerPixel)
const;
185 bool isStencilSupportingFormat(QRhiTexture::Format format)
const;
187 void registerResource(QRhiResource *res,
bool ownsNativeResources =
true)
194 resources.insert(res, ownsNativeResources);
197 void unregisterResource(QRhiResource *res)
199 resources.remove(res);
202 void addDeleteLater(QRhiResource *res)
205 pendingDeleteResources.insert(res);
210 void addCleanupCallback(
const QRhi::CleanupCallback &callback)
212 cleanupCallbacks.append(callback);
215 void addCleanupCallback(
const void *key,
const QRhi::CleanupCallback &callback)
217 keyedCleanupCallbacks[key] = callback;
220 void removeCleanupCallback(
const void *key)
222 keyedCleanupCallbacks.remove(key);
225 bool sanityCheckGraphicsPipeline(QRhiGraphicsPipeline *ps);
226 bool sanityCheckShaderResourceBindings(QRhiShaderResourceBindings *srb);
227 bool sanityCheckResourceOwnership(QRhiResource *maybeResource);
228 void updateLayoutDesc(QRhiShaderResourceBindings *srb);
230 quint32 pipelineCacheRhiId()
const
232 const quint32 ver = (QT_VERSION_MAJOR << 16) | (QT_VERSION_MINOR << 8) | (QT_VERSION_PATCH);
233 return (quint32(implType) << 24) | ver;
236 void pipelineCreationStart()
238 pipelineCreationTimer.start();
241 void pipelineCreationEnd()
243 accumulatedPipelineCreationTime += pipelineCreationTimer.elapsed();
246 qint64 totalPipelineCreationTime()
const
248 return accumulatedPipelineCreationTime;
251 QRhiVertexInputAttribute::Format shaderDescVariableFormatToVertexInputFormat(QShaderDescription::VariableType type)
const;
252 quint32 byteSizePerVertexForVertexInputFormat(QRhiVertexInputAttribute::Format format)
const;
254 static const QRhiShaderResourceBinding::Data *shaderResourceBindingData(
const QRhiShaderResourceBinding &binding)
259 static QRhiShaderResourceBinding::Data *shaderResourceBindingData(QRhiShaderResourceBinding &binding)
264 static bool sortedBindingLessThan(
const QRhiShaderResourceBinding &a,
const QRhiShaderResourceBinding &b)
266 return a.d.binding < b.d.binding;
269 int effectiveSampleCount(
int sampleCount)
const;
270 QSize clampedSubResourceUploadSize(QSize size, QPoint dstPos,
int level, QSize textureSizeAtLevelZero,
bool warn =
true);
271 QSize clampedSubResourceUploadSizeForSourceData(QSize size, quint32 bpl, quint32 bytesPerPixel,
272 qsizetype dataSize,
bool warn =
true);
278 static const int MAX_SHADER_CACHE_ENTRIES = 128;
280 bool debugMarkers =
false;
281 int currentFrameSlot = 0;
282 bool inFrame =
false;
284 QRhiAdapter *requestedRhiAdapter =
nullptr;
287 QRhi::Implementation implType;
289 QVarLengthArray<QRhiResourceUpdateBatch *, 4> resUpdPool;
290 quint64 resUpdPoolMap = 0;
291 int lastResUpdIdx = -1;
292 QHash<QRhiResource *,
bool> resources;
293 QSet<QRhiResource *> pendingDeleteResources;
294 QVarLengthArray<QRhi::CleanupCallback, 4> cleanupCallbacks;
295 QHash<
const void *, QRhi::CleanupCallback> keyedCleanupCallbacks;
296 QElapsedTimer pipelineCreationTimer;
297 qint64 accumulatedPipelineCreationTime = 0;
300 friend class QRhiResourceUpdateBatchPrivate;
301 friend class QRhiBufferData;