• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 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 #include "experimental/graphite/src/ResourceProvider.h"
9 
10 #include "experimental/graphite/src/Buffer.h"
11 #include "experimental/graphite/src/Caps.h"
12 #include "experimental/graphite/src/CommandBuffer.h"
13 #include "experimental/graphite/src/ContextPriv.h"
14 #include "experimental/graphite/src/GlobalCache.h"
15 #include "experimental/graphite/src/Gpu.h"
16 #include "experimental/graphite/src/GraphicsPipeline.h"
17 #include "experimental/graphite/src/Sampler.h"
18 #include "experimental/graphite/src/Texture.h"
19 
20 namespace skgpu {
21 
ResourceProvider(const Gpu * gpu,sk_sp<GlobalCache> globalCache,SingleOwner * singleOwner)22 ResourceProvider::ResourceProvider(const Gpu* gpu,
23                                    sk_sp<GlobalCache> globalCache,
24                                    SingleOwner* singleOwner)
25         : fGpu(gpu)
26         , fResourceCache(singleOwner)
27         , fGlobalCache(std::move(globalCache)) {
28     fGraphicsPipelineCache.reset(new GraphicsPipelineCache(this));
29 }
30 
~ResourceProvider()31 ResourceProvider::~ResourceProvider() {
32     fGraphicsPipelineCache.release();
33 }
34 
findOrCreateGraphicsPipeline(const GraphicsPipelineDesc & pipelineDesc,const RenderPassDesc & renderPassDesc)35 sk_sp<GraphicsPipeline> ResourceProvider::findOrCreateGraphicsPipeline(
36         const GraphicsPipelineDesc& pipelineDesc,
37         const RenderPassDesc& renderPassDesc) {
38     return fGraphicsPipelineCache->refPipeline(fGpu->caps(), pipelineDesc, renderPassDesc);
39 }
40 
shaderCodeDictionary() const41 SkShaderCodeDictionary* ResourceProvider::shaderCodeDictionary() const {
42     return fGlobalCache->shaderCodeDictionary();
43 }
44 
45 ////////////////////////////////////////////////////////////////////////////////////////////////
46 
47 struct ResourceProvider::GraphicsPipelineCache::Entry {
Entryskgpu::ResourceProvider::GraphicsPipelineCache::Entry48     Entry(sk_sp<GraphicsPipeline> pipeline) : fPipeline(std::move(pipeline)) {}
49 
50     sk_sp<GraphicsPipeline> fPipeline;
51 };
52 
GraphicsPipelineCache(ResourceProvider * resourceProvider)53 ResourceProvider::GraphicsPipelineCache::GraphicsPipelineCache(ResourceProvider* resourceProvider)
54     : fMap(16) // TODO: find a good value for this
55     , fResourceProvider(resourceProvider) {}
56 
~GraphicsPipelineCache()57 ResourceProvider::GraphicsPipelineCache::~GraphicsPipelineCache() {
58     SkASSERT(0 == fMap.count());
59 }
60 
release()61 void ResourceProvider::GraphicsPipelineCache::release() {
62     fMap.reset();
63 }
64 
refPipeline(const Caps * caps,const GraphicsPipelineDesc & pipelineDesc,const RenderPassDesc & renderPassDesc)65 sk_sp<GraphicsPipeline> ResourceProvider::GraphicsPipelineCache::refPipeline(
66         const Caps* caps,
67         const GraphicsPipelineDesc& pipelineDesc,
68         const RenderPassDesc& renderPassDesc) {
69     UniqueKey pipelineKey = caps->makeGraphicsPipelineKey(pipelineDesc, renderPassDesc);
70 
71 	std::unique_ptr<Entry>* entry = fMap.find(pipelineKey);
72 
73     if (!entry) {
74         auto pipeline = fResourceProvider->onCreateGraphicsPipeline(pipelineDesc, renderPassDesc);
75         if (!pipeline) {
76             return nullptr;
77         }
78         entry = fMap.insert(pipelineKey, std::unique_ptr<Entry>(new Entry(std::move(pipeline))));
79     }
80     return (*entry)->fPipeline;
81 }
82 
findOrCreateTexture(SkISize dimensions,const TextureInfo & info)83 sk_sp<Texture> ResourceProvider::findOrCreateTexture(SkISize dimensions, const TextureInfo& info) {
84     return this->createTexture(dimensions, info);
85 }
86 
findOrCreateCompatibleSampler(const SkSamplingOptions & smplOptions,SkTileMode xTileMode,SkTileMode yTileMode)87 sk_sp<Sampler> ResourceProvider::findOrCreateCompatibleSampler(const SkSamplingOptions& smplOptions,
88                                                                SkTileMode xTileMode,
89                                                                SkTileMode yTileMode) {
90     return this->createSampler(smplOptions, xTileMode, yTileMode);
91 }
92 
findOrCreateBuffer(size_t size,BufferType type,PrioritizeGpuReads prioritizeGpuReads)93 sk_sp<Buffer> ResourceProvider::findOrCreateBuffer(size_t size,
94                                                    BufferType type,
95                                                    PrioritizeGpuReads prioritizeGpuReads) {
96     return this->createBuffer(size, type, prioritizeGpuReads);
97 }
98 
99 
100 } // namespace skgpu
101