| /* | |
| * Copyright 2026 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_StorageBufferManager_DEFINED | |
| #define skgpu_graphite_StorageBufferManager_DEFINED | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/private/SkAlign.h" | |
| #include "include/private/SkTDArray.h" | |
| #include "src/core/SkTHash.h" | |
| #include "src/gpu/graphite/BufferManager.h" | |
| #include "src/gpu/graphite/ResourceTypes.h" | |
| #include <cstdint> | |
| #include <limits> | |
| #include <optional> | |
| #include <utility> | |
| class SkGradientBaseShader; | |
| namespace skgpu::graphite { | |
| class DrawBufferManager; | |
| /** | |
| * Manages allocation of storage buffer data, currently only handles gradient data | |
| */ | |
| class StorageBufferManager : public SkRefCnt { | |
| public: | |
| StorageBufferManager() = default; | |
| ~StorageBufferManager() override; | |
| void reset(); | |
| // Checks if data already exists for the requested gradient shader. If so, it returns a nullptr | |
| // and the existing offset. If not, it allocates space, caches the offset, and returns a pointer | |
| // to the start of the new data and the calculated offset. | |
| // | |
| // If it was not possible to store the gradient data, a nullptr and negative offset are returned | |
| // to signal the error state. | |
| std::pair<float*, int> allocateGradientData(int numStops, const SkGradientBaseShader* shader); | |
| bool finalize(DrawBufferManager* bufferMgr); | |
| BindBufferInfo getBufferInfo() const { return fBufferInfo.value_or(BindBufferInfo{}); } | |
| bool hasData() const { return fBufferInfo.has_value() && fBufferInfo->fBuffer != nullptr; } | |
| #if defined(SK_DEBUG) | |
| bool isFinalized() const { return fBufferInfo.has_value(); } | |
| int gradientSize() const { return fGradientCache.fStorage.size_bytes(); } | |
| #endif | |
| private: | |
| struct GradientCache { | |
| static constexpr int kMaxGradientStops = 1024 * 1024; | |
| static constexpr int kMaxStorageFloats = | |
| static_cast<int>(std::numeric_limits<uint32_t>::max() / sizeof(float)); | |
| skia_private::THashMap<const SkGradientBaseShader*, int> fOffsetCache; | |
| SkTDArray<float> fStorage; | |
| void reset(); | |
| }; | |
| GradientCache fGradientCache; | |
| std::optional<BindBufferInfo> fBufferInfo; | |
| }; | |
| } // namespace skgpu::graphite | |
| #endif // skgpu_graphite_StorageBufferManager_DEFINED |