blob: ce95d211bd0649f6054e11fdebc8a284ea56f275 [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_DawnResourceProvider_DEFINED
#define skgpu_graphite_DawnResourceProvider_DEFINED
#include "include/gpu/graphite/dawn/DawnGraphiteTypes.h"
#include "src/core/SkLRUCache.h"
#include "src/core/SkTHash.h"
#include "src/gpu/graphite/PipelineData.h"
#include "src/gpu/graphite/ResourceProvider.h"
namespace skgpu::graphite {
class DawnGraphicsPipeline;
class DawnSampler;
class DawnSharedContext;
class DawnTexture;
class DawnBuffer;
class DawnCommandBuffer;
class DawnResourceProvider final : public ResourceProvider {
public:
template <size_t NumEntries>
using BindGroupKey = FixedSizeKey<2 * NumEntries>;
static constexpr size_t kNumUniformEntries = 4;
class BlitWithDrawEncoder {
public:
BlitWithDrawEncoder(wgpu::RenderPipeline pipeline,
bool srcIsMSAA);
operator bool() const { return fPipeline != nullptr; }
void EncodeBlit(const wgpu::Device& device,
const wgpu::RenderPassEncoder& encoder,
const wgpu::TextureView& srcTextureView,
const SkIPoint& srcOffset,
const SkIRect& dstBounds);
private:
wgpu::RenderPipeline fPipeline;
const bool fSrcIsMSAA;
};
DawnResourceProvider(SharedContext* sharedContext,
SingleOwner*,
uint32_t recorderID,
size_t resourceBudget);
~DawnResourceProvider() override;
sk_sp<DawnTexture> findOrCreateDiscardableMSAALoadTexture(SkISize dimensions,
const TextureInfo& msaaInfo);
BlitWithDrawEncoder findOrCreateBlitWithDrawEncoder(const RenderPassDesc& renderPassDesc,
int srcSampleCount);
sk_sp<DawnBuffer> findOrCreateDawnBuffer(size_t size,
BufferType type,
AccessPattern,
std::string_view label);
// Find the cached bind group or create a new one based on the bound buffers and their
// binding sizes (boundBuffersAndSizes) for these uniforms (in order):
// - Intrinsic constants.
// - Render step uniforms.
// - Paint uniforms.
const wgpu::BindGroup& findOrCreateUniformBuffersBindGroup(
const std::array<std::pair<const DawnBuffer*, uint32_t>, kNumUniformEntries>&
boundBuffersAndSizes);
// Find or create a bind group containing the given sampler & texture.
const wgpu::BindGroup& findOrCreateSingleTextureSamplerBindGroup(const DawnSampler* sampler,
const DawnTexture* texture);
// Find the cached bind buffer info, or create a new one for the given intrinsic values.
BindBufferInfo findOrCreateIntrinsicBindBufferInfo(DawnCommandBuffer* cb,
UniformDataBlock intrinsicValues);
private:
sk_sp<GraphicsPipeline> createGraphicsPipeline(const RuntimeEffectDictionary*,
const UniqueKey&,
const GraphicsPipelineDesc&,
const RenderPassDesc&,
SkEnumBitMask<PipelineCreationFlags>,
uint32_t compilationID) override;
sk_sp<ComputePipeline> createComputePipeline(const ComputePipelineDesc&) override;
sk_sp<Texture> createTexture(SkISize, const TextureInfo&) override;
sk_sp<Buffer> createBuffer(size_t size, BufferType type, AccessPattern) override;
sk_sp<Texture> onCreateWrappedTexture(const BackendTexture&) override;
sk_sp<Sampler> createSampler(const SamplerDesc&) override;
BackendTexture onCreateBackendTexture(SkISize dimensions, const TextureInfo&) override;
void onDeleteBackendTexture(const BackendTexture&) override;
const wgpu::Buffer& getOrCreateNullBuffer();
DawnSharedContext* dawnSharedContext() const;
void onFreeGpuResources() override;
void onPurgeResourcesNotUsedSince(StdSteadyClock::time_point purgeTime) override;
skia_private::THashMap<uint32_t, wgpu::RenderPipeline> fBlitWithDrawPipelines;
wgpu::Buffer fNullBuffer;
template <size_t NumEntries>
using BindGroupCache = SkLRUCache<BindGroupKey<NumEntries>,
wgpu::BindGroup,
typename BindGroupKey<NumEntries>::Hash>;
BindGroupCache<kNumUniformEntries> fUniformBufferBindGroupCache;
BindGroupCache<1> fSingleTextureSamplerBindGroups;
class IntrinsicBuffer;
class IntrinsicConstantsManager;
std::unique_ptr<IntrinsicConstantsManager> fIntrinsicConstantsManager;
SingleOwner* fSingleOwner = nullptr;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_DawnResourceProvider_DEFINED