/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 |