/*
 * 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 compact() {
        fCachedAtlasMgr.compact(fRecorder);
        fSmallPathAtlasMgr.compact(fRecorder);
        fUncachedAtlasMgr.compact(fRecorder);
    }

    void freeGpuResources() {
        fCachedAtlasMgr.freeGpuResources(fRecorder);
        fSmallPathAtlasMgr.freeGpuResources(fRecorder);
        fUncachedAtlasMgr.freeGpuResources(fRecorder);
    }

    void evictAtlases() {
        fCachedAtlasMgr.evictAll();
        fSmallPathAtlasMgr.evictAll();
        fUncachedAtlasMgr.evictAll();
    }

protected:
    sk_sp<TextureProxy> onAddShape(const Shape&,
                                   const Transform& localToDevice,
                                   const SkStrokeRec&,
                                   skvx::half2 maskOrigin,
                                   skvx::half2 maskSize,
                                   SkIVector transformedMaskOffset,
                                   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,
                                      DrawAtlas::UseStorageTextures::kNo,
                                      /*label=*/"RasterPathAtlas", caps) {}

    protected:
        bool onAddToAtlas(const Shape&,
                          const Transform& localToDevice,
                          const SkStrokeRec&,
                          SkIRect shapeBounds,
                          SkIVector transformedMaskOffset,
                          const DrawAtlas::AtlasLocator&) override;
    };

    RasterAtlasMgr fCachedAtlasMgr;
    RasterAtlasMgr fSmallPathAtlasMgr;
    RasterAtlasMgr fUncachedAtlasMgr;
};

}  // namespace skgpu::graphite

#endif  // skgpu_graphite_RasterPathAtlas_DEFINED
