/* * 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_compute_VelloRenderer_DEFINED #define skgpu_graphite_compute_VelloRenderer_DEFINED #include "include/core/SkColor.h" #include "include/core/SkPath.h" #include "include/core/SkRefCnt.h" #include "include/core/SkStrokeRec.h" #include "src/gpu/graphite/compute/VelloComputeSteps.h" #include "third_party/vello/cpp/vello.h" #include namespace skgpu::graphite { class Caps; class DispatchGroup; class Recorder; class TextureProxy; class Transform; // Encodes Bezier path fills, shapes, and clips. Once populated, this data structure can be used // with the full compositing and coverage mask generating pipelines. The latter only uses the red // color channel information. // // All color type parameters are expected to be unpremultiplied and in the sRGB color space. class VelloScene final { public: VelloScene(); void reset(); void solidFill(const SkPath&, const SkColor4f&, const SkPathFillType, const Transform& transform); void solidStroke(const SkPath&, const SkColor4f&, const SkStrokeRec&, const Transform& transform); void pushClipLayer(const SkPath& shape, const Transform& transform); void popClipLayer(); void append(const VelloScene& other); private: friend class VelloRenderer; // Disallow copy VelloScene(const VelloScene&) = delete; VelloScene& operator=(const VelloScene&) = delete; ::rust::Box<::vello_cpp::Encoding> fEncoding; SkDEBUGCODE(int fLayers = 0;) }; enum class VelloAaConfig { kAnalyticArea, kMSAA16, kMSAA8, }; // A VelloRenderer that is specialized for rendering coverage masks. The renderer only supports // paths and clipping and omits the full vello imaging model (e.g. gradients and images). // // VelloRenderer requires `kAlpha_8_SkColorType` as the target color type on platforms that // support the `R8Unorm` storage texture view format. Otherwise, the texture format must be // `kRGBA_8888_SkColorType`. class VelloRenderer final { public: explicit VelloRenderer(const Caps*); ~VelloRenderer(); struct RenderParams { // Dimensions of the fine rasterization target uint32_t fWidth; uint32_t fHeight; // The background color used during blending. SkColor4f fBaseColor; // The antialiasing method. VelloAaConfig fAaConfig; }; // Run the full pipeline which supports compositing colors with different blend styles. Does // nothing if `scene` or target render dimensions are empty. // // The color type of `target` must be `kAlpha_8_SkColorType` on platforms that support R8Unorm // storage textures. Otherwise, it must be `kRGBA_8888_SkColorType`. std::unique_ptr renderScene(const RenderParams&, const VelloScene&, sk_sp target, Recorder*) const; private: // Pipelines VelloBackdropDynStep fBackdrop; VelloBboxClearStep fBboxClear; VelloBinningStep fBinning; VelloClipLeafStep fClipLeaf; VelloClipReduceStep fClipReduce; VelloCoarseStep fCoarse; VelloDrawLeafStep fDrawLeaf; VelloDrawReduceStep fDrawReduce; VelloFlattenStep fFlatten; VelloPathCountStep fPathCount; VelloPathCountSetupStep fPathCountSetup; VelloPathTilingStep fPathTiling; VelloPathTilingSetupStep fPathTilingSetup; VelloPathtagReduceStep fPathtagReduce; VelloPathtagReduce2Step fPathtagReduce2; VelloPathtagScan1Step fPathtagScan1; VelloPathtagScanLargeStep fPathtagScanLarge; VelloPathtagScanSmallStep fPathtagScanSmall; VelloTileAllocStep fTileAlloc; // Fine rasterization stage variants: std::unique_ptr fFineArea; std::unique_ptr fFineMsaa16; std::unique_ptr fFineMsaa8; }; } // namespace skgpu::graphite #endif // skgpu_graphite_compute_VelloRenderer_DEFINED