32bool should_dither(
const PaintParams& p,
SkColorType dstCT) {
58 : fColor(
paint.getColor4f())
59 , fFinalBlender(
paint.refBlender())
60 , fShader(
paint.refShader())
61 , fColorFilter(
paint.refColorFilter())
62 , fPrimitiveBlender(
std::move(primitiveBlender))
63 , fClipShader(
std::move(clipShader))
64 , fDstReadReq(dstReadReq)
65 , fSkipColorXform(skipColorXform)
66 , fDither(
paint.isDither()) {}
132 static_cast<int>(bm));
133 builder->addBlock(
id);
141 if (!coeffs.empty()) {
175 if (keyContext.
recorder() && !proxy) {
176 SKGPU_LOG_W(
"Couldn't create dither shader's LUT");
186void PaintParams::addPaintColorToKey(
const KeyContext& keyContext,
187 PaintParamsKeyBuilder* keyBuilder,
188 PipelineDataGatherer* gatherer)
const {
190 AddToKey(keyContext, keyBuilder, gatherer, fShader.
get());
201void PaintParams::handlePrimitiveColor(
const KeyContext& keyContext,
202 PaintParamsKeyBuilder* keyBuilder,
203 PipelineDataGatherer* gatherer)
const {
204 if (fPrimitiveBlender) {
205 Blend(keyContext, keyBuilder, gatherer,
207 AddToKey(keyContext, keyBuilder, gatherer, fPrimitiveBlender.
get());
210 this->addPaintColorToKey(keyContext, keyBuilder, gatherer);
216 this->addPaintColorToKey(keyContext, keyBuilder, gatherer);
221void PaintParams::handlePaintAlpha(
const KeyContext& keyContext,
222 PaintParamsKeyBuilder* keyBuilder,
223 PipelineDataGatherer* gatherer)
const {
225 if (!fShader && !fPrimitiveBlender) {
229 keyContext.dstColorInfo()).premul();
234 if (fColor.fA != 1.0f) {
235 Blend(keyContext, keyBuilder, gatherer,
240 this->handlePrimitiveColor(keyContext, keyBuilder, gatherer);
246 this->handlePrimitiveColor(keyContext, keyBuilder, gatherer);
250void PaintParams::handleColorFilter(
const KeyContext& keyContext,
251 PaintParamsKeyBuilder* builder,
252 PipelineDataGatherer* gatherer)
const {
254 Compose(keyContext, builder, gatherer,
256 this->handlePaintAlpha(keyContext, builder, gatherer);
259 AddToKey(keyContext, builder, gatherer, fColorFilter.
get());
262 this->handlePaintAlpha(keyContext, builder, gatherer);
266void PaintParams::handleDithering(
const KeyContext& keyContext,
267 PaintParamsKeyBuilder* builder,
268 PipelineDataGatherer* gatherer)
const {
270#ifndef SK_IGNORE_GPU_DITHER
271 SkColorType ct = keyContext.dstColorInfo().colorType();
272 if (should_dither(*
this, ct)) {
273 Compose(keyContext, builder, gatherer,
275 this->handleColorFilter(keyContext, builder, gatherer);
283 this->handleColorFilter(keyContext, builder, gatherer);
287void PaintParams::handleDstRead(
const KeyContext& keyContext,
288 PaintParamsKeyBuilder* builder,
289 PipelineDataGatherer* gatherer)
const {
291 Blend(keyContext, builder, gatherer,
294 AddToKey(keyContext, builder, gatherer, fFinalBlender.
get());
300 this->handleDithering(keyContext, builder, gatherer);
306 this->handleDithering(keyContext, builder, gatherer);
313 this->handleDstRead(keyContext, builder, gatherer);
324 AddToKey(keyContext, builder, gatherer, fClipShader.
get());
334 builder->addBlock(fixedFuncBlendModeID);
343 if (fPrimitiveBlender) {
#define SKGPU_LOG_W(fmt,...)
@ kLastCoeffMode
last porter duff blend mode
@ kSrcOver
r = s + (1-sa)*d
SkBlenderBase * as_BB(SkBlender *blend)
SkColorSpace * sk_srgb_singleton()
@ kARGB_4444_SkColorType
pixel with 4 bits for alpha, red, green, blue; in 16-bit word
@ kRGB_565_SkColorType
pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word
@ kUnknown_SkColorType
uninitialized
SkShaderBase * as_SB(SkShader *shader)
virtual std::optional< SkBlendMode > asBlendMode() const
SkColorSpace * colorSpace() const
virtual bool isConstant() const
SkIPoint dstOffset() const
Recorder * recorder() const
sk_sp< TextureProxy > dstTexture() const
PaintParams & operator=(const PaintParams &)
sk_sp< SkBlender > refFinalBlender() const
sk_sp< SkBlender > refPrimitiveBlender() const
void toKey(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *) const
PaintParams(const SkPaint &, sk_sp< SkBlender > primitiveBlender, sk_sp< SkShader > clipShader, DstReadRequirement dstReadReq, bool skipColorXform)
std::optional< SkBlendMode > asFinalBlendMode() const
static SkColor4f Color4fPrepForDst(SkColor4f srgb, const SkColorInfo &dstColorInfo)
sk_sp< SkColorFilter > refColorFilter() const
void notifyImagesInUse(Recorder *, DrawContext *) const
sk_sp< SkShader > refShader() const
static sk_sp< TextureProxy > CreateCachedProxy(Recorder *, const SkBitmap &, Mipmapped=skgpu::Mipmapped::kNo)
static constexpr int kFixedFunctionBlendModeIDOffset
void AddToKey(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const SkBlender *blender)
std::function< void()> AddToKeyFn
void AddKnownModeBlend(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkBlendMode bm)
void Compose(const KeyContext &keyContext, PaintParamsKeyBuilder *keyBuilder, PipelineDataGatherer *gatherer, AddToKeyFn addInnerToKey, AddToKeyFn addOuterToKey)
void AddDitherBlock(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkColorType ct)
void AddDstReadBlock(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, DstReadRequirement dstReadReq)
void Blend(const KeyContext &keyContext, PaintParamsKeyBuilder *keyBuilder, PipelineDataGatherer *gatherer, AddToKeyFn addBlendToKey, AddToKeyFn addSrcToKey, AddToKeyFn addDstToKey)
void AddModeBlend(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkBlendMode bm)
void NotifyImagesInUse(Recorder *recorder, DrawContext *drawContext, const SkBlender *blender)
float DitherRangeForConfig(SkColorType dstColorType)
SkSpan< const float > GetPorterDuffBlendConstants(SkBlendMode mode)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, SkBlendMode)
static void BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, SkSpan< const float > coeffs)
static void BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const DitherData &)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, sk_sp< TextureProxy > dst, SkIPoint dstOffset)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const SkPMColor4f &)