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#ifndef skgpu_ResourceProvider_DEFINED 9cb93a386Sopenharmony_ci#define skgpu_ResourceProvider_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "experimental/graphite/src/CommandBuffer.h" 12cb93a386Sopenharmony_ci#include "experimental/graphite/src/GraphicsPipelineDesc.h" 13cb93a386Sopenharmony_ci#include "experimental/graphite/src/ResourceTypes.h" 14cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 15cb93a386Sopenharmony_ci#include "src/core/SkLRUCache.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cinamespace skgpu { 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciclass Buffer; 20cb93a386Sopenharmony_ciclass Gpu; 21cb93a386Sopenharmony_ciclass GraphicsPipeline; 22cb93a386Sopenharmony_ciclass Texture; 23cb93a386Sopenharmony_ciclass TextureInfo; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciclass ResourceProvider { 26cb93a386Sopenharmony_cipublic: 27cb93a386Sopenharmony_ci virtual ~ResourceProvider(); 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci virtual sk_sp<CommandBuffer> createCommandBuffer() = 0; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci sk_sp<GraphicsPipeline> findOrCreateGraphicsPipeline(const GraphicsPipelineDesc&); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci sk_sp<Texture> findOrCreateTexture(SkISize, const TextureInfo&); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci sk_sp<Buffer> findOrCreateBuffer(size_t size, BufferType type, PrioritizeGpuReads); 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciprotected: 38cb93a386Sopenharmony_ci ResourceProvider(const Gpu* gpu); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci const Gpu* fGpu; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ciprivate: 43cb93a386Sopenharmony_ci virtual sk_sp<GraphicsPipeline> onCreateGraphicsPipeline(const GraphicsPipelineDesc&) = 0; 44cb93a386Sopenharmony_ci virtual sk_sp<Texture> createTexture(SkISize, const TextureInfo&) = 0; 45cb93a386Sopenharmony_ci virtual sk_sp<Buffer> createBuffer(size_t size, BufferType type, PrioritizeGpuReads) = 0; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci class GraphicsPipelineCache { 48cb93a386Sopenharmony_ci public: 49cb93a386Sopenharmony_ci GraphicsPipelineCache(ResourceProvider* resourceProvider); 50cb93a386Sopenharmony_ci ~GraphicsPipelineCache(); 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci void release(); 53cb93a386Sopenharmony_ci sk_sp<GraphicsPipeline> refPipeline(const GraphicsPipelineDesc&); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci private: 56cb93a386Sopenharmony_ci struct Entry; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci struct DescHash { 59cb93a386Sopenharmony_ci uint32_t operator()(const GraphicsPipelineDesc& desc) const { 60cb93a386Sopenharmony_ci return SkOpts::hash_fn(desc.asKey(), desc.keyLength(), 0); 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci }; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci SkLRUCache<const GraphicsPipelineDesc, std::unique_ptr<Entry>, DescHash> fMap; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci ResourceProvider* fResourceProvider; 67cb93a386Sopenharmony_ci }; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci // Cache of GraphicsPipelines 70cb93a386Sopenharmony_ci std::unique_ptr<GraphicsPipelineCache> fGraphicsPipelineCache; 71cb93a386Sopenharmony_ci}; 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci} // namespace skgpu 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci#endif // skgpu_ResourceProvider_DEFINED 76