1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 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 skgpu_graphite_DawnResourceProvider_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_DawnResourceProvider_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/dawn/DawnTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/PipelineData.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceProvider.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class DawnGraphicsPipeline; 20*c8dee2aaSAndroid Build Coastguard Worker class DawnSampler; 21*c8dee2aaSAndroid Build Coastguard Worker class DawnSharedContext; 22*c8dee2aaSAndroid Build Coastguard Worker class DawnTexture; 23*c8dee2aaSAndroid Build Coastguard Worker class DawnBuffer; 24*c8dee2aaSAndroid Build Coastguard Worker class DawnCommandBuffer; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker class DawnResourceProvider final : public ResourceProvider { 27*c8dee2aaSAndroid Build Coastguard Worker public: 28*c8dee2aaSAndroid Build Coastguard Worker template <size_t NumEntries> 29*c8dee2aaSAndroid Build Coastguard Worker using BindGroupKey = FixedSizeKey<2 * NumEntries>; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker static constexpr size_t kNumUniformEntries = 4; 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker DawnResourceProvider(SharedContext* sharedContext, 34*c8dee2aaSAndroid Build Coastguard Worker SingleOwner*, 35*c8dee2aaSAndroid Build Coastguard Worker uint32_t recorderID, 36*c8dee2aaSAndroid Build Coastguard Worker size_t resourceBudget); 37*c8dee2aaSAndroid Build Coastguard Worker ~DawnResourceProvider() override; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker sk_sp<DawnTexture> findOrCreateDiscardableMSAALoadTexture(SkISize dimensions, 40*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo& msaaInfo); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker wgpu::RenderPipeline findOrCreateBlitWithDrawPipeline(const RenderPassDesc& renderPassDesc); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker sk_sp<DawnBuffer> findOrCreateDawnBuffer(size_t size, 45*c8dee2aaSAndroid Build Coastguard Worker BufferType type, 46*c8dee2aaSAndroid Build Coastguard Worker AccessPattern, 47*c8dee2aaSAndroid Build Coastguard Worker std::string_view label); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker const wgpu::BindGroupLayout& getOrCreateUniformBuffersBindGroupLayout(); 50*c8dee2aaSAndroid Build Coastguard Worker const wgpu::BindGroupLayout& getOrCreateSingleTextureSamplerBindGroupLayout(); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker // Find the cached bind group or create a new one based on the bound buffers and their 53*c8dee2aaSAndroid Build Coastguard Worker // binding sizes (boundBuffersAndSizes) for these uniforms (in order): 54*c8dee2aaSAndroid Build Coastguard Worker // - Intrinsic constants. 55*c8dee2aaSAndroid Build Coastguard Worker // - Render step uniforms. 56*c8dee2aaSAndroid Build Coastguard Worker // - Paint uniforms. 57*c8dee2aaSAndroid Build Coastguard Worker const wgpu::BindGroup& findOrCreateUniformBuffersBindGroup( 58*c8dee2aaSAndroid Build Coastguard Worker const std::array<std::pair<const DawnBuffer*, uint32_t>, kNumUniformEntries>& 59*c8dee2aaSAndroid Build Coastguard Worker boundBuffersAndSizes); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker // Find or create a bind group containing the given sampler & texture. 62*c8dee2aaSAndroid Build Coastguard Worker const wgpu::BindGroup& findOrCreateSingleTextureSamplerBindGroup(const DawnSampler* sampler, 63*c8dee2aaSAndroid Build Coastguard Worker const DawnTexture* texture); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker // Find the cached bind buffer info, or create a new one for the given intrinsic values. 66*c8dee2aaSAndroid Build Coastguard Worker BindBufferInfo findOrCreateIntrinsicBindBufferInfo(DawnCommandBuffer* cb, 67*c8dee2aaSAndroid Build Coastguard Worker UniformDataBlock intrinsicValues); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GraphicsPipeline> createGraphicsPipeline(const RuntimeEffectDictionary*, 71*c8dee2aaSAndroid Build Coastguard Worker const GraphicsPipelineDesc&, 72*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&, 73*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<PipelineCreationFlags>) override; 74*c8dee2aaSAndroid Build Coastguard Worker sk_sp<ComputePipeline> createComputePipeline(const ComputePipelineDesc&) override; 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> createTexture(SkISize, const TextureInfo&, skgpu::Budgeted) override; 77*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Buffer> createBuffer(size_t size, BufferType type, AccessPattern) override; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Texture> onCreateWrappedTexture(const BackendTexture&) override; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker sk_sp<Sampler> createSampler(const SamplerDesc&) override; 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker BackendTexture onCreateBackendTexture(SkISize dimensions, const TextureInfo&) override; 84*c8dee2aaSAndroid Build Coastguard Worker void onDeleteBackendTexture(const BackendTexture&) override; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker const wgpu::Buffer& getOrCreateNullBuffer(); 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker DawnSharedContext* dawnSharedContext() const; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker void onFreeGpuResources() override; 91*c8dee2aaSAndroid Build Coastguard Worker void onPurgeResourcesNotUsedSince(StdSteadyClock::time_point purgeTime) override; 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker skia_private::THashMap<uint32_t, wgpu::RenderPipeline> fBlitWithDrawPipelines; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker wgpu::BindGroupLayout fUniformBuffersBindGroupLayout; 96*c8dee2aaSAndroid Build Coastguard Worker wgpu::BindGroupLayout fSingleTextureSamplerBindGroupLayout; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker wgpu::Buffer fNullBuffer; 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker template <size_t NumEntries> 101*c8dee2aaSAndroid Build Coastguard Worker using BindGroupCache = SkLRUCache<BindGroupKey<NumEntries>, 102*c8dee2aaSAndroid Build Coastguard Worker wgpu::BindGroup, 103*c8dee2aaSAndroid Build Coastguard Worker typename BindGroupKey<NumEntries>::Hash>; 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker BindGroupCache<kNumUniformEntries> fUniformBufferBindGroupCache; 106*c8dee2aaSAndroid Build Coastguard Worker BindGroupCache<1> fSingleTextureSamplerBindGroups; 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker class IntrinsicBuffer; 109*c8dee2aaSAndroid Build Coastguard Worker class IntrinsicConstantsManager; 110*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<IntrinsicConstantsManager> fIntrinsicConstantsManager; 111*c8dee2aaSAndroid Build Coastguard Worker }; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_DawnResourceProvider_DEFINED 116