1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "experimental/graphite/src/ResourceProvider.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "experimental/graphite/src/Buffer.h" 11cb93a386Sopenharmony_ci#include "experimental/graphite/src/CommandBuffer.h" 12cb93a386Sopenharmony_ci#include "experimental/graphite/src/GraphicsPipeline.h" 13cb93a386Sopenharmony_ci#include "experimental/graphite/src/Texture.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cinamespace skgpu { 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciResourceProvider::ResourceProvider(const Gpu* gpu) : fGpu(gpu) { 18cb93a386Sopenharmony_ci fGraphicsPipelineCache.reset(new GraphicsPipelineCache(this)); 19cb93a386Sopenharmony_ci} 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ciResourceProvider::~ResourceProvider() { 22cb93a386Sopenharmony_ci fGraphicsPipelineCache.release(); 23cb93a386Sopenharmony_ci} 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_cisk_sp<GraphicsPipeline> ResourceProvider::findOrCreateGraphicsPipeline( 26cb93a386Sopenharmony_ci const GraphicsPipelineDesc& desc) { 27cb93a386Sopenharmony_ci return fGraphicsPipelineCache->refPipeline(desc); 28cb93a386Sopenharmony_ci} 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////////////////////// 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cistruct ResourceProvider::GraphicsPipelineCache::Entry { 33cb93a386Sopenharmony_ci Entry(sk_sp<GraphicsPipeline> pipeline) : fPipeline(std::move(pipeline)) {} 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci sk_sp<GraphicsPipeline> fPipeline; 36cb93a386Sopenharmony_ci}; 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ciResourceProvider::GraphicsPipelineCache::GraphicsPipelineCache(ResourceProvider* resourceProvider) 39cb93a386Sopenharmony_ci : fMap(16) // TODO: find a good value for this 40cb93a386Sopenharmony_ci , fResourceProvider(resourceProvider) {} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ciResourceProvider::GraphicsPipelineCache::~GraphicsPipelineCache() { 43cb93a386Sopenharmony_ci SkASSERT(0 == fMap.count()); 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_civoid ResourceProvider::GraphicsPipelineCache::release() { 47cb93a386Sopenharmony_ci fMap.reset(); 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_cisk_sp<GraphicsPipeline> ResourceProvider::GraphicsPipelineCache::refPipeline( 51cb93a386Sopenharmony_ci const GraphicsPipelineDesc& desc) { 52cb93a386Sopenharmony_ci std::unique_ptr<Entry>* entry = fMap.find(desc); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci if (!entry) { 55cb93a386Sopenharmony_ci auto pipeline = fResourceProvider->onCreateGraphicsPipeline(desc); 56cb93a386Sopenharmony_ci if (!pipeline) { 57cb93a386Sopenharmony_ci return nullptr; 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci entry = fMap.insert(desc, std::unique_ptr<Entry>(new Entry(std::move(pipeline)))); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci return (*entry)->fPipeline; 62cb93a386Sopenharmony_ci} 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_cisk_sp<Texture> ResourceProvider::findOrCreateTexture(SkISize dimensions, const TextureInfo& info) { 65cb93a386Sopenharmony_ci return this->createTexture(dimensions, info); 66cb93a386Sopenharmony_ci} 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_cisk_sp<Buffer> ResourceProvider::findOrCreateBuffer(size_t size, 69cb93a386Sopenharmony_ci BufferType type, 70cb93a386Sopenharmony_ci PrioritizeGpuReads prioritizeGpuReads) { 71cb93a386Sopenharmony_ci return this->createBuffer(size, type, prioritizeGpuReads); 72cb93a386Sopenharmony_ci} 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci} // namespace skgpu 76