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 QRhiSwapChain *createSwapChain() = 0;
75 virtual QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) = 0;
76 virtual QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) = 0;
77 virtual QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) = 0;
78 virtual QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) = 0;
79 virtual QRhi::FrameOpResult finish() = 0;
81 virtual void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) = 0;
83 virtual void beginPass(QRhiCommandBuffer *cb,
85 const QColor &colorClearValue,
86 const QRhiDepthStencilClearValue &depthStencilClearValue,
87 QRhiResourceUpdateBatch *resourceUpdates,
88 QRhiCommandBuffer::BeginPassFlags flags) = 0;
89 virtual void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) = 0;
91 virtual void setGraphicsPipeline(QRhiCommandBuffer *cb,
92 QRhiGraphicsPipeline *ps) = 0;
94 virtual void setShaderResources(QRhiCommandBuffer *cb,
95 QRhiShaderResourceBindings *srb,
96 int dynamicOffsetCount,
97 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) = 0;
99 virtual void setVertexInput(QRhiCommandBuffer *cb,
100 int startBinding,
int bindingCount,
const QRhiCommandBuffer::VertexInput *bindings,
101 QRhiBuffer *indexBuf, quint32 indexOffset,
102 QRhiCommandBuffer::IndexFormat indexFormat) = 0;
104 virtual void setViewport(QRhiCommandBuffer *cb,
const QRhiViewport &viewport) = 0;
105 virtual void setScissor(QRhiCommandBuffer *cb,
const QRhiScissor &scissor) = 0;
106 virtual void setBlendConstants(QRhiCommandBuffer *cb,
const QColor &c) = 0;
107 virtual void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) = 0;
108 virtual void setShadingRate(QRhiCommandBuffer *cb,
const QSize &coarsePixelSize) = 0;
110 virtual void draw(QRhiCommandBuffer *cb, quint32 vertexCount,
111 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) = 0;
112 virtual void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
113 quint32 instanceCount, quint32 firstIndex,
114 qint32 vertexOffset, quint32 firstInstance) = 0;
115 virtual void drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
116 quint32 offset, quint32 drawCount, quint32 stride) = 0;
117 virtual void drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
118 quint32 offset, quint32 drawCount, quint32 stride) = 0;
120 virtual void debugMarkBegin(QRhiCommandBuffer *cb,
const QByteArray &name) = 0;
121 virtual void debugMarkEnd(QRhiCommandBuffer *cb) = 0;
122 virtual void debugMarkMsg(QRhiCommandBuffer *cb,
const QByteArray &msg) = 0;
124 virtual void beginComputePass(QRhiCommandBuffer *cb,
125 QRhiResourceUpdateBatch *resourceUpdates,
126 QRhiCommandBuffer::BeginPassFlags flags) = 0;
127 virtual void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) = 0;
128 virtual void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) = 0;
129 virtual void dispatch(QRhiCommandBuffer *cb,
int x,
int y,
int z) = 0;
131 virtual const QRhiNativeHandles *nativeHandles(QRhiCommandBuffer *cb) = 0;
132 virtual void beginExternal(QRhiCommandBuffer *cb) = 0;
133 virtual void endExternal(QRhiCommandBuffer *cb) = 0;
134 virtual double lastCompletedGpuTime(QRhiCommandBuffer *cb) = 0;
136 virtual QList<
int> supportedSampleCounts()
const = 0;
137 virtual int ubufAlignment()
const = 0;
138 virtual QList<QSize> supportedShadingRates(
int sampleCount)
const = 0;
139 virtual bool isYUpInFramebuffer()
const = 0;
140 virtual bool isYUpInNDC()
const = 0;
141 virtual bool isClipDepthZeroToOne()
const = 0;
142 virtual QMatrix4x4 clipSpaceCorrMatrix()
const = 0;
143 virtual bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags)
const = 0;
144 virtual bool isFeatureSupported(QRhi::Feature feature)
const = 0;
145 virtual int resourceLimit(QRhi::ResourceLimit limit)
const = 0;
146 virtual const QRhiNativeHandles *nativeHandles() = 0;
147 virtual QRhiDriverInfo driverInfo()
const = 0;
148 virtual QRhiStats statistics() = 0;
149 virtual bool makeThreadLocalNativeContextCurrent() = 0;
150 virtual void setQueueSubmitParams(QRhiNativeHandles *params) = 0;
151 virtual void releaseCachedResources() = 0;
152 virtual bool isDeviceLost()
const = 0;
154 virtual QByteArray pipelineCacheData() = 0;
155 virtual void setPipelineCacheData(
const QByteArray &data) = 0;
157 static QRhiImplementation *newInstance(QRhi::Implementation impl, QRhiInitParams *params, QRhiNativeHandles *importDevice);
158 void prepareForCreate(QRhi *rhi, QRhi::Implementation impl, QRhi::Flags flags, QRhiAdapter *adapter);
160 bool isCompressedFormat(QRhiTexture::Format format)
const;
161 void compressedFormatInfo(QRhiTexture::Format format,
const QSize &size,
162 quint32 *bpl, quint32 *byteSize,
163 QSize *blockDim)
const;
164 void textureFormatInfo(QRhiTexture::Format format,
const QSize &size,
165 quint32 *bpl, quint32 *byteSize, quint32 *bytesPerPixel)
const;
166 bool isStencilSupportingFormat(QRhiTexture::Format format)
const;
168 void registerResource(QRhiResource *res,
bool ownsNativeResources =
true)
175 resources.insert(res, ownsNativeResources);
178 void unregisterResource(QRhiResource *res)
180 resources.remove(res);
183 void addDeleteLater(QRhiResource *res)
186 pendingDeleteResources.insert(res);
191 void addCleanupCallback(
const QRhi::CleanupCallback &callback)
193 cleanupCallbacks.append(callback);
196 void addCleanupCallback(
const void *key,
const QRhi::CleanupCallback &callback)
198 keyedCleanupCallbacks[key] = callback;
201 void removeCleanupCallback(
const void *key)
203 keyedCleanupCallbacks.remove(key);
206 bool sanityCheckGraphicsPipeline(QRhiGraphicsPipeline *ps);
207 bool sanityCheckShaderResourceBindings(QRhiShaderResourceBindings *srb);
208 bool sanityCheckResourceOwnership(QRhiResource *maybeResource);
209 void updateLayoutDesc(QRhiShaderResourceBindings *srb);
211 quint32 pipelineCacheRhiId()
const
213 const quint32 ver = (QT_VERSION_MAJOR << 16) | (QT_VERSION_MINOR << 8) | (QT_VERSION_PATCH);
214 return (quint32(implType) << 24) | ver;
217 void pipelineCreationStart()
219 pipelineCreationTimer.start();
222 void pipelineCreationEnd()
224 accumulatedPipelineCreationTime += pipelineCreationTimer.elapsed();
227 qint64 totalPipelineCreationTime()
const
229 return accumulatedPipelineCreationTime;
232 QRhiVertexInputAttribute::Format shaderDescVariableFormatToVertexInputFormat(QShaderDescription::VariableType type)
const;
233 quint32 byteSizePerVertexForVertexInputFormat(QRhiVertexInputAttribute::Format format)
const;
235 static const QRhiShaderResourceBinding::Data *shaderResourceBindingData(
const QRhiShaderResourceBinding &binding)
240 static QRhiShaderResourceBinding::Data *shaderResourceBindingData(QRhiShaderResourceBinding &binding)
245 static bool sortedBindingLessThan(
const QRhiShaderResourceBinding &a,
const QRhiShaderResourceBinding &b)
247 return a.d.binding < b.d.binding;
250 int effectiveSampleCount(
int sampleCount)
const;
251 QSize clampedSubResourceUploadSize(QSize size, QPoint dstPos,
int level, QSize textureSizeAtLevelZero,
bool warn =
true);
257 static const int MAX_SHADER_CACHE_ENTRIES = 128;
259 bool debugMarkers =
false;
260 int currentFrameSlot = 0;
261 bool inFrame =
false;
263 QRhiAdapter *requestedRhiAdapter =
nullptr;
266 QRhi::Implementation implType;
268 QVarLengthArray<QRhiResourceUpdateBatch *, 4> resUpdPool;
269 quint64 resUpdPoolMap = 0;
270 int lastResUpdIdx = -1;
271 QHash<QRhiResource *,
bool> resources;
272 QSet<QRhiResource *> pendingDeleteResources;
273 QVarLengthArray<QRhi::CleanupCallback, 4> cleanupCallbacks;
274 QHash<
const void *, QRhi::CleanupCallback> keyedCleanupCallbacks;
275 QElapsedTimer pipelineCreationTimer;
276 qint64 accumulatedPipelineCreationTime = 0;
279 friend class QRhiResourceUpdateBatchPrivate;
280 friend class QRhiBufferData;