blob: 4376387d779fa1437a581acf08c6ac6f0a23386c [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "experimental/graphite/src/ResourceProvider.h"
#include "experimental/graphite/src/Buffer.h"
#include "experimental/graphite/src/Caps.h"
#include "experimental/graphite/src/CommandBuffer.h"
#include "experimental/graphite/src/ContextPriv.h"
#include "experimental/graphite/src/Gpu.h"
#include "experimental/graphite/src/GraphicsPipeline.h"
#include "experimental/graphite/src/Texture.h"
namespace skgpu {
ResourceProvider::ResourceProvider(const Gpu* gpu) : fGpu(gpu) {
fGraphicsPipelineCache.reset(new GraphicsPipelineCache(this));
}
ResourceProvider::~ResourceProvider() {
fGraphicsPipelineCache.release();
}
sk_sp<GraphicsPipeline> ResourceProvider::findOrCreateGraphicsPipeline(
Context* context, const GraphicsPipelineDesc& pipelineDesc,
const RenderPassDesc& renderPassDesc) {
return fGraphicsPipelineCache->refPipeline(context, pipelineDesc, renderPassDesc);
}
////////////////////////////////////////////////////////////////////////////////////////////////
struct ResourceProvider::GraphicsPipelineCache::Entry {
Entry(sk_sp<GraphicsPipeline> pipeline) : fPipeline(std::move(pipeline)) {}
sk_sp<GraphicsPipeline> fPipeline;
};
ResourceProvider::GraphicsPipelineCache::GraphicsPipelineCache(ResourceProvider* resourceProvider)
: fMap(16) // TODO: find a good value for this
, fResourceProvider(resourceProvider) {}
ResourceProvider::GraphicsPipelineCache::~GraphicsPipelineCache() {
SkASSERT(0 == fMap.count());
}
void ResourceProvider::GraphicsPipelineCache::release() {
fMap.reset();
}
sk_sp<GraphicsPipeline> ResourceProvider::GraphicsPipelineCache::refPipeline(
Context* context, const GraphicsPipelineDesc& pipelineDesc,
const RenderPassDesc& renderPassDesc) {
Gpu* gpu = context->priv().gpu();
UniqueKey pipelineKey = gpu->caps()->makeGraphicsPipelineKey(pipelineDesc, renderPassDesc);
std::unique_ptr<Entry>* entry = fMap.find(pipelineKey);
if (!entry) {
auto pipeline = fResourceProvider->onCreateGraphicsPipeline(context, pipelineDesc,
renderPassDesc);
if (!pipeline) {
return nullptr;
}
entry = fMap.insert(pipelineKey, std::unique_ptr<Entry>(new Entry(std::move(pipeline))));
}
return (*entry)->fPipeline;
}
sk_sp<Texture> ResourceProvider::findOrCreateTexture(SkISize dimensions, const TextureInfo& info) {
return this->createTexture(dimensions, info);
}
sk_sp<Buffer> ResourceProvider::findOrCreateBuffer(size_t size,
BufferType type,
PrioritizeGpuReads prioritizeGpuReads) {
return this->createBuffer(size, type, prioritizeGpuReads);
}
} // namespace skgpu