Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GrD3DGpu.h
Go to the documentation of this file.
1/*
2 * Copyright 2020 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrD3DGpu_DEFINED
9#define GrD3DGpu_DEFINED
10
19
22struct GrD3DOptions;
23class GrPipeline;
24#if defined(GR_TEST_UTILS)
25struct IDXGraphicsAnalysis;
26#endif
27
28class GrD3DGpu : public GrGpu {
29public:
30 static std::unique_ptr<GrGpu> Make(const GrD3DBackendContext& backendContext,
31 const GrContextOptions&,
33
34 ~GrD3DGpu() override;
35
36 const GrD3DCaps& d3dCaps() const { return static_cast<const GrD3DCaps&>(*this->caps()); }
37
38 GrD3DResourceProvider& resourceProvider() { return fResourceProvider; }
39
42
43 ID3D12Device* device() const { return fDevice.get(); }
44 ID3D12CommandQueue* queue() const { return fQueue.get(); }
45
46 GrD3DMemoryAllocator* memoryAllocator() const { return fMemoryAllocator.get(); }
47
48 GrD3DDirectCommandList* currentCommandList() const { return fCurrentDirectCommandList.get(); }
49
50 GrStagingBufferManager* stagingBufferManager() override { return &fStagingBufferManager; }
52
53 GrRingBuffer* uniformsRingBuffer() override { return &fConstantsRingBuffer; }
54
55 bool protectedContext() const { return false; }
56
58
59 void deleteBackendTexture(const GrBackendTexture&) override;
60
61 bool compile(const GrProgramDesc&, const GrProgramInfo&) override;
62
63#if defined(GR_TEST_UTILS)
64 bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override;
65
66 GrBackendRenderTarget createTestingOnlyBackendRenderTarget(SkISize dimensions,
68 int sampleCnt,
69 GrProtected) override;
70 void deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) override;
71
72 void testingOnly_startCapture() override;
73 void testingOnly_stopCapture() override;
74
75 void resetShaderCacheForTesting() const override {
76 fResourceProvider.resetShaderCacheForTesting();
77 }
78#endif
79
81 SkISize dimensions, int numStencilSamples) override;
82
84 return GrBackendFormat::MakeDxgi(this->d3dCaps().preferredStencilFormat());
85 }
86
89 int numSamples,
90 GrProtected isProtected,
91 GrMemoryless isMemoryless) override {
92 return nullptr;
93 }
94
96 int numBarriers,
97 D3D12_RESOURCE_TRANSITION_BARRIER* barriers) const;
98
100 int numBarriers,
101 D3D12_RESOURCE_TRANSITION_BARRIER* barriers) const;
102
103 [[nodiscard]] std::unique_ptr<GrSemaphore> makeSemaphore(bool isOwned) override;
104 std::unique_ptr<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore&,
106 GrWrapOwnership) override;
107 void insertSemaphore(GrSemaphore* semaphore) override;
108 void waitSemaphore(GrSemaphore* semaphore) override;
109 std::unique_ptr<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override {
110 return nullptr;
111 }
112
113 void submit(GrOpsRenderPass* renderPass) override;
115 const SkIRect& bounds);
116
117 void checkFinishProcs() override { this->checkForFinishedCommandLists(); }
118 void finishOutstandingGpuWork() override;
119
120private:
121 enum class SyncQueue {
122 kForce,
123 kSkip
124 };
125
128
129 void destroyResources();
130
132 const GrBackendFormat&,
134 int renderTargetSampleCnt,
137 int mipLevelCount,
138 uint32_t levelClearMask,
139 std::string_view label) override;
140
142 const GrBackendFormat&,
146 const void* data,
147 size_t dataSize) override;
148
152 GrIOType) override;
155 GrWrapCacheable) override;
156
158 int sampleCnt,
160 GrWrapCacheable) override;
161
163
164 sk_sp<GrGpuBuffer> onCreateBuffer(size_t sizeInBytes,
166 GrAccessPattern) override;
167
169 SkIRect,
170 GrColorType surfaceColorType,
171 GrColorType dstColorType,
172 void*,
173 size_t rowBytes) override;
174
176 SkIRect,
177 GrColorType surfaceColorType,
178 GrColorType srcColorType,
179 const GrMipLevel[],
180 int mipLevelCount,
181 bool prepForTexSampling) override;
182
184 size_t srcOffset,
186 size_t dstOffset,
187 size_t size) override;
188
190 SkIRect,
191 GrColorType surfaceColorType,
192 GrColorType bufferColorType,
194 size_t offset,
195 size_t rowBytes) override;
196
198 SkIRect,
199 GrColorType surfaceColorType,
200 GrColorType bufferColorType,
202 size_t offset) override;
203
204 bool onCopySurface(GrSurface* dst, const SkIRect& dstRect,
205 GrSurface* src, const SkIRect& srcRect,
206 GrSamplerState::Filter) override;
207
208 bool onRegenerateMipMapLevels(GrTexture*) override;
209
210 void onResolveRenderTarget(GrRenderTarget* target, const SkIRect&) override;
211
212 void addFinishedProc(GrGpuFinishedProc finishedProc,
213 GrGpuFinishedContext finishedContext) override;
214 void addFinishedCallback(sk_sp<skgpu::RefCntedCallback> finishedCallback);
215
218 bool useMSAASurface,
221 const SkIRect&,
225 GrXferBarrierFlags renderPassXferBarriers) override;
226
230 const skgpu::MutableTextureState* newState) override;
231
232 bool onSubmitToGpu(GrSyncCpu sync) override;
233
235 const GrBackendFormat&,
239 std::string_view label) override;
240
242 sk_sp<skgpu::RefCntedCallback> finishedCallback,
243 std::array<float, 4> color) override;
244
246 const GrBackendFormat&,
248 GrProtected) override;
249
251 sk_sp<skgpu::RefCntedCallback> finishedCallback,
252 const void* data,
253 size_t size) override;
254
255 bool submitDirectCommandList(SyncQueue sync);
256
257 void checkForFinishedCommandLists();
258 void waitForQueueCompletion();
259
260 void copySurfaceAsCopyTexture(GrSurface* dst, GrSurface* src, GrD3DTextureResource* dstResource,
261 GrD3DTextureResource* srcResource, const SkIRect& srcRect,
262 const SkIPoint& dstPoint);
263
264 void copySurfaceAsResolve(GrSurface* dst, GrSurface* src, const SkIRect& srcRect,
265 const SkIPoint& dstPoint);
266 void resolveTexture(GrSurface* dst, int32_t dstX, int32_t dstY,
267 GrD3DRenderTarget* src, const SkIRect& srcRect);
268
269 sk_sp<GrD3DTexture> createD3DTexture(SkISize,
270 DXGI_FORMAT,
272 int renderTargetSampleCnt,
275 int mipLevelCount,
277 std::string_view label);
278
279 bool uploadToTexture(GrD3DTexture* tex,
280 SkIRect rect,
282 const GrMipLevel texels[],
283 int mipLevelCount);
284
285 void readOrTransferPixels(GrD3DTextureResource* texResource,
286 SkIRect rect,
287 sk_sp<GrGpuBuffer> transferBuffer,
288 const D3D12_PLACED_SUBRESOURCE_FOOTPRINT& placedFootprint);
289
290 bool createTextureResourceForBackendSurface(DXGI_FORMAT dxgiFormat,
291 SkISize dimensions,
292 GrTexturable texturable,
293 GrRenderable renderable,
294 skgpu::Mipmapped mipmapped,
295 int sampleCnt,
297 GrProtected isProtected);
298
299 gr_cp<ID3D12Device> fDevice;
301
302 sk_sp<GrD3DMemoryAllocator> fMemoryAllocator;
303
304 GrD3DResourceProvider fResourceProvider;
305 GrStagingBufferManager fStagingBufferManager;
306 GrRingBuffer fConstantsRingBuffer;
307
308 gr_cp<ID3D12Fence> fFence;
309 uint64_t fCurrentFenceValue = 0;
310
311 std::unique_ptr<GrD3DDirectCommandList> fCurrentDirectCommandList;
312 // One-off special-case descriptors created directly for the mipmap compute shader
313 // and hence aren't tracked by the normal path.
315
316 struct OutstandingCommandList {
317 OutstandingCommandList(std::unique_ptr<GrD3DDirectCommandList> commandList,
318 uint64_t fenceValue)
319 : fCommandList(std::move(commandList)), fFenceValue(fenceValue) {
320 }
321 std::unique_ptr<GrD3DDirectCommandList> fCommandList;
322 uint64_t fFenceValue;
323 };
324
325 SkDeque fOutstandingCommandLists;
326
327 std::unique_ptr<GrD3DOpsRenderPass> fCachedOpsRenderPass;
328
329#if defined(GR_TEST_UTILS)
330 IDXGraphicsAnalysis* fGraphicsAnalysis;
331#endif
332
333 using INHERITED = GrGpu;
334};
335
336#endif
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
GrWrapCacheable
Definition GrTypesPriv.h:84
GrIOType
GrMipmapStatus
GrWrapOwnership
Definition GrTypesPriv.h:76
GrGpuBufferType
GrMemoryless
GrTexturable
Definition GrTypesPriv.h:63
GrSemaphoreWrapType
GrColorType
GrAccessPattern
GrSurfaceOrigin
Definition GrTypes.h:147
void * GrGpuFinishedContext
Definition GrTypes.h:178
void(* GrGpuFinishedProc)(GrGpuFinishedContext finishedContext)
Definition GrTypes.h:179
GrSyncCpu
Definition GrTypes.h:239
GrXferBarrierType
GrXferBarrierFlags
SkColor4f color
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
SkFilterMode
sk_sp< GrTexture > onWrapCompressedBackendTexture(const GrBackendTexture &, GrWrapOwnership, GrWrapCacheable) override
void deleteBackendTexture(const GrBackendTexture &) override
bool onRegenerateMipMapLevels(GrTexture *) override
void addBufferResourceBarriers(GrD3DBuffer *buffer, int numBarriers, D3D12_RESOURCE_TRANSITION_BARRIER *barriers) const
GrD3DDirectCommandList * currentCommandList() const
Definition GrD3DGpu.h:48
void submit(GrOpsRenderPass *renderPass) override
Definition GrD3DGpu.cpp:233
void insertSemaphore(GrSemaphore *semaphore) override
sk_sp< GrGpuBuffer > onCreateBuffer(size_t sizeInBytes, GrGpuBufferType, GrAccessPattern) override
const GrD3DCaps & d3dCaps() const
Definition GrD3DGpu.h:36
static std::unique_ptr< GrGpu > Make(const GrD3DBackendContext &backendContext, const GrContextOptions &, GrDirectContext *)
Definition GrD3DGpu.cpp:50
~GrD3DGpu() override
Definition GrD3DGpu.cpp:109
GrOpsRenderPass * onGetOpsRenderPass(GrRenderTarget *, bool useMSAASurface, GrAttachment *, GrSurfaceOrigin, const SkIRect &, const GrOpsRenderPass::LoadAndStoreInfo &, const GrOpsRenderPass::StencilLoadAndStoreInfo &, const skia_private::TArray< GrSurfaceProxy *, true > &sampledProxies, GrXferBarrierFlags renderPassXferBarriers) override
Definition GrD3DGpu.cpp:139
ID3D12CommandQueue * queue() const
Definition GrD3DGpu.h:44
GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions, const GrBackendFormat &, skgpu::Mipmapped, GrProtected) override
std::unique_ptr< GrSemaphore > wrapBackendSemaphore(const GrBackendSemaphore &, GrSemaphoreWrapType, GrWrapOwnership) override
sk_sp< GrAttachment > makeMSAAAttachment(SkISize dimensions, const GrBackendFormat &format, int numSamples, GrProtected isProtected, GrMemoryless isMemoryless) override
Definition GrD3DGpu.h:87
bool onTransferFromBufferToBuffer(sk_sp< GrGpuBuffer > src, size_t srcOffset, sk_sp< GrGpuBuffer > dst, size_t dstOffset, size_t size) override
Definition GrD3DGpu.cpp:816
void addFinishedProc(GrGpuFinishedProc finishedProc, GrGpuFinishedContext finishedContext) override
Definition GrD3DGpu.cpp:245
void prepareSurfacesForBackendAccessAndStateUpdates(SkSpan< GrSurfaceProxy * > proxies, SkSurfaces::BackendSurfaceAccess access, const skgpu::MutableTextureState *newState) override
GrBackendFormat getPreferredStencilFormat(const GrBackendFormat &) override
Definition GrD3DGpu.h:83
bool onSubmitToGpu(GrSyncCpu sync) override
void checkFinishProcs() override
Definition GrD3DGpu.h:117
void waitSemaphore(GrSemaphore *semaphore) override
bool onTransferPixelsFrom(GrSurface *, SkIRect, GrColorType surfaceColorType, GrColorType bufferColorType, sk_sp< GrGpuBuffer >, size_t offset) override
Definition GrD3DGpu.cpp:908
GrD3DMemoryAllocator * memoryAllocator() const
Definition GrD3DGpu.h:46
bool onReadPixels(GrSurface *, SkIRect, GrColorType surfaceColorType, GrColorType dstColorType, void *, size_t rowBytes) override
Definition GrD3DGpu.cpp:586
void addResourceBarriers(sk_sp< GrManagedResource > resource, int numBarriers, D3D12_RESOURCE_TRANSITION_BARRIER *barriers) const
void takeOwnershipOfBuffer(sk_sp< GrGpuBuffer >) override
GrBackendTexture onCreateBackendTexture(SkISize dimensions, const GrBackendFormat &, GrRenderable, skgpu::Mipmapped, GrProtected, std::string_view label) override
void onResolveRenderTarget(GrRenderTarget *target, const SkIRect &) override
Definition GrD3DGpu.cpp:578
void xferBarrier(GrRenderTarget *, GrXferBarrierType) override
Definition GrD3DGpu.h:57
void endRenderPass(GrRenderTarget *target, GrSurfaceOrigin origin, const SkIRect &bounds)
Definition GrD3DGpu.cpp:240
GrD3DResourceProvider & resourceProvider()
Definition GrD3DGpu.h:38
sk_sp< GrThreadSafePipelineBuilder > refPipelineBuilder() override
Definition GrD3DGpu.cpp:45
GrRingBuffer * uniformsRingBuffer() override
Definition GrD3DGpu.h:53
std::unique_ptr< GrSemaphore > makeSemaphore(bool isOwned) override
GrThreadSafePipelineBuilder * pipelineBuilder() override
Definition GrD3DGpu.cpp:41
bool protectedContext() const
Definition GrD3DGpu.h:55
sk_sp< GrTexture > onCreateCompressedTexture(SkISize dimensions, const GrBackendFormat &, skgpu::Budgeted, skgpu::Mipmapped, GrProtected, const void *data, size_t dataSize) override
Definition GrD3DGpu.cpp:358
bool onUpdateCompressedBackendTexture(const GrBackendTexture &, sk_sp< skgpu::RefCntedCallback > finishedCallback, const void *data, size_t size) override
sk_sp< GrTexture > onWrapRenderableBackendTexture(const GrBackendTexture &, int sampleCnt, GrWrapOwnership, GrWrapCacheable) override
ID3D12Device * device() const
Definition GrD3DGpu.h:43
sk_sp< GrTexture > onCreateTexture(SkISize, const GrBackendFormat &, GrRenderable, int renderTargetSampleCnt, skgpu::Budgeted, GrProtected, int mipLevelCount, uint32_t levelClearMask, std::string_view label) override
Definition GrD3DGpu.cpp:309
void finishOutstandingGpuWork() override
std::unique_ptr< GrSemaphore > prepareTextureForCrossContextUsage(GrTexture *) override
Definition GrD3DGpu.h:109
bool onTransferPixelsTo(GrTexture *, SkIRect, GrColorType surfaceColorType, GrColorType bufferColorType, sk_sp< GrGpuBuffer >, size_t offset, size_t rowBytes) override
Definition GrD3DGpu.cpp:840
sk_sp< GrRenderTarget > onWrapBackendRenderTarget(const GrBackendRenderTarget &) override
bool onCopySurface(GrSurface *dst, const SkIRect &dstRect, GrSurface *src, const SkIRect &srcRect, GrSamplerState::Filter) override
Definition GrD3DGpu.cpp:442
sk_sp< GrAttachment > makeStencilAttachment(const GrBackendFormat &, SkISize dimensions, int numStencilSamples) override
GrStagingBufferManager * stagingBufferManager() override
Definition GrD3DGpu.h:50
sk_sp< GrTexture > onWrapBackendTexture(const GrBackendTexture &, GrWrapOwnership, GrWrapCacheable, GrIOType) override
Definition GrD3DGpu.cpp:987
bool onWritePixels(GrSurface *, SkIRect, GrColorType surfaceColorType, GrColorType srcColorType, const GrMipLevel[], int mipLevelCount, bool prepForTexSampling) override
Definition GrD3DGpu.cpp:688
bool onClearBackendTexture(const GrBackendTexture &, sk_sp< skgpu::RefCntedCallback > finishedCallback, std::array< float, 4 > color) override
Definition GrGpu.h:62
const GrCaps * caps() const
Definition GrGpu.h:73
T * get() const
Definition GrD3DTypes.h:108
T * get() const
Definition SkRefCnt.h:303
static const uint8_t buffer[]
uint32_t uint32_t * format
uint32_t * target
BackendSurfaceAccess
Definition SkSurface.h:44
Budgeted
Definition GpuTypes.h:35
Renderable
Definition GpuTypes.h:69
Mipmapped
Definition GpuTypes.h:53
Protected
Definition GpuTypes.h:61
Definition ref_ptr.h:256
Point offset