65#define M(type) case StableKey::k##type : return "KnownRuntimeEffect_" #type;
67#define M2(type, initializer) case StableKey::k##type : return "KnownRuntimeEffect_" #type;
77std::string get_mangled_name(
const std::string& baseName,
int manglingSuffix) {
78 return baseName +
"_" + std::to_string(manglingSuffix);
81std::string get_mangled_uniform_name(
const ShaderInfo& shaderInfo,
86 if (uniform.isPaintColor()) {
90 result = uniform.
name() + std::string(
"_") + std::to_string(manglingSuffix);
92 if (shaderInfo.ssboIndex()) {
98std::string get_mangled_sampler_name(
const TextureAndSampler& tex,
int manglingSuffix) {
99 return tex.name() + std::string(
"_") + std::to_string(manglingSuffix);
103std::string emit_expression_for_entry(
const ShaderInfo& shaderInfo,
104 const ShaderNode* node,
105 ShaderSnippet::Args
args) {
106 return node->entry()->fExpressionGenerator(shaderInfo, node,
args);
112std::string emit_glue_code_for_entry(
const ShaderInfo& shaderInfo,
113 const ShaderNode* node,
114 const ShaderSnippet::Args&
args,
115 std::string* funcBody) {
116 std::string expr = emit_expression_for_entry(shaderInfo, node,
args);
117 std::string outputVar = get_mangled_name(
"outColor", node->keyIndex());
122 node->entry()->fName,
129void emit_preambles(
const ShaderInfo& shaderInfo,
131 std::string treeLabel,
132 std::string* preamble) {
133 for (
int i = 0; i < SkTo<int>(nodes.
size()); ++i) {
134 const ShaderNode* node = nodes[i];
135 std::string nodeLabel = std::to_string(i);
136 std::string nextLabel = treeLabel.empty() ? nodeLabel
137 : (treeLabel +
"<-" + nodeLabel);
139 if (node->numChildren() > 0) {
140 emit_preambles(shaderInfo, node->children(), nextLabel, preamble);
143 std::string nodePreamble = node->entry()->fPreambleGenerator(shaderInfo, node);
144 if (!nodePreamble.empty()) {
148 node->keyIndex(), nextLabel.c_str(), node->entry()->fName,
149 nodePreamble.c_str());
190 const char* ssboIndex)
191 : fRuntimeEffectDictionary(rteDict)
192 , fSsboIndex(ssboIndex)
197 fRootNodes =
key.getRootNodes(dict, &fShaderNodeAlloc);
216 fBlendInfo = gBlendTable[
static_cast<int>(
fBlendMode)];
218 fSnippetRequirementFlags |= root->requiredFlags();
225 const char* outColor,
226 const char* inColor) {
227 switch (outputType) {
242 mainBody,
"%s = (1.0 - %s.a) * outputCoverage;", outColor, inColor);
246 mainBody,
"%s = (half4(1.0) - %s) * outputCoverage;", outColor, inColor);
265std::string ShaderInfo::toSkSL(
const Caps* caps,
267 bool useStorageBuffers,
268 int* numTexturesAndSamplersUsed,
269 int* numPaintUniforms,
270 int* renderStepUniformTotalBytes,
271 int* paintUniformsTotalBytes,
276 const bool useStepStorageBuffer = useStorageBuffers && hasStepUniforms;
277 const bool useShadingStorageBuffer = useStorageBuffers &&
step->performsShading();
279 const bool defineLocalCoordsVarying = this->needsLocalCoords();
282 useShadingStorageBuffer,
283 defineLocalCoordsVarying);
290 if (hasStepUniforms) {
291 if (useStepStorageBuffer) {
297 renderStepUniformTotalBytes);
301 bool wrotePaintColor =
false;
302 if (useShadingStorageBuffer) {
313 paintUniformsTotalBytes,
320 if (
step->hasTextures()) {
321 preamble +=
step->texturesAndSamplersSkSL(bindingReqs, &binding);
325 if (numTexturesAndSamplersUsed) {
326 *numTexturesAndSamplersUsed = binding;
330 if (
step->emitsPrimitiveColor()) {
333 preamble +=
"half4 primitiveColor;";
339 emit_preambles(*
this, fRootNodes,
"", &preamble);
341 std::string mainBody =
"void main() {";
344 mainBody +=
"half4 initialColor = half4(0);";
346 if (useShadingStorageBuffer) {
353 if (
step->emitsPrimitiveColor()) {
354 mainBody +=
step->fragmentColorSkSL();
363 static constexpr char kUnusedDstColor[] =
"half4(1)";
364 static constexpr char kUnusedLocalCoords[] =
"float2(0)";
367 this->needsLocalCoords() ?
"localCoordsVar" : kUnusedLocalCoords};
371 clipShaderNode = node;
378 args.fPriorStageOutput = emit_glue_code_for_entry(*
this, node,
args, &mainBody);
384 args.fPriorStageOutput.c_str(),
388 const char* outColor =
args.fPriorStageOutput.c_str();
391 if (useStepStorageBuffer) {
393 "uint stepSsboIndex = %s.x;\n",
398 mainBody +=
"half4 outputCoverage = half4(1);";
399 mainBody +=
step->fragmentCoverageSkSL();
401 if (clipShaderNode) {
402 std::string clipShaderOutput =
403 emit_glue_code_for_entry(*
this, clipShaderNode,
args, &mainBody);
414 if (this->needsSurfaceColor()) {
429 "if (all(lessThanEqual(outputCoverage.rgb, half3(0)))) {"
437 "sk_FragColor = %s * outputCoverage + surfaceColor * (1.0 - outputCoverage);",
442 "half3 lerpRGB = mix(surfaceColor.aaa, %s.aaa, outputCoverage.rgb);"
443 "sk_FragColor.a = max(max(lerpRGB.r, lerpRGB.g), lerpRGB.b);",
448 fBlendInfo = {coverageBlendFormula.
equation(),
455 mainBody +=
"outputCoverage.a = max(max(outputCoverage.r, "
456 "outputCoverage.g), "
457 "outputCoverage.b);";
460 &mainBody, coverageBlendFormula.
primaryOutput(),
"sk_FragColor", outColor);
464 "sk_SecondaryFragColor",
474 return preamble +
"\n" + mainBody;
482 if (!keyView->isValid()) {
490 SkASSERT(fIDToPaintKey[(*existingEntry).asUInt()] == *keyView);
491 return *existingEntry;
498 fPaintKeyToID.set(
key, newID);
499 fIDToPaintKey.push_back(
key);
510 return fIDToPaintKey[codeID.
asUInt()];
514 return fBuiltInCodeSnippets[(
int)
id].fUniforms;
518 if (codeSnippetID < 0) {
523 return &fBuiltInCodeSnippets[codeSnippetID];
534 SkASSERT(fKnownRuntimeEffectCodeSnippets[knownRTECodeSnippetID].fPreambleGenerator);
535 return &fKnownRuntimeEffectCodeSnippets[knownRTECodeSnippetID];
542 if (userDefinedCodeSnippetID < SkTo<int>(fUserDefinedCodeSnippets.size())) {
543 return fUserDefinedCodeSnippets[userDefinedCodeSnippetID].get();
553std::string append_default_snippet_arguments(
const ShaderInfo& shaderInfo,
557 std::string code =
"(";
559 const char* separator =
"";
565 code +=
args.fPriorStageOutput;
572 code +=
args.fBlenderDstColor;
579 code +=
args.fFragCoord;
584 for (
size_t i = 0; i < entry->
fUniforms.size(); ++i) {
598 for (
const std::string& childOutputVar : childOutputs) {
601 code += childOutputVar;
608std::string emit_helper_function(
const ShaderInfo& shaderInfo,
609 const ShaderNode* node) {
612 const ShaderSnippet* entry = node->entry();
613 std::string helperFnName = get_mangled_name(entry->fStaticFunctionName, node->keyIndex());
615 "half4 %s(half4 inColor, half4 destColor, float2 pos) {",
616 helperFnName.c_str());
618 const ShaderSnippet::Args
args = {
"inColor",
"destColor",
"pos"};
619 for (
const ShaderNode* child : node->children()) {
622 childOutputVarNames.
push_back(emit_glue_code_for_entry(shaderInfo, child,
args, &helperFn));
626 std::string snippetArgList = append_default_snippet_arguments(shaderInfo, node,
627 args, childOutputVarNames);
631 entry->fStaticFunctionName, snippetArgList.c_str());
642std::string GenerateDefaultExpression(
const ShaderInfo& shaderInfo,
643 const ShaderNode* node,
644 const ShaderSnippet::Args&
args) {
645 if (node->numChildren() == 0) {
647 return node->entry()->fStaticFunctionName +
648 append_default_snippet_arguments(shaderInfo, node,
args, {});
651 std::string helperFnName =
652 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex());
654 "%s(%.*s, %.*s, %.*s)",
655 helperFnName.c_str(),
656 (
int)
args.fPriorStageOutput.size(),
args.fPriorStageOutput.data(),
657 (
int)
args.fBlenderDstColor.size(),
args.fBlenderDstColor.data(),
658 (
int)
args.fFragCoord.size(),
args.fFragCoord.data());
669std::string GenerateDefaultPreamble(
const ShaderInfo& shaderInfo,
670 const ShaderNode* node) {
671 if (node->numChildren() > 0) {
673 return emit_helper_function(shaderInfo, node);
681static constexpr Uniform kDstReadSampleUniforms[] = {
685static constexpr TextureAndSampler kDstReadSampleTexturesAndSamplers[] = {
689std::string GenerateDstReadSampleExpression(
const ShaderInfo& shaderInfo,
690 const ShaderNode* node,
691 const ShaderSnippet::Args&
args) {
692 const ShaderSnippet* entry = node->entry();
693 std::string sampler =
694 get_mangled_sampler_name(entry->fTexturesAndSamplers[0], node->keyIndex());
696 get_mangled_uniform_name(shaderInfo, entry->fUniforms[0], node->keyIndex());
697 std::string helperFnName = get_mangled_name(entry->fStaticFunctionName, node->keyIndex());
700 helperFnName.c_str(),
705std::string GenerateDstReadSamplePreamble(
const ShaderInfo& shaderInfo,
const ShaderNode* node) {
706 std::string helperFnName =
707 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex());
710 "half4 surfaceColor;"
711 "half4 %s(float4 coords, sampler2D dstSampler) {"
712 "surfaceColor = sample(dstSampler, (sk_FragCoord.xy - coords.xy) * coords.zw);"
713 "return surfaceColor;"
715 helperFnName.c_str());
719std::string GenerateDstReadFetchExpression(
const ShaderInfo& shaderInfo,
720 const ShaderNode* node,
721 const ShaderSnippet::Args&
args) {
722 std::string helperFnName =
723 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex());
728std::string GenerateDstReadFetchPreamble(
const ShaderInfo& shaderInfo,
const ShaderNode* node) {
729 std::string helperFnName =
730 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex());
733 "half4 surfaceColor;"
735 "surfaceColor = sk_LastFragColor;"
736 "return surfaceColor;"
738 helperFnName.c_str());
742static constexpr int kNumClipShaderChildren = 1;
744std::string GenerateClipShaderExpression(
const ShaderInfo& shaderInfo,
745 const ShaderNode* node,
746 const ShaderSnippet::Args&
args) {
747 SkASSERT(node->numChildren() == kNumClipShaderChildren);
748 static constexpr char kUnusedSrcColor[] =
"half4(1)";
749 static constexpr char kUnusedDstColor[] =
"half4(1)";
750 return emit_expression_for_entry(
751 shaderInfo, node->child(0), {kUnusedSrcColor, kUnusedDstColor,
"sk_FragCoord.xy"});
754std::string GenerateClipShaderPreamble(
const ShaderInfo& shaderInfo,
const ShaderNode* node) {
760static constexpr int kFourStopGradient = 4;
761static constexpr int kEightStopGradient = 8;
763static constexpr Uniform kLinearGradientUniforms4[] = {
772static constexpr Uniform kLinearGradientUniforms8[] = {
781static constexpr Uniform kLinearGradientUniformsTexture[] = {
790static constexpr TextureAndSampler kTextureGradientTexturesAndSamplers[] = {
791 {
"colorAndOffsetSampler"},
794static constexpr Uniform kRadialGradientUniforms4[] = {
803static constexpr Uniform kRadialGradientUniforms8[] = {
812static constexpr Uniform kRadialGradientUniformsTexture[] = {
821static constexpr Uniform kSweepGradientUniforms4[] = {
831static constexpr Uniform kSweepGradientUniforms8[] = {
841static constexpr Uniform kSweepGradientUniformsTexture[] = {
851static constexpr Uniform kConicalGradientUniforms4[] = {
862static constexpr Uniform kConicalGradientUniforms8[] = {
873static constexpr Uniform kConicalGradientUniformsTexture[] = {
884static constexpr char kLinearGradient4Name[] =
"sk_linear_grad_4_shader";
885static constexpr char kLinearGradient8Name[] =
"sk_linear_grad_8_shader";
886static constexpr char kLinearGradientTextureName[] =
"sk_linear_grad_tex_shader";
888static constexpr char kRadialGradient4Name[] =
"sk_radial_grad_4_shader";
889static constexpr char kRadialGradient8Name[] =
"sk_radial_grad_8_shader";
890static constexpr char kRadialGradientTextureName[] =
"sk_radial_grad_tex_shader";
892static constexpr char kSweepGradient4Name[] =
"sk_sweep_grad_4_shader";
893static constexpr char kSweepGradient8Name[] =
"sk_sweep_grad_8_shader";
894static constexpr char kSweepGradientTextureName[] =
"sk_sweep_grad_tex_shader";
896static constexpr char kConicalGradient4Name[] =
"sk_conical_grad_4_shader";
897static constexpr char kConicalGradient8Name[] =
"sk_conical_grad_8_shader";
898static constexpr char kConicalGradientTextureName[] =
"sk_conical_grad_tex_shader";
901static constexpr Uniform kSolidShaderUniforms[] = {
905static constexpr char kSolidShaderName[] =
"sk_solid_shader";
908static constexpr Uniform kPaintColorUniforms[] = { Uniform::PaintColor() };
910static constexpr char kRGBPaintColorName[] =
"sk_rgb_opaque";
911static constexpr char kAlphaOnlyPaintColorName[] =
"sk_alpha_only";
914static constexpr Uniform kLocalMatrixShaderUniforms[] = {
918static constexpr int kNumLocalMatrixShaderChildren = 1;
920static constexpr char kLocalMatrixShaderName[] =
"LocalMatrix";
926std::string GenerateLocalMatrixPreamble(
const ShaderInfo& shaderInfo,
927 const ShaderNode* node) {
929 SkASSERT(node->numChildren() == kNumLocalMatrixShaderChildren);
932 static constexpr char kUnusedDestColor[] =
"half4(1)";
933 std::string childExpr = emit_expression_for_entry(shaderInfo, node->child(0),
934 {
"inColor", kUnusedDestColor,
"coords"});
935 std::string localMatrixUni =
936 get_mangled_uniform_name(shaderInfo, node->entry()->fUniforms[0], node->keyIndex());
938 std::string helperFnName =
939 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex());
941 "coords = (%s * coords.xy01).xy;"
944 helperFnName.c_str(),
945 localMatrixUni.c_str(),
950static constexpr Uniform kImageShaderUniforms[] = {
964static constexpr Uniform kCubicImageShaderUniforms[] = {
978static constexpr Uniform kHWImageShaderUniforms[] = {
988static constexpr TextureAndSampler kISTexturesAndSamplers[] = {
992static_assert(0 ==
static_cast<int>(
SkTileMode::kClamp),
"ImageShader code depends on SkTileMode");
993static_assert(1 ==
static_cast<int>(
SkTileMode::kRepeat),
"ImageShader code depends on SkTileMode");
994static_assert(2 ==
static_cast<int>(
SkTileMode::kMirror),
"ImageShader code depends on SkTileMode");
995static_assert(3 ==
static_cast<int>(
SkTileMode::kDecal),
"ImageShader code depends on SkTileMode");
998 "ImageShader code depends on SkFilterMode");
1000 "ImageShader code depends on SkFilterMode");
1003 "ImageShader code depends on ReadSwizzle");
1005 "ImageShader code depends on ReadSwizzle");
1007 "ImageShader code depends on ReadSwizzle");
1009 "ImageShader code depends on ReadSwizzle");
1011 "ImageShader code depends on ReadSwizzle");
1013static constexpr char kImageShaderName[] =
"sk_image_shader";
1014static constexpr char kCubicImageShaderName[] =
"sk_cubic_image_shader";
1015static constexpr char kHWImageShaderName[] =
"sk_hw_image_shader";
1019static constexpr Uniform kYUVImageShaderUniforms[] = {
1036static constexpr Uniform kCubicYUVImageShaderUniforms[] = {
1051static constexpr TextureAndSampler kYUVISTexturesAndSamplers[] = {
1058static constexpr char kYUVImageShaderName[] =
"sk_yuv_image_shader";
1059static constexpr char kCubicYUVImageShaderName[] =
"sk_cubic_yuv_image_shader";
1062static constexpr Uniform kCoordClampShaderUniforms[] = {
1066static constexpr char kCoordClampShaderName[] =
"CoordClamp";
1068static constexpr int kNumCoordClampShaderChildren = 1;
1075std::string GenerateCoordClampPreamble(
const ShaderInfo& shaderInfo,
1076 const ShaderNode* node) {
1078 SkASSERT(node->numChildren() == kNumCoordClampShaderChildren);
1081 static constexpr char kUnusedDestColor[] =
"half4(1)";
1082 std::string childExpr = emit_expression_for_entry(shaderInfo, node->child(0),
1083 {
"inColor", kUnusedDestColor,
"coords"});
1085 std::string subsetUni =
1086 get_mangled_uniform_name(shaderInfo, node->entry()->fUniforms[0], node->keyIndex());
1088 std::string helperFnName =
1089 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex());
1091 "coords = clamp(coords, %s.LT, %s.RB);"
1094 helperFnName.c_str(),
1102static constexpr Uniform kDitherShaderUniforms[] = {
1106static constexpr TextureAndSampler kDitherTexturesAndSamplers[] = {
1110static constexpr char kDitherShaderName[] =
"sk_dither_shader";
1113static constexpr Uniform kPerlinNoiseShaderUniforms[] = {
1121static constexpr TextureAndSampler kPerlinNoiseShaderTexturesAndSamplers[] = {
1122 {
"permutationsSampler" },
1126static constexpr char kPerlinNoiseShaderName[] =
"perlin_noise_shader";
1129static constexpr Uniform CoeffBlendderUniforms[] = {
1133static constexpr char kCoeffBlenderName[] =
"sk_coeff_blend";
1136static constexpr Uniform kBlendModeBlenderUniforms[] = {
1140static constexpr char kBlendModeBlenderName[] =
"sk_blend";
1143static constexpr int kNumBlendShaderChildren = 3;
1145std::string GenerateBlendShaderPreamble(
const ShaderInfo& shaderInfo,
1146 const ShaderNode* node) {
1148 SkASSERT(node->numChildren() == 3);
1153 "half4 %s(half4 inColor, half4 destColor, float2 pos) {",
1154 get_mangled_name(node->entry()->fStaticFunctionName, node->keyIndex()).c_str());
1157 const ShaderSnippet::Args
args = {
"inColor",
"destColor",
"pos"};
1158 std::string srcVar = emit_glue_code_for_entry(shaderInfo, node->child(0),
args, &helperFn);
1159 std::string dstVar = emit_glue_code_for_entry(shaderInfo, node->child(1),
args, &helperFn);
1162 static constexpr char kUnusedLocalCoords[] =
"float2(0)";
1164 std::string blendResultVar = emit_glue_code_for_entry(
1165 shaderInfo, node->child(2), {srcVar, dstVar, kUnusedLocalCoords}, &helperFn);
1170 blendResultVar.c_str());
1177 GraphitePipelineCallbacks(
const ShaderInfo& shaderInfo,
1178 const ShaderNode* node,
1179 std::string* preamble,
1181 : fShaderInfo(shaderInfo)
1183 , fPreamble(preamble)
1184 , fEffect(effect) {}
1187 std::string
result = get_mangled_name(std::string(decl->
var()->
name()), fNode->keyIndex());
1188 if (fShaderInfo.ssboIndex()) {
1194 void defineFunction(
const char* decl,
const char* body,
bool isMain)
override {
1198 "half4 %s(half4 inColor, half4 destColor, float2 coords) {"
1201 get_mangled_name(fNode->entry()->fName, fNode->keyIndex()).c_str(),
1208 void declareFunction(
const char* decl)
override {
1209 *fPreamble += std::string(decl);
1212 void defineStruct(
const char* definition)
override {
1213 *fPreamble += std::string(definition);
1216 void declareGlobal(
const char* declaration)
override {
1217 *fPreamble += std::string(declaration);
1220 std::string sampleShader(
int index, std::string coords)
override {
1221 return emit_expression_for_entry(fShaderInfo, fNode->child(index),
1222 {
"inColor",
"destColor", coords});
1225 std::string sampleColorFilter(
int index, std::string
color)
override {
1226 return emit_expression_for_entry(fShaderInfo, fNode->child(index),
1227 {color,
"destColor",
"coords"});
1230 std::string sampleBlender(
int index, std::string src, std::string dst)
override {
1231 return emit_expression_for_entry(fShaderInfo, fNode->child(index),
1232 {src, dst,
"coords"});
1235 std::string toLinearSrgb(std::string
color)
override {
1241 std::string helper = get_mangled_name(
"toLinearSRGB", fNode->keyIndex());
1249 std::string fromLinearSrgb(std::string
color)
override {
1255 std::string helper = get_mangled_name(
"fromLinearSRGB", fNode->keyIndex());
1262 std::string getMangledName(
const char*
name)
override {
1263 return get_mangled_name(
name, fNode->keyIndex());
1267 const ShaderInfo& fShaderInfo;
1268 const ShaderNode* fNode;
1269 std::string* fPreamble;
1273std::string GenerateRuntimeShaderPreamble(
const ShaderInfo& shaderInfo,
1274 const ShaderNode* node) {
1282 effect = shaderInfo.runtimeEffectDictionary()->find(node->codeSnippetId());
1288 std::string preamble;
1292 "half4 %s(half4 inColor) {"
1293 "return sk_color_space_transform(inColor, %s, %s, %s, %s, %s);"
1295 get_mangled_name(
"toLinearSRGB", node->keyIndex()).c_str(),
1297 node->keyIndex()).c_str(),
1299 node->keyIndex()).c_str(),
1301 node->keyIndex()).c_str(),
1303 node->keyIndex()).c_str(),
1305 node->keyIndex()).c_str());
1308 "half4 %s(half4 inColor) {"
1309 "return sk_color_space_transform(inColor, %s, %s, %s, %s, %s);"
1311 get_mangled_name(
"fromLinearSRGB", node->keyIndex()).c_str(),
1313 node->keyIndex()).c_str(),
1315 node->keyIndex()).c_str(),
1317 node->keyIndex()).c_str(),
1319 node->keyIndex()).c_str(),
1321 node->keyIndex()).c_str());
1324 GraphitePipelineCallbacks callbacks{shaderInfo, node, &preamble, effect};
1329std::string GenerateRuntimeShaderExpression(
const ShaderInfo& shaderInfo,
1330 const ShaderNode* node,
1331 const ShaderSnippet::Args&
args) {
1333 "%s(%.*s, %.*s, %.*s)",
1334 get_mangled_name(node->entry()->fName, node->keyIndex()).c_str(),
1335 (
int)
args.fPriorStageOutput.size(),
args.fPriorStageOutput.data(),
1336 (
int)
args.fBlenderDstColor.size(),
args.fBlenderDstColor.data(),
1337 (
int)
args.fFragCoord.size(),
args.fFragCoord.data());
1343static constexpr Uniform kMatrixColorFilterUniforms[] = {
1349static constexpr char kMatrixColorFilterName[] =
"sk_matrix_colorfilter";
1352static constexpr char kComposeName[] =
"Compose";
1354static constexpr int kNumComposeChildren = 2;
1357std::string GenerateNestedChildrenPreamble(
const ShaderInfo& shaderInfo,
1358 const ShaderNode* node) {
1359 SkASSERT(node->numChildren() == 2);
1362 static constexpr char kUnusedDestColor[] =
"half4(1)";
1363 std::string innerColor = emit_expression_for_entry(shaderInfo, node->child(0),
1364 {
"inColor", kUnusedDestColor,
"coords"});
1367 std::string outerColor = emit_expression_for_entry(shaderInfo, node->child(1),
1368 {innerColor, kUnusedDestColor,
"coords"});
1372 std::string helperFnName = get_mangled_name(node->entry()->fName, node->keyIndex());
1376 helperFnName.c_str(),
1377 outerColor.c_str());
1381static constexpr TextureAndSampler kTableColorFilterTexturesAndSamplers[] = {
1385static constexpr char kTableColorFilterName[] =
"sk_table_colorfilter";
1388static constexpr char kGaussianColorFilterName[] =
"sk_gaussian_colorfilter";
1391static constexpr Uniform kColorSpaceTransformUniforms[] = {
1400 "ColorSpaceTransform code depends on skcms_TFType");
1402 "ColorSpaceTransform code depends on skcms_TFType");
1404 "ColorSpaceTransform code depends on skcms_TFType");
1406 "ColorSpaceTransform code depends on skcms_TFType");
1408 "ColorSpaceTransform code depends on skcms_TFType");
1422static constexpr char kColorSpaceTransformName[] =
"sk_color_space_transform";
1425static constexpr char kErrorName[] =
"sk_error";
1428static constexpr char kPassthroughShaderName[] =
"sk_passthrough";
1432std::string GeneratePrimitiveColorExpression(
const ShaderInfo&,
1433 const ShaderNode* node,
1434 const ShaderSnippet::Args&) {
1435 return "primitiveColor";
1442#if defined(SK_DEBUG)
1443bool ShaderCodeDictionary::isValidID(
int snippetID)
const {
1444 if (snippetID < 0) {
1459 return userDefinedCodeSnippetID < SkTo<int>(fUserDefinedCodeSnippets.size());
1466#if defined(GRAPHITE_TEST_UTILS)
1468int ShaderCodeDictionary::addRuntimeEffectSnippet(
const char* functionName) {
1471 fUserDefinedCodeSnippets.push_back(
1472 std::make_unique<ShaderSnippet>(
"UserDefined",
1477 GenerateDefaultExpression,
1478 GenerateDefaultPreamble,
1522const char* ShaderCodeDictionary::addTextToArena(std::string_view
text) {
1524 memcpy(textInArena,
text.data(),
text.size());
1525 textInArena[
text.size()] =
'\0';
1533 int numBaseUniforms = uniforms.
size();
1534 int xtraUniforms = 0;
1540 int numUniforms = numBaseUniforms + xtraUniforms;
1542 if (index >= numBaseUniforms) {
1546 const rteUniform* u;
1547 u = &uniforms[index];
1552 const char*
name = this->addTextToArena(u->name);
1556 return (u->flags & rteUniform::kArray_Flag) ?
Uniform(
name,
type, u->count)
1580 if (!fKnownRuntimeEffectCodeSnippets[index].fExpressionGenerator) {
1581 const char*
name = get_known_rte_name(
static_cast<StableKey>(stableKey));
1584 this->convertUniforms(effect),
1588 GenerateRuntimeShaderExpression,
1589 GenerateRuntimeShaderPreamble,
1599 RuntimeEffectKey
key;
1603 int32_t* existingCodeSnippetID = fRuntimeEffectMap.find(
key);
1604 if (existingCodeSnippetID) {
1605 return *existingCodeSnippetID;
1611 fUserDefinedCodeSnippets.push_back(
1612 std::make_unique<ShaderSnippet>(
"RuntimeEffect",
1613 this->convertUniforms(effect),
1617 GenerateRuntimeShaderExpression,
1618 GenerateRuntimeShaderPreamble,
1623 fRuntimeEffectMap.set(
key, newCodeSnippetID);
1624 return newCodeSnippetID;
1637 GenerateDefaultExpression,
1638 GenerateDefaultPreamble,
1642 "PassthroughShader",
1646 kPassthroughShaderName,
1647 GenerateDefaultExpression,
1648 GenerateDefaultPreamble,
1653 SkSpan(kSolidShaderUniforms),
1657 GenerateDefaultExpression,
1658 GenerateDefaultPreamble,
1663 SkSpan(kPaintColorUniforms),
1667 GenerateDefaultExpression,
1668 GenerateDefaultPreamble,
1672 "AlphaOnlyPaintColor",
1673 SkSpan(kPaintColorUniforms),
1676 kAlphaOnlyPaintColorName,
1677 GenerateDefaultExpression,
1678 GenerateDefaultPreamble,
1683 SkSpan(kLinearGradientUniforms4),
1686 kLinearGradient4Name,
1687 GenerateDefaultExpression,
1688 GenerateDefaultPreamble,
1693 SkSpan(kLinearGradientUniforms8),
1696 kLinearGradient8Name,
1697 GenerateDefaultExpression,
1698 GenerateDefaultPreamble,
1702 "LinearGradientTexture",
1703 SkSpan(kLinearGradientUniformsTexture),
1705 SkSpan(kTextureGradientTexturesAndSamplers),
1706 kLinearGradientTextureName,
1707 GenerateDefaultExpression,
1708 GenerateDefaultPreamble,
1713 SkSpan(kRadialGradientUniforms4),
1716 kRadialGradient4Name,
1717 GenerateDefaultExpression,
1718 GenerateDefaultPreamble,
1723 SkSpan(kRadialGradientUniforms8),
1726 kRadialGradient8Name,
1727 GenerateDefaultExpression,
1728 GenerateDefaultPreamble,
1732 "RadialGradientTexture",
1733 SkSpan(kRadialGradientUniformsTexture),
1735 SkSpan(kTextureGradientTexturesAndSamplers),
1736 kRadialGradientTextureName,
1737 GenerateDefaultExpression,
1738 GenerateDefaultPreamble,
1743 SkSpan(kSweepGradientUniforms4),
1746 kSweepGradient4Name,
1747 GenerateDefaultExpression,
1748 GenerateDefaultPreamble,
1753 SkSpan(kSweepGradientUniforms8),
1756 kSweepGradient8Name,
1757 GenerateDefaultExpression,
1758 GenerateDefaultPreamble,
1762 "SweepGradientTexture",
1763 SkSpan(kSweepGradientUniformsTexture),
1765 SkSpan(kTextureGradientTexturesAndSamplers),
1766 kSweepGradientTextureName,
1767 GenerateDefaultExpression,
1768 GenerateDefaultPreamble,
1773 SkSpan(kConicalGradientUniforms4),
1776 kConicalGradient4Name,
1777 GenerateDefaultExpression,
1778 GenerateDefaultPreamble,
1783 SkSpan(kConicalGradientUniforms8),
1786 kConicalGradient8Name,
1787 GenerateDefaultExpression,
1788 GenerateDefaultPreamble,
1792 "ConicalGradientTexture",
1793 SkSpan(kConicalGradientUniformsTexture),
1795 SkSpan(kTextureGradientTexturesAndSamplers),
1796 kConicalGradientTextureName,
1797 GenerateDefaultExpression,
1798 GenerateDefaultPreamble,
1802 "LocalMatrixShader",
1803 SkSpan(kLocalMatrixShaderUniforms),
1807 kLocalMatrixShaderName,
1808 GenerateDefaultExpression,
1809 GenerateLocalMatrixPreamble,
1810 kNumLocalMatrixShaderChildren
1814 SkSpan(kImageShaderUniforms),
1816 SkSpan(kISTexturesAndSamplers),
1818 GenerateDefaultExpression,
1819 GenerateDefaultPreamble,
1824 SkSpan(kCubicImageShaderUniforms),
1826 SkSpan(kISTexturesAndSamplers),
1827 kCubicImageShaderName,
1828 GenerateDefaultExpression,
1829 GenerateDefaultPreamble,
1833 "HardwareImageShader",
1834 SkSpan(kHWImageShaderUniforms),
1836 SkSpan(kISTexturesAndSamplers),
1838 GenerateDefaultExpression,
1839 GenerateDefaultPreamble,
1844 SkSpan(kYUVImageShaderUniforms),
1846 SkSpan(kYUVISTexturesAndSamplers),
1847 kYUVImageShaderName,
1848 GenerateDefaultExpression,
1849 GenerateDefaultPreamble,
1853 "CubicYUVImageShader",
1854 SkSpan(kCubicYUVImageShaderUniforms),
1856 SkSpan(kYUVISTexturesAndSamplers),
1857 kCubicYUVImageShaderName,
1858 GenerateDefaultExpression,
1859 GenerateDefaultPreamble,
1864 SkSpan(kCoordClampShaderUniforms),
1867 kCoordClampShaderName,
1868 GenerateDefaultExpression,
1869 GenerateCoordClampPreamble,
1870 kNumCoordClampShaderChildren
1874 SkSpan(kDitherShaderUniforms),
1876 SkSpan(kDitherTexturesAndSamplers),
1878 GenerateDefaultExpression,
1879 GenerateDefaultPreamble,
1883 "PerlinNoiseShader",
1884 SkSpan(kPerlinNoiseShaderUniforms),
1886 SkSpan(kPerlinNoiseShaderTexturesAndSamplers),
1887 kPerlinNoiseShaderName,
1888 GenerateDefaultExpression,
1889 GenerateDefaultPreamble,
1894 "MatrixColorFilter",
1895 SkSpan(kMatrixColorFilterUniforms),
1898 kMatrixColorFilterName,
1899 GenerateDefaultExpression,
1900 GenerateDefaultPreamble,
1907 SkSpan(kTableColorFilterTexturesAndSamplers),
1908 kTableColorFilterName,
1909 GenerateDefaultExpression,
1910 GenerateDefaultPreamble,
1914 "GaussianColorFilter",
1918 kGaussianColorFilterName,
1919 GenerateDefaultExpression,
1920 GenerateDefaultPreamble,
1924 "ColorSpaceTransform",
1925 SkSpan(kColorSpaceTransformUniforms),
1928 kColorSpaceTransformName,
1929 GenerateDefaultExpression,
1930 GenerateDefaultPreamble,
1940 GenerateDefaultExpression,
1941 GenerateBlendShaderPreamble,
1942 kNumBlendShaderChildren
1946 SkSpan(CoeffBlendderUniforms),
1950 GenerateDefaultExpression,
1951 GenerateDefaultPreamble,
1956 SkSpan(kBlendModeBlenderUniforms),
1959 kBlendModeBlenderName,
1960 GenerateDefaultExpression,
1961 GenerateDefaultPreamble,
1971 GeneratePrimitiveColorExpression,
1972 GenerateDefaultPreamble,
1978 SkSpan(kDstReadSampleUniforms),
1980 SkSpan(kDstReadSampleTexturesAndSamplers),
1982 GenerateDstReadSampleExpression,
1983 GenerateDstReadSamplePreamble,
1992 GenerateDstReadFetchExpression,
1993 GenerateDstReadFetchPreamble,
2003 GenerateClipShaderExpression,
2004 GenerateClipShaderPreamble,
2005 kNumClipShaderChildren
2014 GenerateDefaultExpression,
2015 GenerateNestedChildrenPreamble,
2023 fBuiltInCodeSnippets[ffBlendModeID] = {
2030 GenerateDefaultExpression,
2031 GenerateDefaultPreamble,
static int step(int x, SkScalar min, SkScalar max)
#define SkDEBUGFAIL(message)
SK_API const char * SkBlendMode_Name(SkBlendMode blendMode)
@ kLastCoeffMode
last porter duff blend mode
@ kSrcOver
r = s + (1-sa)*d
@ kXor
r = s*(1-da) + d*(1-sa)
@ kSrcATop
r = s*da + d*(1-sa)
@ kDstATop
r = d*sa + s*(1-da)
@ kDstOver
r = d + (1-da)*s
constexpr SkPMColor4f SK_PMColor4fTRANSPARENT
#define M2(type, initializer)
#define SK_ALL_STABLEKEYS(M, M1, M2)
Type::kYUV Type::kRGBA() int(0.7 *637)
T * makeArrayDefault(size_t count)
T * makeInitializedArray(size_t count, Initializer initializer)
static uint32_t StableKey(const SkRuntimeEffect &effect)
static uint32_t Hash(const SkRuntimeEffect &effect)
static const SkSL::Program & Program(const SkRuntimeEffect &effect)
static bool UsesColorTransform(const SkRuntimeEffect *effect)
size_t uniformSize() const
SkSpan< const Child > children() const
bool allowBlender() const
SkSpan< const Uniform > uniforms() const
std::string_view name() const
constexpr size_t size() const
const char * c_str() const
SkString asString() const
static constexpr Swizzle RGBA()
const ResourceBindingRequirements & resourceBindingRequirements() const
DstReadRequirement getDstReadRequirement() const
PaintParamsKey clone(SkArenaAlloc *) const
static constexpr PaintParamsKey Invalid()
static const char * ssboIndicesVarying()
PaintParamsKey lookup(UniquePaintParamsID) const SK_EXCLUDES(fSpinLock)
UniquePaintParamsID findOrCreate(PaintParamsKeyBuilder *) SK_EXCLUDES(fSpinLock)
int findOrCreateRuntimeEffectSnippet(const SkRuntimeEffect *effect)
SkSpan< const Uniform > getUniforms(BuiltInCodeSnippetID) const
const ShaderSnippet * getEntry(int codeSnippetID) const SK_EXCLUDES(fSpinLock)
const ShaderSnippet * entry() const
static UniquePaintParamsID InvalidID()
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const SkRuntimeEffect * GetKnownRuntimeEffect(StableKey stableKey)
static constexpr int kUnknownRuntimeEffectIDStart
static constexpr int kSkiaKnownRuntimeEffectsEnd
static constexpr int kSkiaBuiltInReservedCnt
static constexpr int kSkiaKnownRuntimeEffectsStart
static const int kStableKeyCnt
void ConvertProgram(const Program &program, const char *sampleCoords, const char *inputColor, const char *destColor, Callbacks *callbacks)
std::string printf(const char *fmt,...) SK_PRINTF_LIKE(1
std::string void appendf(std::string *str, const char *fmt,...) SK_PRINTF_LIKE(2
static constexpr int kFixedFunctionBlendModeIDOffset
std::string EmitPaintParamsUniforms(int bufferID, const Layout layout, SkSpan< const ShaderNode * > nodes, int *numUniforms, int *uniformsTotalBytes, bool *wrotePaintColor)
std::string EmitStorageBufferAccess(const char *bufferNamePrefix, const char *ssboIndex, const char *uniformName)
@ kFixedFunctionSrcATopBlendMode
@ kConicalGradientShader8
@ kFixedFunctionDstATopBlendMode
@ kSweepGradientShaderTexture
@ kFixedFunctionSrcBlendMode
@ kFixedFunctionSrcOverBlendMode
@ kConicalGradientShader4
@ kLinearGradientShaderTexture
@ kFixedFunctionDstOverBlendMode
@ kFixedFunctionScreenBlendMode
@ kFixedFunctionDstBlendMode
@ kFixedFunctionDstOutBlendMode
@ kFixedFunctionSrcOutBlendMode
@ kFixedFunctionClearBlendMode
@ kFixedFunctionDstInBlendMode
@ kFixedFunctionSrcInBlendMode
@ kColorSpaceXformColorFilter
@ kConicalGradientShaderTexture
@ kFixedFunctionPlusBlendMode
@ kFixedFunctionXorBlendMode
@ kRadialGradientShaderTexture
@ kFixedFunctionModulateBlendMode
static constexpr int kNoChildren
std::string EmitTexturesAndSamplers(const ResourceBindingRequirements &bindingReqs, SkSpan< const ShaderNode * > nodes, int *binding)
static constexpr Uniform kRuntimeEffectColorSpaceTransformUniforms[]
std::string EmitRenderStepStorageBuffer(int bufferID, SkSpan< const Uniform > uniforms)
std::string EmitRenderStepUniforms(int bufferID, const Layout layout, SkSpan< const Uniform > uniforms, int *renderStepUniformsTotalBytes)
std::string EmitVaryings(const RenderStep *step, const char *direction, bool emitSsboIndicesVarying, bool emitLocalCoordsVarying)
std::string EmitPaintParamsStorageBuffer(int bufferID, SkSpan< const ShaderNode * > nodes, int *numUniforms, bool *wrotePaintColor)
static constexpr char kRuntimeShaderName[]
static SkSLType uniform_type_to_sksl_type(const SkRuntimeEffect::Uniform &u)
void append_color_output(std::string *mainBody, BlendFormula::OutputType outputType, const char *outColor, const char *inColor)
std::string EmitUniformsFromStorageBuffer(const char *bufferNamePrefix, const char *ssboIndex, SkSpan< const Uniform > uniforms)
static constexpr int kBuiltInCodeSnippetIDCount
const char * BlendFuncName(SkBlendMode mode)
BlendFormula GetBlendFormula(bool isOpaque, bool hasCoverage, SkBlendMode xfermode)
BlendFormula GetLCDBlendFormula(SkBlendMode xfermode)
static constexpr bool BlendModifiesDst(BlendEquation equation, BlendCoeff srcCoeff, BlendCoeff dstCoeff)
Layout fUniformBufferLayout
SkSpan< const Uniform > fUniforms
bool needsPriorStageOutput() const
bool needsBlenderDstColor() const
bool needsLocalCoords() const
SkSpan< const TextureAndSampler > fTexturesAndSamplers