xref: /aosp_15_r20/external/skia/src/gpu/ganesh/d3d/GrD3DResourceProvider.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrD3DResourceProvider_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrD3DResourceProvider_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/d3d/GrD3DTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkChecksum.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramDesc.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRingBuffer.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DCommandSignature.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DCpuDescriptorManager.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DDescriptorTableManager.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DPipeline.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DRootSignature.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/d3d/GrD3DUtil.h"
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker class GrD3DCommandSignature;
28*c8dee2aaSAndroid Build Coastguard Worker class GrD3DDirectCommandList;
29*c8dee2aaSAndroid Build Coastguard Worker class GrD3DGpu;
30*c8dee2aaSAndroid Build Coastguard Worker class GrD3DPipelineState;
31*c8dee2aaSAndroid Build Coastguard Worker class GrD3DRenderTarget;
32*c8dee2aaSAndroid Build Coastguard Worker class GrSamplerState;
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker class GrD3DResourceProvider {
35*c8dee2aaSAndroid Build Coastguard Worker public:
36*c8dee2aaSAndroid Build Coastguard Worker     GrD3DResourceProvider(GrD3DGpu*);
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     void destroyResources();
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<GrD3DDirectCommandList> findOrCreateDirectCommandList();
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     void recycleDirectCommandList(std::unique_ptr<GrD3DDirectCommandList>);
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DRootSignature> findOrCreateRootSignature(int numTextureSamplers,
45*c8dee2aaSAndroid Build Coastguard Worker                                                         int numUAVs = 0);
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DCommandSignature> findOrCreateCommandSignature(GrD3DCommandSignature::ForIndexed,
48*c8dee2aaSAndroid Build Coastguard Worker                                                               unsigned int slot);
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorHeap::CPUHandle createRenderTargetView(ID3D12Resource* textureResource);
51*c8dee2aaSAndroid Build Coastguard Worker     void recycleRenderTargetView(const GrD3DDescriptorHeap::CPUHandle&);
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorHeap::CPUHandle createDepthStencilView(ID3D12Resource* textureResource);
54*c8dee2aaSAndroid Build Coastguard Worker     void recycleDepthStencilView(const GrD3DDescriptorHeap::CPUHandle&);
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorHeap::CPUHandle createConstantBufferView(ID3D12Resource* bufferResource,
57*c8dee2aaSAndroid Build Coastguard Worker                                                             size_t offset,
58*c8dee2aaSAndroid Build Coastguard Worker                                                             size_t size);
59*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorHeap::CPUHandle createShaderResourceView(ID3D12Resource* resource,
60*c8dee2aaSAndroid Build Coastguard Worker                                                             unsigned int mostDetailedMip = 0,
61*c8dee2aaSAndroid Build Coastguard Worker                                                             unsigned int mipLevels = -1);
62*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorHeap::CPUHandle createUnorderedAccessView(ID3D12Resource* resource,
63*c8dee2aaSAndroid Build Coastguard Worker                                                              unsigned int mipSlice);
64*c8dee2aaSAndroid Build Coastguard Worker     void recycleShaderView(const GrD3DDescriptorHeap::CPUHandle&);
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker     D3D12_CPU_DESCRIPTOR_HANDLE findOrCreateCompatibleSampler(const GrSamplerState& params);
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DDescriptorTable> findOrCreateShaderViewTable(
69*c8dee2aaSAndroid Build Coastguard Worker             const std::vector<D3D12_CPU_DESCRIPTOR_HANDLE>& shaderViews);
70*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DDescriptorTable> findOrCreateSamplerTable(
71*c8dee2aaSAndroid Build Coastguard Worker             const std::vector<D3D12_CPU_DESCRIPTOR_HANDLE>& samplers);
descriptorTableMgr()72*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorTableManager* descriptorTableMgr() {
73*c8dee2aaSAndroid Build Coastguard Worker         return &fDescriptorTableManager;
74*c8dee2aaSAndroid Build Coastguard Worker     }
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     GrD3DPipelineState* findOrCreateCompatiblePipelineState(GrD3DRenderTarget*,
77*c8dee2aaSAndroid Build Coastguard Worker                                                             const GrProgramInfo&);
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DPipeline> findOrCreateMipmapPipeline();
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     D3D12_GPU_VIRTUAL_ADDRESS uploadConstantData(void* data, size_t size);
82*c8dee2aaSAndroid Build Coastguard Worker     void prepForSubmit();
83*c8dee2aaSAndroid Build Coastguard Worker 
markPipelineStateUniformsDirty()84*c8dee2aaSAndroid Build Coastguard Worker     void markPipelineStateUniformsDirty() { fPipelineStateCache->markPipelineStateUniformsDirty(); }
85*c8dee2aaSAndroid Build Coastguard Worker 
86*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
resetShaderCacheForTesting()87*c8dee2aaSAndroid Build Coastguard Worker     void resetShaderCacheForTesting() const { fPipelineStateCache->release(); }
88*c8dee2aaSAndroid Build Coastguard Worker #endif
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker private:
91*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
92*c8dee2aaSAndroid Build Coastguard Worker #define GR_PIPELINE_STATE_CACHE_STATS
93*c8dee2aaSAndroid Build Coastguard Worker #endif
94*c8dee2aaSAndroid Build Coastguard Worker 
95*c8dee2aaSAndroid Build Coastguard Worker     class PipelineStateCache : public ::SkNoncopyable {
96*c8dee2aaSAndroid Build Coastguard Worker     public:
97*c8dee2aaSAndroid Build Coastguard Worker         PipelineStateCache(GrD3DGpu* gpu);
98*c8dee2aaSAndroid Build Coastguard Worker         ~PipelineStateCache();
99*c8dee2aaSAndroid Build Coastguard Worker 
100*c8dee2aaSAndroid Build Coastguard Worker         void release();
101*c8dee2aaSAndroid Build Coastguard Worker         GrD3DPipelineState* refPipelineState(GrD3DRenderTarget*, const GrProgramInfo&);
102*c8dee2aaSAndroid Build Coastguard Worker 
103*c8dee2aaSAndroid Build Coastguard Worker         void markPipelineStateUniformsDirty();
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker     private:
106*c8dee2aaSAndroid Build Coastguard Worker         struct Entry;
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker         struct DescHash {
operatorDescHash109*c8dee2aaSAndroid Build Coastguard Worker             uint32_t operator()(const GrProgramDesc& desc) const {
110*c8dee2aaSAndroid Build Coastguard Worker                 return SkChecksum::Hash32(desc.asKey(), desc.keyLength());
111*c8dee2aaSAndroid Build Coastguard Worker             }
112*c8dee2aaSAndroid Build Coastguard Worker         };
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker         SkLRUCache<const GrProgramDesc, std::unique_ptr<Entry>, DescHash> fMap;
115*c8dee2aaSAndroid Build Coastguard Worker 
116*c8dee2aaSAndroid Build Coastguard Worker         GrD3DGpu* fGpu;
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker #ifdef GR_PIPELINE_STATE_CACHE_STATS
119*c8dee2aaSAndroid Build Coastguard Worker         int fTotalRequests;
120*c8dee2aaSAndroid Build Coastguard Worker         int fCacheMisses;
121*c8dee2aaSAndroid Build Coastguard Worker #endif
122*c8dee2aaSAndroid Build Coastguard Worker     };
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker     class DescriptorTableCache : public ::SkNoncopyable {
125*c8dee2aaSAndroid Build Coastguard Worker     public:
DescriptorTableCache(GrD3DGpu * gpu)126*c8dee2aaSAndroid Build Coastguard Worker         DescriptorTableCache(GrD3DGpu* gpu) : fGpu(gpu), fMap(64) {
127*c8dee2aaSAndroid Build Coastguard Worker             // Initialize the array we pass into CopyDescriptors for ranges.
128*c8dee2aaSAndroid Build Coastguard Worker             // At the moment any descriptor we pass into CopyDescriptors is only itself,
129*c8dee2aaSAndroid Build Coastguard Worker             // not the beginning of a range, so each range size is always 1.
130*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < kRangeSizesCount; ++i) {
131*c8dee2aaSAndroid Build Coastguard Worker                 fRangeSizes[i] = 1;
132*c8dee2aaSAndroid Build Coastguard Worker             }
133*c8dee2aaSAndroid Build Coastguard Worker         }
134*c8dee2aaSAndroid Build Coastguard Worker         ~DescriptorTableCache() = default;
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker         void release();
137*c8dee2aaSAndroid Build Coastguard Worker         typedef std::function<sk_sp<GrD3DDescriptorTable>(GrD3DGpu*, unsigned int)> CreateFunc;
138*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<GrD3DDescriptorTable> findOrCreateDescTable(
139*c8dee2aaSAndroid Build Coastguard Worker                 const std::vector<D3D12_CPU_DESCRIPTOR_HANDLE>&, CreateFunc);
140*c8dee2aaSAndroid Build Coastguard Worker 
141*c8dee2aaSAndroid Build Coastguard Worker     private:
142*c8dee2aaSAndroid Build Coastguard Worker         GrD3DGpu* fGpu;
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker         typedef std::vector<D3D12_CPU_DESCRIPTOR_HANDLE> DescTableKey;
145*c8dee2aaSAndroid Build Coastguard Worker         typedef sk_sp<GrD3DDescriptorTable> DescTableValue;
146*c8dee2aaSAndroid Build Coastguard Worker         struct DescTableHash {
operatorDescTableHash147*c8dee2aaSAndroid Build Coastguard Worker             uint32_t operator()(DescTableKey key) const {
148*c8dee2aaSAndroid Build Coastguard Worker                 return SkChecksum::Hash32(key.data(),
149*c8dee2aaSAndroid Build Coastguard Worker                                           key.size() * sizeof(D3D12_CPU_DESCRIPTOR_HANDLE));
150*c8dee2aaSAndroid Build Coastguard Worker             }
151*c8dee2aaSAndroid Build Coastguard Worker         };
152*c8dee2aaSAndroid Build Coastguard Worker         SkLRUCache<DescTableKey, DescTableValue, DescTableHash> fMap;
153*c8dee2aaSAndroid Build Coastguard Worker         inline static constexpr int kRangeSizesCount = 8;
154*c8dee2aaSAndroid Build Coastguard Worker         unsigned int fRangeSizes[kRangeSizesCount];
155*c8dee2aaSAndroid Build Coastguard Worker     };
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     GrD3DGpu* fGpu;
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<4, std::unique_ptr<GrD3DDirectCommandList>> fAvailableDirectCommandLists;
160*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<4, sk_sp<GrD3DRootSignature>> fRootSignatures;
161*c8dee2aaSAndroid Build Coastguard Worker     skia_private::STArray<2, sk_sp<GrD3DCommandSignature>> fCommandSignatures;
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker     GrD3DCpuDescriptorManager fCpuDescriptorManager;
164*c8dee2aaSAndroid Build Coastguard Worker     GrD3DDescriptorTableManager fDescriptorTableManager;
165*c8dee2aaSAndroid Build Coastguard Worker 
166*c8dee2aaSAndroid Build Coastguard Worker     std::unique_ptr<PipelineStateCache> fPipelineStateCache;
167*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrD3DPipeline> fMipmapPipeline;
168*c8dee2aaSAndroid Build Coastguard Worker 
169*c8dee2aaSAndroid Build Coastguard Worker     skia_private::THashMap<uint32_t, D3D12_CPU_DESCRIPTOR_HANDLE> fSamplers;
170*c8dee2aaSAndroid Build Coastguard Worker 
171*c8dee2aaSAndroid Build Coastguard Worker     DescriptorTableCache fShaderResourceDescriptorTableCache;
172*c8dee2aaSAndroid Build Coastguard Worker     DescriptorTableCache fSamplerDescriptorTableCache;
173*c8dee2aaSAndroid Build Coastguard Worker };
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker #endif
176