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