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