blob: fbdc196694fadcb170b8ab997b15c8e416693788 [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_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 <memory>
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 ignores all color
// 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();
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;)
};
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;
};
// 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 `kRGBA_8888_SkColorType`.
std::unique_ptr<DispatchGroup> renderScene(const RenderParams&,
const VelloScene&,
sk_sp<TextureProxy> target,
Recorder*) const;
private:
// Pipelines
VelloBackdropStep fBackdrop;
VelloBackdropDynStep fBackdropDyn;
VelloBboxClearStep fBboxClear;
VelloBinningStep fBinning;
VelloClipLeafStep fClipLeaf;
VelloClipReduceStep fClipReduce;
VelloCoarseStep fCoarse;
VelloDrawLeafStep fDrawLeaf;
VelloDrawReduceStep fDrawReduce;
VelloFineStep fFine;
VelloPathCoarseFullStep fPathCoarseFull;
VelloPathsegStep fPathseg;
VelloPathtagReduceStep fPathtagReduce;
VelloPathtagReduce2Step fPathtagReduce2;
VelloPathtagScan1Step fPathtagScan1;
VelloPathtagScanLargeStep fPathtagScanLarge;
VelloPathtagScanSmallStep fPathtagScanSmall;
VelloTileAllocStep fTileAlloc;
// The full renderer uses an image atlas and a gradient ramp texture for image composition and
// gradient fills, respectively. These are currently unused, so we allocate and reuse two 1x1
// textures to satisfy the shader bindings.
//
// TODO: The contents of these textures will be scene dependent. Re-evaluate if/when we enable
// gradient fills or images.
sk_sp<TextureProxy> fGradientImage;
sk_sp<TextureProxy> fImageAtlas;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_compute_VelloRenderer_DEFINED