1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_compute_VelloRenderer_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_compute_VelloRenderer_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStrokeRec.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/compute/VelloComputeSteps.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "third_party/vello/cpp/vello.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class Caps; 23*c8dee2aaSAndroid Build Coastguard Worker class DispatchGroup; 24*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 25*c8dee2aaSAndroid Build Coastguard Worker class TextureProxy; 26*c8dee2aaSAndroid Build Coastguard Worker class Transform; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker // Encodes Bezier path fills, shapes, and clips. Once populated, this data structure can be used 29*c8dee2aaSAndroid Build Coastguard Worker // with the full compositing and coverage mask generating pipelines. The latter only uses the red 30*c8dee2aaSAndroid Build Coastguard Worker // color channel information. 31*c8dee2aaSAndroid Build Coastguard Worker // 32*c8dee2aaSAndroid Build Coastguard Worker // All color type parameters are expected to be unpremultiplied and in the sRGB color space. 33*c8dee2aaSAndroid Build Coastguard Worker class VelloScene final { 34*c8dee2aaSAndroid Build Coastguard Worker public: 35*c8dee2aaSAndroid Build Coastguard Worker VelloScene(); 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker void reset(); 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker void solidFill(const SkPath&, 40*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f&, 41*c8dee2aaSAndroid Build Coastguard Worker const SkPathFillType, 42*c8dee2aaSAndroid Build Coastguard Worker const Transform& transform); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker void solidStroke(const SkPath&, 45*c8dee2aaSAndroid Build Coastguard Worker const SkColor4f&, 46*c8dee2aaSAndroid Build Coastguard Worker const SkStrokeRec&, 47*c8dee2aaSAndroid Build Coastguard Worker const Transform& transform); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker void pushClipLayer(const SkPath& shape, const Transform& transform); 50*c8dee2aaSAndroid Build Coastguard Worker void popClipLayer(); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker void append(const VelloScene& other); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker private: 55*c8dee2aaSAndroid Build Coastguard Worker friend class VelloRenderer; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker // Disallow copy 58*c8dee2aaSAndroid Build Coastguard Worker VelloScene(const VelloScene&) = delete; 59*c8dee2aaSAndroid Build Coastguard Worker VelloScene& operator=(const VelloScene&) = delete; 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker ::rust::Box<::vello_cpp::Encoding> fEncoding; 62*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(int fLayers = 0;) 63*c8dee2aaSAndroid Build Coastguard Worker }; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker enum class VelloAaConfig { 66*c8dee2aaSAndroid Build Coastguard Worker kAnalyticArea, 67*c8dee2aaSAndroid Build Coastguard Worker kMSAA16, 68*c8dee2aaSAndroid Build Coastguard Worker kMSAA8, 69*c8dee2aaSAndroid Build Coastguard Worker }; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker // A VelloRenderer that is specialized for rendering coverage masks. The renderer only supports 72*c8dee2aaSAndroid Build Coastguard Worker // paths and clipping and omits the full vello imaging model (e.g. gradients and images). 73*c8dee2aaSAndroid Build Coastguard Worker // 74*c8dee2aaSAndroid Build Coastguard Worker // VelloRenderer requires `kAlpha_8_SkColorType` as the target color type on platforms that 75*c8dee2aaSAndroid Build Coastguard Worker // support the `R8Unorm` storage texture view format. Otherwise, the texture format must be 76*c8dee2aaSAndroid Build Coastguard Worker // `kRGBA_8888_SkColorType`. 77*c8dee2aaSAndroid Build Coastguard Worker class VelloRenderer final { 78*c8dee2aaSAndroid Build Coastguard Worker public: 79*c8dee2aaSAndroid Build Coastguard Worker explicit VelloRenderer(const Caps*); 80*c8dee2aaSAndroid Build Coastguard Worker ~VelloRenderer(); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker struct RenderParams { 83*c8dee2aaSAndroid Build Coastguard Worker // Dimensions of the fine rasterization target 84*c8dee2aaSAndroid Build Coastguard Worker uint32_t fWidth; 85*c8dee2aaSAndroid Build Coastguard Worker uint32_t fHeight; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker // The background color used during blending. 88*c8dee2aaSAndroid Build Coastguard Worker SkColor4f fBaseColor; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker // The antialiasing method. 91*c8dee2aaSAndroid Build Coastguard Worker VelloAaConfig fAaConfig; 92*c8dee2aaSAndroid Build Coastguard Worker }; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker // Run the full pipeline which supports compositing colors with different blend styles. Does 95*c8dee2aaSAndroid Build Coastguard Worker // nothing if `scene` or target render dimensions are empty. 96*c8dee2aaSAndroid Build Coastguard Worker // 97*c8dee2aaSAndroid Build Coastguard Worker // The color type of `target` must be `kAlpha_8_SkColorType` on platforms that support R8Unorm 98*c8dee2aaSAndroid Build Coastguard Worker // storage textures. Otherwise, it must be `kRGBA_8888_SkColorType`. 99*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<DispatchGroup> renderScene(const RenderParams&, 100*c8dee2aaSAndroid Build Coastguard Worker const VelloScene&, 101*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> target, 102*c8dee2aaSAndroid Build Coastguard Worker Recorder*) const; 103*c8dee2aaSAndroid Build Coastguard Worker 104*c8dee2aaSAndroid Build Coastguard Worker private: 105*c8dee2aaSAndroid Build Coastguard Worker // Pipelines 106*c8dee2aaSAndroid Build Coastguard Worker VelloBackdropDynStep fBackdrop; 107*c8dee2aaSAndroid Build Coastguard Worker VelloBboxClearStep fBboxClear; 108*c8dee2aaSAndroid Build Coastguard Worker VelloBinningStep fBinning; 109*c8dee2aaSAndroid Build Coastguard Worker VelloClipLeafStep fClipLeaf; 110*c8dee2aaSAndroid Build Coastguard Worker VelloClipReduceStep fClipReduce; 111*c8dee2aaSAndroid Build Coastguard Worker VelloCoarseStep fCoarse; 112*c8dee2aaSAndroid Build Coastguard Worker VelloDrawLeafStep fDrawLeaf; 113*c8dee2aaSAndroid Build Coastguard Worker VelloDrawReduceStep fDrawReduce; 114*c8dee2aaSAndroid Build Coastguard Worker VelloFlattenStep fFlatten; 115*c8dee2aaSAndroid Build Coastguard Worker VelloPathCountStep fPathCount; 116*c8dee2aaSAndroid Build Coastguard Worker VelloPathCountSetupStep fPathCountSetup; 117*c8dee2aaSAndroid Build Coastguard Worker VelloPathTilingStep fPathTiling; 118*c8dee2aaSAndroid Build Coastguard Worker VelloPathTilingSetupStep fPathTilingSetup; 119*c8dee2aaSAndroid Build Coastguard Worker VelloPathtagReduceStep fPathtagReduce; 120*c8dee2aaSAndroid Build Coastguard Worker VelloPathtagReduce2Step fPathtagReduce2; 121*c8dee2aaSAndroid Build Coastguard Worker VelloPathtagScan1Step fPathtagScan1; 122*c8dee2aaSAndroid Build Coastguard Worker VelloPathtagScanLargeStep fPathtagScanLarge; 123*c8dee2aaSAndroid Build Coastguard Worker VelloPathtagScanSmallStep fPathtagScanSmall; 124*c8dee2aaSAndroid Build Coastguard Worker VelloTileAllocStep fTileAlloc; 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker // Fine rasterization stage variants: 127*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ComputeStep> fFineArea; 128*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ComputeStep> fFineMsaa16; 129*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ComputeStep> fFineMsaa8; 130*c8dee2aaSAndroid Build Coastguard Worker }; 131*c8dee2aaSAndroid Build Coastguard Worker 132*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 133*c8dee2aaSAndroid Build Coastguard Worker 134*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_compute_VelloRenderer_DEFINED 135