/* * 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_render_DynamicInstancesPatchAllocator_DEFINED #define skgpu_graphite_render_DynamicInstancesPatchAllocator_DEFINED #include "src/gpu/BufferWriter.h" #include "src/gpu/graphite/DrawWriter.h" #include "src/gpu/tessellate/LinearTolerances.h" namespace skgpu::graphite { // An adapter around DrawWriter::DynamicInstances that fits the API requirements of // skgpu::tess::PatchWriter's PatchAllocator template parameter. // // FixedCountVariant should be one of FixedCountCurves, FixedCountWedges, or FixedCountStrokes // (technically any class with a static VertexCount(const LinearTolerances&) function). template class DynamicInstancesPatchAllocator { public: // 'stride' is provided by PatchWriter. // 'writer' is the DrawWriter that the RenderStep can append instance data to, // 'fixedVertexBuffer' and 'fixedIndexBuffer' are the bindings for the instance template that // is passed to DrawWriter::DynamicInstances. DynamicInstancesPatchAllocator(size_t stride, DrawWriter& writer, BindBufferInfo fixedVertexBuffer, BindBufferInfo fixedIndexBuffer, unsigned int reserveCount) : fInstances(writer, fixedVertexBuffer, fixedIndexBuffer) { SkASSERT(stride == writer.instanceStride()); // TODO: Is it worth re-reserving large chunks after this preallocation is used up? Or will // appending 1 at a time be fine since it's coming from a large vertex buffer alloc anyway? fInstances.reserve(reserveCount); } VertexWriter append(const tess::LinearTolerances& tolerances) { return fInstances.append(tolerances, 1); } private: struct LinearToleranceProxy { operator unsigned int() const { return FixedCountVariant::VertexCount(fTolerances); } void operator <<(const tess::LinearTolerances& t) { fTolerances.accumulate(t); } tess::LinearTolerances fTolerances; }; DrawWriter::DynamicInstances fInstances; }; } // namespace skgpu::graphite #endif // skgpu_graphite_render_DynamicInstancesPatchAllocator_DEFINED