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/CommandBuffer.h"
12#include "experimental/graphite/src/GraphicsPipeline.h"
13#include "experimental/graphite/src/Texture.h"
14
15namespace skgpu {
16
17ResourceProvider::ResourceProvider(const Gpu* gpu) : fGpu(gpu) {
18    fGraphicsPipelineCache.reset(new GraphicsPipelineCache(this));
19}
20
21ResourceProvider::~ResourceProvider() {
22    fGraphicsPipelineCache.release();
23}
24
25sk_sp<GraphicsPipeline> ResourceProvider::findOrCreateGraphicsPipeline(
26        const GraphicsPipelineDesc& desc) {
27    return fGraphicsPipelineCache->refPipeline(desc);
28}
29
30////////////////////////////////////////////////////////////////////////////////////////////////
31
32struct ResourceProvider::GraphicsPipelineCache::Entry {
33    Entry(sk_sp<GraphicsPipeline> pipeline) : fPipeline(std::move(pipeline)) {}
34
35    sk_sp<GraphicsPipeline> fPipeline;
36};
37
38ResourceProvider::GraphicsPipelineCache::GraphicsPipelineCache(ResourceProvider* resourceProvider)
39    : fMap(16) // TODO: find a good value for this
40    , fResourceProvider(resourceProvider) {}
41
42ResourceProvider::GraphicsPipelineCache::~GraphicsPipelineCache() {
43    SkASSERT(0 == fMap.count());
44}
45
46void ResourceProvider::GraphicsPipelineCache::release() {
47    fMap.reset();
48}
49
50sk_sp<GraphicsPipeline> ResourceProvider::GraphicsPipelineCache::refPipeline(
51        const GraphicsPipelineDesc& desc) {
52    std::unique_ptr<Entry>* entry = fMap.find(desc);
53
54    if (!entry) {
55        auto pipeline = fResourceProvider->onCreateGraphicsPipeline(desc);
56        if (!pipeline) {
57            return nullptr;
58        }
59        entry = fMap.insert(desc, std::unique_ptr<Entry>(new Entry(std::move(pipeline))));
60    }
61    return (*entry)->fPipeline;
62}
63
64sk_sp<Texture> ResourceProvider::findOrCreateTexture(SkISize dimensions, const TextureInfo& info) {
65    return this->createTexture(dimensions, info);
66}
67
68sk_sp<Buffer> ResourceProvider::findOrCreateBuffer(size_t size,
69                                                   BufferType type,
70                                                   PrioritizeGpuReads prioritizeGpuReads) {
71    return this->createBuffer(size, type, prioritizeGpuReads);
72}
73
74
75} // namespace skgpu
76