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