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