Coverage Report

Created: 2024-05-20 07:14

/src/skia/include/private/base/SkContainers.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2022 Google LLC.
2
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3
4
#ifndef SkContainers_DEFINED
5
#define SkContainers_DEFINED
6
7
#include "include/private/base/SkAPI.h"
8
#include "include/private/base/SkAlign.h"
9
#include "include/private/base/SkSpan_impl.h"
10
11
#include <cstddef>
12
#include <cstdint>
13
14
class SK_SPI SkContainerAllocator {
15
public:
16
    SkContainerAllocator(size_t sizeOfT, int maxCapacity)
17
            : fSizeOfT{sizeOfT}
18
63.6M
            , fMaxCapacity{maxCapacity} {}
19
20
    // allocate will abort on failure. Given a capacity of 0, it will return the empty span.
21
    // The bytes allocated are freed using sk_free().
22
    SkSpan<std::byte> allocate(int capacity, double growthFactor = 1.0);
23
24
    // Rounds a requested capacity up towards `kCapacityMultiple` in a constexpr-friendly fashion.
25
    template <typename T>
26
0
    static constexpr size_t RoundUp(size_t capacity) {
27
0
        return SkAlignTo(capacity * sizeof(T), kCapacityMultiple) / sizeof(T);
28
0
    }
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<SkImageFilter> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<SkIDChangeListener> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkPoint>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<unsigned char>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<float>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::BulkUsePlotUpdater::PlotData>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkNoPixelsDevice::ClipState>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<SkSL::Expression, std::__1::default_delete<SkSL::Expression> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<GrFragmentProcessor, std::__1::default_delete<GrFragmentProcessor> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrFragmentProcessor::ProgramImpl*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrGpu::SubmittedProc>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<skgpu::graphite::Resource> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<gr_sp<skgpu::graphite::Resource, &(skgpu::graphite::Resource::refCommandBuffer() const), &(skgpu::graphite::Resource::unrefCommandBuffer() const)> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<skgpu::ganesh::PathRenderer> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<GrSurfaceProxy> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrRenderTask*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::OpsTask::OpChain>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<sktext::gpu::TextBlob> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skif::FilterResult::Builder::SampledFilterResult>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<SkShader> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::VulkanYcbcrConversionInfo>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<unsigned int>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrVkSampler const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkString>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<SkSL::Statement, std::__1::default_delete<SkSL::Statement> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrVkRenderPass*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrVkResourceProvider::CompatibleRenderPassSet>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrVkCommandPool*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<GrVkDescriptorSetManager, std::__1::default_delete<GrVkDescriptorSetManager> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrVkSemaphore::Resource*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkPhysicalDevice_T*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkJSONWriter::Scope>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<bool>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<int>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkRasterPipeline_MemoryCtxInfo>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkRuntimeEffect::ChildPtr>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkOpRayHit*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<double>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkRGBA4f<(SkAlphaType)3> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkRGBA4f<(SkAlphaType)2> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<SkSL::Variable, std::__1::default_delete<SkSL::Variable> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skia_private::THashSet<int, SkGoodHash> const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkSL::Type const*>(unsigned long)
Unexecuted instantiation: SkSLSwizzle.cpp:unsigned long SkContainerAllocator::RoundUp<SkSL::optimize_constructor_swizzle(SkSL::Context const&, SkSL::Position, SkSL::ConstructorCompound const&, skia_private::FixedArray<4, signed char>)::ReorderedArgument>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::TClientMappedBufferManager<GrGpuBuffer, GrDirectContext::DirectContextID>::BufferFinishedMessage>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrTextureResolveRenderTask::Resolve>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<skgpu::ganesh::AtlasRenderTask> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::TAsyncReadResult<GrGpuBuffer, GrDirectContext::DirectContextID, skgpu::ganesh::SurfaceContext::PixelTransferResult>::Plane>(unsigned long)
Unexecuted instantiation: AAConvexPathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::(anonymous namespace)::AAConvexPathOp::PathData>(unsigned long)
Unexecuted instantiation: AAConvexPathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::(anonymous namespace)::Segment>(unsigned long)
Unexecuted instantiation: AAConvexPathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::(anonymous namespace)::Draw>(unsigned long)
Unexecuted instantiation: AAHairLinePathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::AAHairlineOp::PathData>(unsigned long)
Unexecuted instantiation: AALinearizingConvexPathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::(anonymous namespace)::AAFlatteningConvexPathOp::PathData>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrVertexChunk>(unsigned long)
Unexecuted instantiation: DashOp.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::DashOp::(anonymous namespace)::DashOpImpl::LineData>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkRect>(unsigned long)
Unexecuted instantiation: DashOp.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::DashOp::(anonymous namespace)::DashOpImpl::DashDraw>(unsigned long)
Unexecuted instantiation: DefaultPathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::DefaultPathOp::PathData>(unsigned long)
Unexecuted instantiation: DrawAtlasOp.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::DrawAtlasOpImpl::Geometry>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrGeometryProcessor::Attribute>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<GrFragmentProcessor::ProgramImpl, std::__1::default_delete<GrFragmentProcessor::ProgramImpl> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrResourceHandle<GrGLSLProgramDataManager::UniformHandleKind> >(unsigned long)
Unexecuted instantiation: DrawMeshOp.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::MeshGP::Impl::onEmitCode(GrGeometryProcessor::ProgramImpl::EmitArgs&, GrGeometryProcessor::ProgramImpl::GrGPArgs*)::RealVarying>(unsigned long)
Unexecuted instantiation: DrawMeshOp.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::MeshOp::Mesh>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<CircleOp::Circle>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<ButtCapDashedCircleOp::Circle>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<EllipseOp::Ellipse>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<DIEllipseOp::Ellipse>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<CircularRRectOp::RRect>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<EllipticalRRectOp::RRect>(unsigned long)
Unexecuted instantiation: LatticeOp.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::LatticeOp::(anonymous namespace)::NonAALatticeOp::Patch>(unsigned long)
Unexecuted instantiation: RegionOp.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::RegionOp::(anonymous namespace)::RegionOpImpl::RegionInfo>(unsigned long)
Unexecuted instantiation: ShadowRRectOp.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::ShadowCircularRRectOp::Geometry>(unsigned long)
Unexecuted instantiation: SmallPathRenderer.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::(anonymous namespace)::SmallPathOp::Entry>(unsigned long)
Unexecuted instantiation: StrokeRectOp.cpp:unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::StrokeRectOp::(anonymous namespace)::AAStrokeRectOp::RectInfo>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<GrProgramInfo const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<GrManagedResource const> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<gr_sp<GrRecycledResource const, &(GrManagedResource::ref() const), &(GrRecycledResource::recycle() const)> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<GrBuffer const> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<gr_sp<GrSurface const, &(GrIORef<GrGpuResource>::refCommandBuffer() const), &(GrIORef<GrGpuResource>::unrefCommandBuffer() const)> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkBufferMemoryBarrier>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkImageMemoryBarrier>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<GrVkSecondaryCommandBuffer, std::__1::default_delete<GrVkSecondaryCommandBuffer> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkImageSubresourceRange>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkVertexInputBindingDescription>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkVertexInputAttributeDescription>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<skgpu::graphite::Device> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::graphite::BufferTextureCopyData>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::graphite::UploadInstance>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<skgpu::graphite::Buffer> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::TAsyncReadResult<skgpu::graphite::Buffer, skgpu::graphite::Context::ContextID, skgpu::graphite::Context::PixelTransferResult>::Plane>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::TClientMappedBufferManager<skgpu::graphite::Buffer, skgpu::graphite::Context::ContextID>::BufferFinishedMessage>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<unsigned long>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkDescriptorSetLayoutBinding>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkSemaphore_T*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkFontScanner::AxisDefinition>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkPackedGlyphID>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<unsigned short>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkMask::Format>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkSL::SPIRVCodeGenerator::Word>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkGlyph const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkMeshSpecification::Varying>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkClosestRecord>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkClosestRecord const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<PathSegment>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<skgpu::graphite::DispatchGroup, std::__1::default_delete<skgpu::graphite::DispatchGroup> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::graphite::ClipStack::Element const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<skgpu::graphite::DrawPass, std::__1::default_delete<skgpu::graphite::DrawPass> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::graphite::ShaderNode const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<std::__1::unique_ptr<skgpu::graphite::VulkanImageView const, std::__1::default_delete<skgpu::graphite::VulkanImageView const> > >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::graphite::DescriptorData>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkClearValue>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<OffsetEdge>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skgpu::ganesh::ClipStack::Element const*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkDescriptorPoolSize>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<VkDescriptorSetLayout_T*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<sk_sp<SkSVGNode> >(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<char>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<SkSVGTextContext::PositionAdjustment>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<hb_feature_t>(unsigned long)
Unexecuted instantiation: SkPDFTag.cpp:unsigned long SkContainerAllocator::RoundUp<(anonymous namespace)::OutlineEntry*>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skia::textlayout::TextStyle>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skia::textlayout::Block>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skia::textlayout::Placeholder>(unsigned long)
Unexecuted instantiation: unsigned long SkContainerAllocator::RoundUp<skottie::Shaper::RunRec>(unsigned long)
Unexecuted instantiation: Layer.cpp:unsigned long SkContainerAllocator::RoundUp<skottie::internal::(anonymous namespace)::AttachMask(skjson::ArrayValue const*, skottie::internal::AnimationBuilder const*, sk_sp<sksg::RenderNode>)::MaskRecord>(unsigned long)
29
30
private:
31
    friend struct SkContainerAllocatorTestingPeer;
32
33
    // All capacity counts will be rounded up to kCapacityMultiple. This matches ASAN's shadow
34
    // granularity, as well as our typical struct alignment on a 64-bit machine.
35
    static constexpr int64_t kCapacityMultiple = 8;
36
37
    // Rounds up capacity to next multiple of kCapacityMultiple and pin to fMaxCapacity.
38
    size_t roundUpCapacity(int64_t capacity) const;
39
40
    // Grows the capacity by growthFactor being sure to stay with in kMinBytes and fMaxCapacity.
41
    size_t growthFactorCapacity(int capacity, double growthFactor) const;
42
43
    const size_t fSizeOfT;
44
    const int64_t fMaxCapacity;
45
};
46
47
// sk_allocate_canfail returns the empty span on failure. Parameter size must be > 0.
48
SkSpan<std::byte> sk_allocate_canfail(size_t size);
49
50
// Returns the empty span if size is 0. sk_allocate_throw aborts on failure.
51
SkSpan<std::byte> sk_allocate_throw(size_t size);
52
53
SK_SPI void sk_report_container_overflow_and_die();
54
#endif  // SkContainers_DEFINED