79#define VALIDATE_UNIFORMS(gatherer, dict, codeSnippetID) \
80 SkDEBUGCODE(UniformExpectationsValidator uev(gatherer, dict->getUniforms(codeSnippetID));)
88void add_solid_uniform_data(
const ShaderCodeDictionary* dict,
90 PipelineDataGatherer* gatherer) {
92 gatherer->write(premulColor);
101 add_solid_uniform_data(keyContext.
dict(), premulColor, gatherer);
117void add_alpha_only_paint_color_uniform_data(
const ShaderCodeDictionary* dict,
119 PipelineDataGatherer* gatherer) {
121 gatherer->writePaintColor(premulColor);
129 add_rgb_paint_color_uniform_data(keyContext.
dict(), keyContext.
paintColor(), gatherer);
137 add_alpha_only_paint_color_uniform_data(keyContext.
dict(), keyContext.
paintColor(), gatherer);
155 SkV4 coords{
static_cast<float>(dstOffset.
x()),
156 static_cast<float>(dstOffset.
y()),
157 dstTexture ? 1.0f / dstTexture->dimensions().width() : 1.0f,
158 dstTexture ? 1.0f / dstTexture->dimensions().height() : 1.0f };
159 gatherer->
write(coords);
169 add_dst_read_sample_uniform_data(keyContext.
dict(), gatherer, std::move(dstTexture), dstOffset);
182 if (gradData.
fNumStops <= kInternalStopLimit) {
203void add_gradient_postamble(
const GradientShaderBlocks::GradientData& gradData,
204 PipelineDataGatherer* gatherer) {
209 static_assert(
static_cast<int>(ColorSpace::kLab) == 2);
210 static_assert(
static_cast<int>(ColorSpace::kOKLab) == 3);
211 static_assert(
static_cast<int>(ColorSpace::kOKLabGamutMap) == 4);
212 static_assert(
static_cast<int>(ColorSpace::kLCH) == 5);
213 static_assert(
static_cast<int>(ColorSpace::kOKLCH) == 6);
214 static_assert(
static_cast<int>(ColorSpace::kOKLCHGamutMap) == 7);
215 static_assert(
static_cast<int>(ColorSpace::kHSL) == 9);
216 static_assert(
static_cast<int>(ColorSpace::kHWB) == 10);
218 bool inputPremul =
static_cast<bool>(gradData.fInterpolation.fInPremul);
220 if (gradData.fNumStops > kInternalStopLimit) {
221 gatherer->write(gradData.fNumStops);
224 gatherer->write(
static_cast<int>(gradData.fTM));
225 gatherer->write(
static_cast<int>(gradData.fInterpolation.fColorSpace));
226 gatherer->write(
static_cast<int>(inputPremul));
229void add_linear_gradient_uniform_data(
const ShaderCodeDictionary* dict,
231 const GradientShaderBlocks::GradientData& gradData,
232 PipelineDataGatherer* gatherer) {
235 add_gradient_preamble(gradData, gatherer);
236 gatherer->write(gradData.fPoints[0]);
237 gatherer->write(gradData.fPoints[1]);
238 add_gradient_postamble(gradData, gatherer);
241void add_radial_gradient_uniform_data(
const ShaderCodeDictionary* dict,
243 const GradientShaderBlocks::GradientData& gradData,
244 PipelineDataGatherer* gatherer) {
247 add_gradient_preamble(gradData, gatherer);
248 gatherer->write(gradData.fPoints[0]);
249 gatherer->write(gradData.fRadii[0]);
250 add_gradient_postamble(gradData, gatherer);
253void add_sweep_gradient_uniform_data(
const ShaderCodeDictionary* dict,
255 const GradientShaderBlocks::GradientData& gradData,
256 PipelineDataGatherer* gatherer) {
259 add_gradient_preamble(gradData, gatherer);
260 gatherer->write(gradData.fPoints[0]);
261 gatherer->write(gradData.fBias);
262 gatherer->write(gradData.fScale);
263 add_gradient_postamble(gradData, gatherer);
266void add_conical_gradient_uniform_data(
const ShaderCodeDictionary* dict,
268 const GradientShaderBlocks::GradientData& gradData,
269 PipelineDataGatherer* gatherer) {
272 add_gradient_preamble(gradData, gatherer);
273 gatherer->write(gradData.fPoints[0]);
274 gatherer->write(gradData.fPoints[1]);
275 gatherer->write(gradData.fRadii[0]);
276 gatherer->write(gradData.fRadii[1]);
277 add_gradient_postamble(gradData, gatherer);
284 , fPoints{{0.0f, 0.0f}, {0.0f, 0.0f}}
289 , fNumStops(numStops) {
291 sk_bzero(fOffsets,
sizeof(fOffsets));
296 float radius0,
float radius1,
297 float bias,
float scale,
301 const float* offsets,
308 , fNumStops(numStops)
309 , fInterpolation(
interp) {
321 memcpy(rawOffsets, offsets,
fNumStops *
sizeof(
float));
344 auto dict = keyContext.
dict();
355 switch (gradData.
fType) {
356 case SkShaderBase::GradientType::kLinear:
361 add_linear_gradient_uniform_data(dict, codeSnippetID, gradData, gatherer);
363 case SkShaderBase::GradientType::kRadial:
368 add_radial_gradient_uniform_data(dict, codeSnippetID, gradData, gatherer);
370 case SkShaderBase::GradientType::kSweep:
375 add_sweep_gradient_uniform_data(dict, codeSnippetID, gradData, gatherer);
377 case SkShaderBase::GradientType::kConical:
382 add_conical_gradient_uniform_data(dict, codeSnippetID, gradData, gatherer);
386 SkDEBUGFAIL(
"Expected a gradient shader, but it wasn't one.");
390 builder->addBlock(codeSnippetID);
398 const SkM44& localMatrix,
403 bool wasInverted = localMatrix.
invert(&lmInverse);
408 gatherer->
write(lmInverse);
418 add_localmatrixshader_uniform_data(keyContext.
dict(), lmShaderData.
fLocalMatrix, gatherer);
427static constexpr int kColorSpaceXformFlagAlphaSwizzle = 0x20;
438 int colorXformFlags = SkTo<int>(steps.
flags.
mask());
443 colorXformFlags |= SkTo<int>(gamutSteps.
flags.
mask());
446 SkASSERT(colorXformFlags < kColorSpaceXformFlagAlphaSwizzle);
447 colorXformFlags |= kColorSpaceXformFlagAlphaSwizzle;
450 gatherer->
write(colorXformFlags);
457 gatherer->
write(SkTo<int>(skcms_TFType::skcms_TFType_Invalid));
461 const float identity[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
466 gamutTransform.
setAll(m[0] + m[3] + m[6], 0, 0,
467 m[1] + m[4] + m[7], 0, 0,
468 m[2] + m[5] + m[8], 0, 0);
470 gamutTransform.
setAll(m[6], m[3], m[0],
474 gamutTransform.
setAll(0, 0, 0,
478 gamutTransform.
setAll(m[0], m[3], m[6],
489 gatherer->
write(SkTo<int>(skcms_TFType::skcms_TFType_Invalid));
493 switch (readSwizzle) {
512void add_image_uniform_data(
const ShaderCodeDictionary* dict,
513 const ImageShaderBlock::ImageData& imgData,
514 PipelineDataGatherer* gatherer) {
515 SkASSERT(!imgData.fSampling.useCubic);
518 gatherer->write(
SkSize::Make(1.f/imgData.fImgSize.width(), 1.f/imgData.fImgSize.height()));
519 gatherer->write(imgData.fSubset);
520 gatherer->write(SkTo<int>(imgData.fTileModes[0]));
521 gatherer->write(SkTo<int>(imgData.fTileModes[1]));
522 gatherer->write(SkTo<int>(imgData.fSampling.filter));
524 add_color_space_uniforms(imgData.fSteps, imgData.fReadSwizzle, gatherer);
527void add_cubic_image_uniform_data(
const ShaderCodeDictionary* dict,
528 const ImageShaderBlock::ImageData& imgData,
529 PipelineDataGatherer* gatherer) {
530 SkASSERT(imgData.fSampling.useCubic);
533 gatherer->write(
SkSize::Make(1.f/imgData.fImgSize.width(), 1.f/imgData.fImgSize.height()));
534 gatherer->write(imgData.fSubset);
535 gatherer->write(SkTo<int>(imgData.fTileModes[0]));
536 gatherer->write(SkTo<int>(imgData.fTileModes[1]));
540 add_color_space_uniforms(imgData.fSteps, imgData.fReadSwizzle, gatherer);
543void add_hw_image_uniform_data(
const ShaderCodeDictionary* dict,
544 const ImageShaderBlock::ImageData& imgData,
545 PipelineDataGatherer* gatherer) {
546 SkASSERT(!imgData.fSampling.useCubic);
549 gatherer->write(
SkSize::Make(1.f/imgData.fImgSize.width(), 1.f/imgData.fImgSize.height()));
551 add_color_space_uniforms(imgData.fSteps, imgData.fReadSwizzle, gatherer);
562 : fSampling(sampling)
563 , fTileModes{tileModeX, tileModeY}
566 , fReadSwizzle(readSwizzle) {
588 const Caps* caps = keyContext.
caps();
593 doTilingInHw ? imgData.
fTileModes : kDefaultTileModes,
597 add_hw_image_uniform_data(keyContext.
dict(), imgData, gatherer);
600 add_cubic_image_uniform_data(keyContext.
dict(), imgData, gatherer);
603 add_image_uniform_data(keyContext.
dict(), imgData, gatherer);
627 for (
int i = 0; i < 4; ++i) {
634void add_cubic_yuv_image_uniform_data(
const ShaderCodeDictionary* dict,
635 const YUVImageShaderBlock::ImageData& imgData,
636 PipelineDataGatherer* gatherer) {
639 gatherer->write(
SkSize::Make(1.f/imgData.fImgSize.width(), 1.f/imgData.fImgSize.height()));
640 gatherer->write(
SkSize::Make(1.f/imgData.fImgSizeUV.width(), 1.f/imgData.fImgSizeUV.height()));
641 gatherer->write(imgData.fSubset);
642 gatherer->write(SkTo<int>(imgData.fTileModes[0]));
643 gatherer->write(SkTo<int>(imgData.fTileModes[1]));
647 for (
int i = 0; i < 4; ++i) {
648 gatherer->writeHalf(imgData.fChannelSelect[i]);
650 gatherer->writeHalf(imgData.fYUVtoRGBMatrix);
651 gatherer->write(imgData.fYUVtoRGBTranslate);
661 : fSampling(sampling)
662 , fSamplingUV(sampling)
663 , fTileModes{tileModeX, tileModeY}
665 , fImgSizeUV(imgSize)
690 add_cubic_yuv_image_uniform_data(keyContext.
dict(), imgData, gatherer);
693 add_yuv_image_uniform_data(keyContext.
dict(), imgData, gatherer);
716 add_coordclamp_uniform_data(keyContext.
dict(), clampData, gatherer);
739 add_dither_uniform_data(keyContext.
dict(), data, gatherer);
745 gatherer->add(
kNearest, kRepeatTiling, data.fLUTProxy);
761 gatherer->
write(
static_cast<int>(noiseData.
fType));
769 gatherer->add(kNearestSampling, kRepeatXTileModes, noiseData.
fNoiseProxy);
778 add_perlin_noise_uniform_data(keyContext.
dict(), noiseData, gatherer);
800 gatherer->
write(SkTo<int>(blendMode));
813 gatherer->
writeHalf(
SkV4{coeffs[0], coeffs[1], coeffs[2], coeffs[3]});
844 gatherer->
write(data.fMatrix);
845 gatherer->
write(data.fTranslate);
846 gatherer->
write(
static_cast<int>(data.fInHSLA));
856 add_matrix_colorfilter_uniform_data(keyContext.
dict(), matrixCFData, gatherer);
882 add_table_colorfilter_uniform_data(keyContext.
dict(), data, gatherer);
890void add_color_space_xform_uniform_data(
905 : fSteps(src, srcAT, dst, dstAT) {}
911 add_color_space_xform_uniform_data(keyContext.
dict(), data, gatherer);
922 Blend(keyContext, builder, gatherer,
940 : fEffect(
std::move(effect)) {}
944 : fEffect(
std::move(effect))
945 , fUniforms(
std::move(uniforms)) {}
950 return a ?
a->equals(
b) : (
a ==
b);
960 const SkData* uniformData,
966 SkDEBUGCODE(UniformExpectationsValidator uev(gatherer, graphiteUniforms);)
970 if (!rtsUniforms.empty() && uniformData) {
972 const uint8_t* uniformBase = uniformData->
bytes();
973 for (
size_t index = 0; index < rtsUniforms.size(); ++index) {
974 const Uniform& uniform = graphiteUniforms[index];
976 const uint8_t* uniformPtr = uniformBase + rtsUniforms[index].offset;
978 gatherer->
write(uniform, uniformPtr);
1024 builder->beginBlock(codeSnippetID);
1041void add_children_to_key(
const KeyContext& keyContext,
1042 PaintParamsKeyBuilder* builder,
1043 PipelineDataGatherer* gatherer,
1052 for (
size_t index = 0; index < children.
size(); ++index) {
1054 std::optional<ChildType>
type = child.
type();
1055 if (
type == ChildType::kShader) {
1057 }
else if (
type == ChildType::kColorFilter) {
1059 }
else if (
type == ChildType::kBlender) {
1063 switch (childInfo[index].
type) {
1064 case ChildType::kShader:
1070 case ChildType::kColorFilter:
1075 case ChildType::kBlender:
1085 PaintParamsKeyBuilder* builder,
1086 PipelineDataGatherer* gatherer,
1094 keyContext.dstColorInfo().colorSpace());
1098 { effect, std::move(uniforms) });
1100 add_children_to_key(keyContext, builder, gatherer,
1101 blender->
children(), effect->children());
1107 DrawContext* drawContext,
1109 for (
const auto& child : children) {
1110 if (child.
type().has_value()) {
1111 switch (*child.
type()) {
1112 case SkRuntimeEffect::ChildType::kShader:
1115 case SkRuntimeEffect::ChildType::kColorFilter:
1118 case SkRuntimeEffect::ChildType::kBlender:
1137 case SkBlenderBase::BlenderType::k##type: \
1138 add_to_key(keyContext, \
1141 static_cast<const Sk##type##Blender*>(blender)); \
1153 if (
as_BB(blender)->
type() == SkBlenderBase::BlenderType::kRuntime) {
1186 filter->
dst().
get(), kAlphaType);
1196 Compose(keyContext, keyBuilder, gatherer,
1237 add_children_to_key(keyContext, builder, gatherer,
1238 filter->
children(), effect->children());
1240 builder->endBlock();
1252 SKGPU_LOG_W(
"Couldn't create TableColorFilter's table");
1284 Compose(keyContext, builder, gatherer,
1287 Compose(keyContext, builder, gatherer,
1291 dstCS.
get(), dstAT, workingCS.
get(), workingAT);
1303 workingCS.
get(), workingAT, dstCS.
get(), dstAT);
1321 case SkColorFilterBase::Type::k##type: \
1322 add_to_key(keyContext, \
1325 static_cast<const Sk##type##ColorFilter*>(filter)); \
1337 if (
as_CFB(filter)->
type() == SkColorFilterBase::Type::kCompose) {
1342 }
else if (
as_CFB(filter)->
type() == SkColorFilterBase::Type::kWorkingFormat) {
1346 }
else if (
as_CFB(filter)->
type() == SkColorFilterBase::Type::kRuntime) {
1361 Blend(keyContext, builder, gatherer,
1394 builder->endBlock();
1434 Compose(keyContext, builder, gatherer,
1459 builder->endBlock();
1483 SkASSERT(!imageToDraw->isAlphaOnly());
1493 imageToDraw->dimensions(),
1502 case 'r': imgData.
fChannelSelect[locIndex] = {1.f, 0.f, 0.f, 0.f};
break;
1503 case 'g': imgData.
fChannelSelect[locIndex] = {0.f, 1.f, 0.f, 0.f};
break;
1504 case 'b': imgData.
fChannelSelect[locIndex] = {0.f, 0.f, 1.f, 0.f};
break;
1505 case 'a': imgData.
fChannelSelect[locIndex] = {0.f, 0.f, 0.f, 1.f};
break;
1521 if (ssx > 1 || ssy > 1) {
1562 SkASSERT(yuvM[3] == 0 && yuvM[8] == 0 && yuvM[13] == 0 && yuvM[18] == 1);
1563 SkASSERT(yuvM[15] == 0 && yuvM[16] == 0 && yuvM[17] == 0 && yuvM[19] == 0);
1565 yuvM[ 0], yuvM[ 1], yuvM[ 2],
1566 yuvM[ 5], yuvM[ 6], yuvM[ 7],
1567 yuvM[10], yuvM[11], yuvM[12]
1580 if (!origShader->
isRaw()) {
1582 imageToDraw->alphaType(),
1588 Compose(keyContext, builder, gatherer,
1592 builder->endBlock();
1611 SKGPU_LOG_W(
"%s is an unsupported read swizzle. Defaulting to RGBA.\n",
1627 SKGPU_LOG_W(
"Couldn't convert ImageShader's image to a Graphite-backed image");
1631 if (
as_IB(imageToDraw)->isYUVA()) {
1636 std::move(imageToDraw),
1640 auto view =
AsView(imageToDraw.get());
1646 view.proxy()->dimensions(),
1653 if (imageToDraw->isAlphaOnly()) {
1658 if (!shader->
isRaw()) {
1660 imageToDraw->alphaType(),
1665 Blend(keyContext, builder, gatherer,
1685 if (!
image->isGraphiteBacked()) {
1705 if (
as_SB(wrappedShader)->
type() == SkShaderBase::ShaderType::kImage) {
1706 auto imgShader =
static_cast<const SkImageShader*
>(wrappedShader);
1711 auto imgBase =
as_IB(imgShader->image());
1712 if (imgBase->isGraphiteBacked() && !imgBase->isYUVA()) {
1713 auto imgGraphite =
static_cast<Image*
>(imgBase);
1715 const auto& view = imgGraphite->textureProxyView();
1717 matrix.setScaleY(-1);
1718 matrix.setTranslateY(view.height());
1730 AddToKey(newContext, builder, gatherer, wrappedShader);
1732 builder->endBlock();
1754 std::unique_ptr<SkPerlinNoiseShader::PaintingData> paintingData = shader->
getPaintingData();
1755 paintingData->generateBitmaps();
1758 keyContext.
recorder(), paintingData->getPermutationsBitmap());
1763 if (!perm || !noise) {
1764 SKGPU_LOG_W(
"Couldn't create tables for PerlinNoiseShader");
1771 paintingData->fBaseFrequency,
1773 {paintingData->fStitchDataInit.fWidth, paintingData->fStitchDataInit.fHeight});
1807 if (!
info.success) {
1808 SKGPU_LOG_W(
"Couldn't access PictureShaders' Image info");
1820 SKGPU_LOG_W(
"Couldn't create SkImage for PictureShader");
1829 SKGPU_LOG_W(
"Couldn't create SkImageShader for PictureShader");
1834 AddToKey(keyContext, builder, gatherer, imgShader.
get());
1854 {effect, std::move(uniforms)});
1856 add_children_to_key(keyContext, builder, gatherer,
1857 shader->
children(), effect->children());
1859 builder->endBlock();
1871 SKGPU_LOG_W(
"Raster-only SkShader (SkTransformShader) encountered");
1882 SKGPU_LOG_W(
"Raster-only SkShader (SkTriColorShader) encountered");
1907 Compose(keyContext, builder, gatherer,
1913 workingCS.
get(), dstAT, dstCS.
get(), dstAT);
1925 const float* offsets) {
1931 for (
int i = 0; i < numStops; i++) {
1934 SkColor4f unpremulColor = colors[i].unpremul();
1941 float mantissa = frexp(
offset, &exponent);
1949#if defined(SK_DEBUG)
1959 colorsAndOffsetsBitmap.
erase(
SkColor4f{mantissa, (float)exponent, 0, 1},
1963 return colorsAndOffsetsBitmap;
1976 bool inputPremul =
static_cast<bool>(
interp.fInPremul);
1978 switch (
interp.fColorSpace) {
1979 case ColorSpace::kLab:
1980 case ColorSpace::kOKLab:
1981 case ColorSpace::kOKLabGamutMap:
1982 case ColorSpace::kLCH:
1983 case ColorSpace::kOKLCH:
1984 case ColorSpace::kOKLCHGamutMap:
1985 case ColorSpace::kHSL:
1986 case ColorSpace::kHWB:
1987 inputPremul =
false;
2001 intermediateCS, intermediateAlphaType, dstColorSpace, dstColorInfo.
alphaType());
2006 Compose(keyContext, builder, gatherer,
2027 const float* positions = xformedColors.
fPositions;
2028 const int colorCount = xformedColors.
fColors.
size();
2036 if (colorsAndOffsetsBitmap.
empty()) {
2037 SKGPU_LOG_W(
"Couldn't create GradientShader's color and offset bitmap");
2046 SKGPU_LOG_W(
"Couldn't create GradientShader's color and offset bitmap proxy");
2145 case SkShaderBase::GradientType::k##type: \
2146 add_gradient_to_key(keyContext, \
2149 static_cast<const Sk##type##Gradient*>(shader)); \
2154 SkDEBUGFAIL(
"Gradient shader says its type is none");
2172 case SkShaderBase::ShaderType::k##type: \
2173 add_to_key(keyContext, \
2176 static_cast<const Sk##type##Shader*>(shader)); \
2192 case SkShaderBase::ShaderType::k##type: \
2193 notify_in_use(recorder, \
2195 static_cast<const Sk##type##Shader*>(shader)); \
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
#define VALIDATE_UNIFORMS(gatherer, dict, codeSnippetID)
#define SKGPU_LOG_W(fmt,...)
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
#define SkDEBUGFAIL(message)
#define SkDEBUGFAILF(fmt,...)
@ kSrcOver
r = s + (1-sa)*d
#define SK_ALL_BLENDERS(M)
SkBlenderBase * as_BB(SkBlender *blend)
constexpr SkPMColor4f SK_PMColor4fTRANSPARENT
#define SK_ALL_COLOR_FILTERS(M)
static SkColorFilterBase * as_CFB(SkColorFilter *filter)
SkColorSpace * sk_srgb_linear_singleton()
SkColorSpace * sk_srgb_singleton()
@ kRGBA_F16_SkColorType
pixel with half floats for red, green, blue, alpha;
static float2 interp(const float2 &v0, const float2 &v1, const float2 &t)
float SkHalfToFloat(SkHalf h)
SkHalf SkFloatToHalf(float f)
static SkImage_Base * as_IB(SkImage *image)
static void sk_bzero(void *buffer, size_t size)
SkShaderBase * as_SB(SkShader *shader)
#define SK_ALL_GRADIENTS(M)
#define SK_ALL_SHADERS(M)
void SkColorMatrix_YUV2RGB(SkYUVColorSpace cs, float m[20])
Type::kYUV Type::kRGBA() int(0.7 *637)
void allocPixels(const SkImageInfo &info, size_t rowBytes)
void erase(SkColor4f c, const SkIRect &area) const
sk_sp< SkShader > dst() const
sk_sp< SkShader > src() const
const SkMatrix & ctm() const
sk_sp< SkShader > proxyShader() const
sk_sp< SkColorSpace > colorSpace() const
sk_sp< SkColorFilterBase > filter() const
sk_sp< SkShader > shader() const
SkAlphaType alphaType() const
sk_sp< SkColorSpace > refColorSpace() const
SkColorSpace * colorSpace() const
SkColorType colorType() const
static sk_sp< SkColorSpace > MakeSRGB()
sk_sp< SkColorFilterBase > inner() const
sk_sp< SkColorFilterBase > outer() const
const SkPoint & getEndCenter() const
SkScalar getEndRadius() const
const SkPoint & getStartCenter() const
SkScalar getStartRadius() const
sk_sp< SkShader > shader() const
const uint8_t * bytes() const
const Interpolation & getInterpolation() const
void setCachedBitmap(SkBitmap b) const
const SkBitmap & cachedBitmap() const
SkTileMode getTileMode() const
SkSamplingOptions sampling() const
static SkM44 CubicResamplerMatrix(float B, float C)
SkTileMode tileModeX() const
sk_sp< SkImage > image() const
SkTileMode tileModeY() const
const SkPoint & start() const
const SkPoint & end() const
const SkMatrix & localMatrix() const
sk_sp< SkShader > wrappedShader() const
bool invert(SkM44 *inverse) const
const float * matrix() const
static SkMatrix Scale(SkScalar sx, SkScalar sy)
SkMatrix & setAll(SkScalar scaleX, SkScalar skewX, SkScalar transX, SkScalar skewY, SkScalar scaleY, SkScalar transY, SkScalar persp0, SkScalar persp1, SkScalar persp2)
SkMatrix & preConcat(const SkMatrix &other)
SkPerlinNoiseShaderType noiseType() const
std::unique_ptr< PaintingData > getPaintingData() const
SkTileMode tileModeY() const
SkTileMode tileModeX() const
SkFilterMode filter() const
sk_sp< SkPicture > picture() const
const SkPoint & center() const
sk_sp< SkRuntimeEffect > effect() const
SkSpan< const SkRuntimeEffect::ChildPtr > children() const
sk_sp< const SkData > uniforms() const
SkSpan< const SkRuntimeEffect::ChildPtr > children() const
sk_sp< SkRuntimeEffect > effect() const
sk_sp< const SkData > uniforms() const
static sk_sp< const SkData > TransformUniforms(SkSpan< const SkRuntimeEffect::Uniform > uniforms, sk_sp< const SkData > originalData, const SkColorSpaceXformSteps &)
static bool UsesColorTransform(const SkRuntimeEffect *effect)
SkBlender * blender() const
SkShader * shader() const
std::optional< ChildType > type() const
SkColorFilter * colorFilter() const
SkSpan< const Uniform > uniforms() const
SkSpan< const SkRuntimeEffect::ChildPtr > children() const
sk_sp< const SkData > uniformData(const SkColorSpace *dstCS) const
sk_sp< SkRuntimeEffect > effect() const
virtual GradientType asGradient(GradientInfo *info=nullptr, SkMatrix *localMatrix=nullptr) const
constexpr size_t size() const
const char * data() const
const SkPoint & center() const
const SkBitmap & bitmap() const
sk_sp< SkShader > shader() const
sk_sp< SkColorSpace > workingSpace() const
SkMatrix originMatrix() const
SkYUVColorSpace yuvColorSpace() const
static constexpr int kYUVAChannelCount
static constexpr Swizzle Concat(const Swizzle &a, const Swizzle &b)
SkString asString() const
static constexpr Swizzle BGRA()
static constexpr Swizzle RGBA()
static constexpr Swizzle RGB1()
bool clampToBorderSupport() const
int maxTextureSize() const
std::tuple< int, int > uvSubsampleFactors() const
const SkYUVAInfo & yuvaInfo() const
const TextureProxyView & proxyView(int channelIndex) const
const SkM44 & local2Dev() const
RuntimeEffectDictionary * rtEffectDict() const
Recorder * recorder() const
const SkMatrix * localMatrix() const
const SkPMColor4f & paintColor() const
const SkColorInfo & dstColorInfo() const
ShaderCodeDictionary * dict() const
const Caps * caps() const
void writeHalf(const T &t)
void writeArray(SkSpan< const T > t)
void writePaintColor(const SkPMColor4f &color)
static sk_sp< TextureProxy > CreateCachedProxy(Recorder *, const SkBitmap &, Mipmapped=skgpu::Mipmapped::kNo)
const Caps * caps() const
void set(int codeSnippetID, sk_sp< const SkRuntimeEffect > effect)
int findOrCreateRuntimeEffectSnippet(const SkRuntimeEffect *effect)
const ShaderSnippet * getEntry(int codeSnippetID) const SK_EXCLUDES(fSpinLock)
SkISize dimensions() const
sk_sp< TextureProxy > refProxy() const
const uint8_t uint32_t uint32_t GError ** error
static constexpr int kUnknownRuntimeEffectIDStart
SK_API sk_sp< SkSurface > RenderTarget(GrRecordingContext *context, skgpu::Budgeted budgeted, const SkImageInfo &imageInfo, int sampleCount, GrSurfaceOrigin surfaceOrigin, const SkSurfaceProps *surfaceProps, bool shouldCreateWithMips=false, bool isProtected=false)
void AddToKey(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const SkBlender *blender)
void AddKnownModeBlend(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkBlendMode bm)
@ kConicalGradientShader8
@ kSweepGradientShaderTexture
@ kConicalGradientShader4
@ kLinearGradientShaderTexture
@ kColorSpaceXformColorFilter
@ kConicalGradientShaderTexture
@ kRadialGradientShaderTexture
void AddBlendModeColorFilter(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkBlendMode bm, const SkPMColor4f &srcColor)
void Compose(const KeyContext &keyContext, PaintParamsKeyBuilder *keyBuilder, PipelineDataGatherer *gatherer, AddToKeyFn addInnerToKey, AddToKeyFn addOuterToKey)
static void notify_in_use(Recorder *recorder, DrawContext *drawContext, const SkBlendShader *shader)
static void add_yuv_image_to_key(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const SkImageShader *origShader, sk_sp< const SkImage > imageToDraw, SkSamplingOptions sampling)
static bool can_do_tiling_in_hw(const Caps *caps, const ImageShaderBlock::ImageData &imgData)
static SkBitmap create_color_and_offset_bitmap(int numStops, const SkPMColor4f *colors, const float *offsets)
std::pair< sk_sp< SkImage >, SkSamplingOptions > GetGraphiteBacked(Recorder *recorder, const SkImage *imageIn, SkSamplingOptions sampling)
static void make_interpolated_to_dst(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const GradientShaderBlocks::GradientData &gradData, const SkGradientShader::Interpolation &interp, SkColorSpace *intermediateCS)
static void add_to_key(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const SkBlendModeColorFilter *filter)
void Blend(const KeyContext &keyContext, PaintParamsKeyBuilder *keyBuilder, PipelineDataGatherer *gatherer, AddToKeyFn addBlendToKey, AddToKeyFn addSrcToKey, AddToKeyFn addDstToKey)
static void add_gradient_to_key(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, const SkGradientBaseShader *shader, SkPoint point0, SkPoint point1, float radius0, float radius1, float bias, float scale)
static skgpu::graphite::ReadSwizzle swizzle_class_to_read_enum(const skgpu::Swizzle &swizzle)
void AddModeBlend(const KeyContext &keyContext, PaintParamsKeyBuilder *builder, PipelineDataGatherer *gatherer, SkBlendMode bm)
static void gather_runtime_effect_uniforms(const KeyContext &keyContext, const SkRuntimeEffect *effect, SkSpan< const Uniform > graphiteUniforms, const SkData *uniformData, PipelineDataGatherer *gatherer)
static SkPMColor4f map_color(const SkColor4f &c, SkColorSpace *src, SkColorSpace *dst)
static bool skdata_matches(const SkData *a, const SkData *b)
TextureProxyView AsView(const SkImage *image)
void NotifyImagesInUse(Recorder *recorder, DrawContext *drawContext, const SkBlender *blender)
skcms_TFType skcms_TransferFunction_getType(const skcms_TransferFunction *tf)
constexpr int32_t y() const
constexpr int32_t x() const
static constexpr SkIRect MakeXYWH(int32_t x, int32_t y, int32_t w, int32_t h)
constexpr int32_t width() const
constexpr int32_t height() const
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
static CachedImageInfo Make(const SkRect &bounds, const SkMatrix &totalM, SkColorType dstColorType, SkColorSpace *dstColorSpace, const int maxTextureSize, const SkSurfaceProps &propsIn)
SkRGBA4f< kPremul_SkAlphaType > premul() const
static SkRGBA4f FromColor(SkColor color)
static SkRect Make(const SkISize &size)
bool contains(SkScalar x, SkScalar y) const
const SkFilterMode filter
const SkMipmapMode mipmap
static constexpr SkSize Make(SkScalar w, SkScalar h)
const float * ptr() const
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 BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const CoordClampData &)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const DitherData &)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, sk_sp< TextureProxy > dst, SkIPoint dstOffset)
SkPMColor4f fColors[kNumInternalStorageStops]
sk_sp< TextureProxy > fColorsAndOffsetsProxy
GradientData(SkShaderBase::GradientType, int numStops)
SkShaderBase::GradientType fType
static constexpr int kNumInternalStorageStops
SkV4 fOffsets[kNumInternalStorageStops/4]
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const GradientData &)
sk_sp< TextureProxy > fTextureProxy
ImageData(const SkSamplingOptions &sampling, SkTileMode tileModeX, SkTileMode tileModeY, SkISize imgSize, SkRect subset, ReadSwizzle readSwizzle)
SkColorSpaceXformSteps fSteps
SkSamplingOptions fSampling
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const ImageData &)
static void BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const LMShaderData &)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const MatrixColorFilterData &)
sk_sp< TextureProxy > fPermutationsProxy
sk_sp< TextureProxy > fNoiseProxy
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const PerlinNoiseData &)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *)
sk_sp< const SkRuntimeEffect > fEffect
sk_sp< const SkData > fUniforms
ShaderData(sk_sp< const SkRuntimeEffect > effect)
bool operator==(const ShaderData &rhs) const
static void BeginBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const ShaderData &)
SkSpan< const Uniform > fUniforms
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const SkPMColor4f &)
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const TableColorFilterData &)
SkSamplingOptions fSampling
SkPoint3 fYUVtoRGBTranslate
SkPoint fLinearFilterUVInset
SkSamplingOptions fSamplingUV
ImageData(const SkSamplingOptions &sampling, SkTileMode tileModeX, SkTileMode tileModeY, SkISize imgSize, SkRect subset)
sk_sp< TextureProxy > fTextureProxies[4]
static void AddBlock(const KeyContext &, PaintParamsKeyBuilder *, PipelineDataGatherer *, const ImageData &)