blob: a26833d56b1a3f9b8af01a8564ec935e223d3400 [file] [log] [blame]
/*
* Copyright 2023 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_RasterPathAtlas_DEFINED
#define skgpu_graphite_RasterPathAtlas_DEFINED
#include "src/gpu/graphite/PathAtlas.h"
namespace skgpu::graphite {
/**
* PathAtlas class that rasterizes coverage masks on the CPU.
*
* When a new shape gets added, its path is rasterized in preparation for upload. These
* uploads are recorded by `recordUploads()` and subsequently added to an UploadTask.
*
* Shapes are cached for future frames to avoid the cost of raster pipeline rendering. Multiple
* textures (or Pages) are used to cache masks, so if the atlas is full we can reset a Page and
* start adding new shapes for a future atlas render.
*/
class RasterPathAtlas : public PathAtlas {
public:
explicit RasterPathAtlas(Recorder* recorder);
~RasterPathAtlas() override {}
void recordUploads(DrawContext*);
void postFlush() {
fCachedAtlasMgr.postFlush(fRecorder);
fSmallPathAtlasMgr.postFlush(fRecorder);
fUncachedAtlasMgr.postFlush(fRecorder);
}
protected:
const TextureProxy* onAddShape(const Shape&,
const Transform& transform,
const SkStrokeRec&,
skvx::half2 maskSize,
skvx::half2* outPos) override;
private:
class RasterAtlasMgr : public PathAtlas::DrawAtlasMgr {
public:
RasterAtlasMgr(size_t width, size_t height,
size_t plotWidth, size_t plotHeight,
const Caps* caps)
: PathAtlas::DrawAtlasMgr(width, height, plotWidth, plotHeight,
/*label=*/"RasterPathAtlas", caps) {}
protected:
bool onAddToAtlas(const Shape&,
const Transform& transform,
const SkStrokeRec&,
SkIRect shapeBounds,
const AtlasLocator&) override;
};
RasterAtlasMgr fCachedAtlasMgr;
RasterAtlasMgr fSmallPathAtlasMgr;
RasterAtlasMgr fUncachedAtlasMgr;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_RasterPathAtlas_DEFINED