62 return PrecompileColorFilters::Compose({
sk_ref_sp(
this) }, { std::move(inner) });
68 fClipShaderOptions.reserve(2 * clipShaders.size());
74 withCTM ? withCTM->makeWithColorFilter(PrecompileColorFilters::Blend())
77 fClipShaderOptions.emplace_back(std::move(withCTM));
78 fClipShaderOptions.emplace_back(std::move(inverted));
82int PaintOptions::numShaderCombinations()
const {
83 int numShaderCombinations = 0;
85 numShaderCombinations +=
s->numCombinations();
89 return numShaderCombinations ? numShaderCombinations : 1;
92int PaintOptions::numMaskFilterCombinations()
const {
93 int numMaskFilterCombinations = 0;
95 numMaskFilterCombinations += mf->numCombinations();
99 return numMaskFilterCombinations ? numMaskFilterCombinations : 1;
102int PaintOptions::numColorFilterCombinations()
const {
103 int numColorFilterCombinations = 0;
105 numColorFilterCombinations += cf->numCombinations();
109 return numColorFilterCombinations ? numColorFilterCombinations : 1;
112int PaintOptions::numBlendModeCombinations()
const {
113 int numBlendCombos = fBlendModeOptions.
size();
116 numBlendCombos +=
b->numChildCombinations();
119 if (!numBlendCombos) {
124 return numBlendCombos;
127int PaintOptions::numClipShaderCombinations()
const {
128 int numClipShaderCombos = 0;
131 numClipShaderCombos += cs->numChildCombinations();
133 ++numClipShaderCombos;
138 return numClipShaderCombos ? numClipShaderCombos : 1;
142int PaintOptions::numCombinations()
const {
144 return this->numShaderCombinations() *
145 this->numMaskFilterCombinations() *
146 this->numColorFilterCombinations() *
147 this->numBlendModeCombinations() *
148 this->numClipShaderCombinations();
166 bool hasPrimitiveBlender,
170 : fOpaquePaintColor(opaquePaintColor)
173 , fColorFilter(colorFilter)
174 , fHasPrimitiveBlender(hasPrimitiveBlender)
175 , fClipShader(clipShader)
176 , fDstReadReq(dstReadReq)
196 bool fOpaquePaintColor;
197 std::pair<sk_sp<PrecompileBlender>,
int> fFinalBlender;
198 std::pair<sk_sp<PrecompileShader>,
int> fShader;
199 std::pair<sk_sp<PrecompileColorFilter>,
int> fColorFilter;
200 bool fHasPrimitiveBlender;
201 std::pair<sk_sp<PrecompileShader>,
int> fClipShader;
207void PaintOption::addPaintColorToKey(
const KeyContext& keyContext,
208 PaintParamsKeyBuilder* builder,
209 PipelineDataGatherer* gatherer)
const {
211 fShader.first->priv().addToKey(keyContext, builder, gatherer, fShader.second);
217void PaintOption::handlePrimitiveColor(
const KeyContext& keyContext,
218 PaintParamsKeyBuilder* keyBuilder,
219 PipelineDataGatherer* gatherer)
const {
220 if (fHasPrimitiveBlender) {
221 Blend(keyContext, keyBuilder, gatherer,
225 AddToKey(keyContext, keyBuilder, gatherer,
229 this->addPaintColorToKey(keyContext, keyBuilder, gatherer);
235 this->addPaintColorToKey(keyContext, keyBuilder, gatherer);
239void PaintOption::handlePaintAlpha(
const KeyContext& keyContext,
240 PaintParamsKeyBuilder* keyBuilder,
241 PipelineDataGatherer* gatherer)
const {
243 if (!fShader.first && !fHasPrimitiveBlender) {
250 if (!fOpaquePaintColor) {
251 Blend(keyContext, keyBuilder, gatherer,
256 this->handlePrimitiveColor(keyContext, keyBuilder, gatherer);
262 this->handlePrimitiveColor(keyContext, keyBuilder, gatherer);
266void PaintOption::handleColorFilter(
const KeyContext& keyContext,
267 PaintParamsKeyBuilder* builder,
268 PipelineDataGatherer* gatherer)
const {
269 if (fColorFilter.first) {
270 Compose(keyContext, builder, gatherer,
272 this->handlePaintAlpha(keyContext, builder, gatherer);
275 fColorFilter.first->priv().addToKey(keyContext, builder, gatherer,
276 fColorFilter.second);
279 this->handlePaintAlpha(keyContext, builder, gatherer);
284bool PaintOption::shouldDither(
SkColorType dstCT)
const {
300 return fShader.first && !fShader.first->isConstant(fShader.second);
303void PaintOption::handleDithering(
const KeyContext& keyContext,
304 PaintParamsKeyBuilder* builder,
305 PipelineDataGatherer* gatherer)
const {
307#ifndef SK_IGNORE_GPU_DITHER
308 SkColorType ct = keyContext.dstColorInfo().colorType();
309 if (this->shouldDither(ct)) {
310 Compose(keyContext, builder, gatherer,
312 this->handleColorFilter(keyContext, builder, gatherer);
320 this->handleColorFilter(keyContext, builder, gatherer);
324void PaintOption::handleDstRead(
const KeyContext& keyContext,
325 PaintParamsKeyBuilder* builder,
326 PipelineDataGatherer* gatherer)
const {
328 Blend(keyContext, builder, gatherer,
330 if (fFinalBlender.first) {
331 fFinalBlender.first->priv().addToKey(keyContext, builder, gatherer,
332 fFinalBlender.second);
334 AddKnownModeBlend(keyContext, builder, gatherer, SkBlendMode::kSrcOver);
338 this->handleDithering(keyContext, builder, gatherer);
344 this->handleDithering(keyContext, builder, gatherer);
351 this->handleDstRead(keyContext, keyBuilder, gatherer);
353 std::optional<SkBlendMode> finalBlendMode = this->
finalBlender()
361 if (fClipShader.first) {
363 fClipShader.first->priv().addToKey(keyContext, keyBuilder, gatherer,
373 keyBuilder->
addBlock(fixedFuncBlendModeID);
376void PaintOptions::createKey(
const KeyContext& keyContext,
379 int desiredCombination,
380 bool addPrimitiveBlender,
383 SkASSERT(desiredCombination < this->numCombinations());
385 const int numClipShaderCombos = this->numClipShaderCombinations();
386 const int numBlendModeCombos = this->numBlendModeCombinations();
387 const int numColorFilterCombinations = this->numColorFilterCombinations();
388 const int numMaskFilterCombinations = this->numMaskFilterCombinations();
390 const int desiredClipShaderCombination = desiredCombination % numClipShaderCombos;
391 int remainingCombinations = desiredCombination / numClipShaderCombos;
393 const int desiredBlendCombination = remainingCombinations % numBlendModeCombos;
394 remainingCombinations /= numBlendModeCombos;
396 const int desiredColorFilterCombination = remainingCombinations % numColorFilterCombinations;
397 remainingCombinations /= numColorFilterCombinations;
399 [[maybe_unused]]
const int desiredMaskFilterCombination =
400 remainingCombinations % numMaskFilterCombinations;
401 remainingCombinations /= numMaskFilterCombinations;
403 const int desiredShaderCombination = remainingCombinations;
404 SkASSERT(desiredShaderCombination < this->numShaderCombinations());
407 const bool kOpaquePaintColor =
true;
410 desiredClipShaderCombination);
412 std::pair<sk_sp<PrecompileBlender>,
int> finalBlender;
413 if (desiredBlendCombination < fBlendModeOptions.
size()) {
418 desiredBlendCombination - fBlendModeOptions.
size());
420 if (!finalBlender.first) {
424 finalBlender.first.get());
426 PaintOption option(kOpaquePaintColor,
429 desiredShaderCombination),
431 desiredColorFilterCombination),
437 option.toKey(keyContext, keyBuilder, gatherer);
442void create_blur_pipelines(
const KeyContext& keyContext,
443 PipelineDataGatherer* gatherer,
445 PaintOptions blurPaintOptions, imagePaintOptions;
453 blurPaintOptions.setBlendModes(blurBlendModes);
456 imagePaintOptions.setShaders({ imageShader });
457 imagePaintOptions.setBlendModes(imageBlendModes);
459 blurPaintOptions.priv().buildCombinations(keyContext,
465 imagePaintOptions.priv().buildCombinations(keyContext,
475void PaintOptions::buildCombinations(
476 const KeyContext& keyContext,
477 PipelineDataGatherer* gatherer,
479 bool withPrimitiveBlender,
481 const ProcessCombination& processCombination)
const {
483 PaintParamsKeyBuilder
builder(keyContext.dict());
486 PaintOptions tmp = *
this;
491 tmp.setBlendModes(newDrawBlendMode);
493 tmp.buildCombinations(keyContext, gatherer, drawTypes, withPrimitiveBlender, coverage,
497 create_blur_pipelines(keyContext, gatherer, processCombination);
500 int numCombinations = this->numCombinations();
501 for (
int i = 0; i < numCombinations; ++i) {
506 this->createKey(keyContext, &builder, gatherer, i, withPrimitiveBlender, coverage);
510 UniquePaintParamsID paintID = keyContext.dict()->findOrCreate(&builder);
512 processCombination(paintID, drawTypes, withPrimitiveBlender, coverage);
@ kSrcOver
r = s + (1-sa)*d
constexpr SkPMColor4f SK_PMColor4fWHITE
@ 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
sk_sp< T > sk_ref_sp(T *obj)
static sk_sp< SkBlender > Mode(SkBlendMode mode)
const Caps * caps() const
PaintOption(bool opaquePaintColor, const std::pair< sk_sp< PrecompileBlender >, int > &finalBlender, const std::pair< sk_sp< PrecompileShader >, int > &shader, const std::pair< sk_sp< PrecompileColorFilter >, int > &colorFilter, bool hasPrimitiveBlender, const std::pair< sk_sp< PrecompileShader >, int > &clipShader, DstReadRequirement dstReadReq, bool dither)
const PrecompileBlender * finalBlender() const
void toKey(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *) const
std::function< void(UniquePaintParamsID id, DrawTypeFlags, bool withPrimitiveBlender, Coverage)> ProcessCombination
void setClipShaders(SkSpan< const sk_sp< PrecompileShader > > clipShaders)
void addBlock(BuiltInCodeSnippetID id)
virtual bool isALocalMatrixShader() const
PrecompileBasePriv priv()
static std::pair< sk_sp< T >, int > SelectOption(SkSpan< const sk_sp< T > > options, int desiredOption)
virtual std::optional< SkBlendMode > asBlendMode() const
static sk_sp< PrecompileBlender > Mode(SkBlendMode)
sk_sp< PrecompileColorFilter > makeComposed(sk_sp< PrecompileColorFilter > inner) const
sk_sp< PrecompileShader > makeWithColorFilter(sk_sp< PrecompileColorFilter >)
sk_sp< PrecompileShader > makeWithWorkingColorSpace(sk_sp< SkColorSpace >)
sk_sp< PrecompileShader > makeWithCTM()
sk_sp< PrecompileShader > makeWithLocalMatrix()
const myers::Point & get(const myers::Segment &)
sk_sp< PrecompileShader > Image(SkEnumBitMask< PrecompileImageShaderFlags >)
sk_sp< PrecompileShader > CTM(SkSpan< const sk_sp< PrecompileShader > > wrapped)
sk_sp< PrecompileShader > Blur(sk_sp< PrecompileShader > child)
SK_API sk_sp< PrecompileShader > ColorFilter(SkSpan< const sk_sp< PrecompileShader > > shaders, SkSpan< const sk_sp< PrecompileColorFilter > > colorFilters)
SK_API sk_sp< PrecompileShader > LocalMatrix(SkSpan< const sk_sp< PrecompileShader > > wrapped)
SK_API sk_sp< PrecompileShader > WorkingColorSpace(SkSpan< const sk_sp< PrecompileShader > > shaders, SkSpan< const sk_sp< SkColorSpace > > colorSpaces)
static constexpr int kFixedFunctionBlendModeIDOffset
void AddToKey(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const SkBlender *blender)
void AddKnownModeBlend(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkBlendMode bm)
DstReadRequirement GetDstReadRequirement(const Caps *caps, std::optional< SkBlendMode > blendMode, Coverage coverage)
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)
DstReadRequirement get_dst_read_req(const Caps *caps, Coverage coverage, PrecompileBlender *blender)
void Blend(const KeyContext &keyContext, PaintParamsKeyBuilder *keyBuilder, PipelineDataGatherer *gatherer, AddToKeyFn addBlendToKey, AddToKeyFn addSrcToKey, AddToKeyFn addDstToKey)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const SkPMColor4f &)