88 :
INHERITED(context, caps, program, out) {}
95 void write(std::string_view
s);
97 void writeLine(std::string_view
s = std::string_view());
239#if defined(SK_DEBUG) || defined(SKSL_STANDALONE)
280 this->
write(std::string_view(&c, 1));
284 this->
write(identifier);
291 switch (
type.typeKind()) {
293 const Type& component =
type.componentType();
309 SK_ABORT(
"unsupported vector type");
316 const Type& component =
type.componentType();
322 SK_ABORT(
"unsupported matrix type");
325 if (
type.columns() !=
type.rows()) {
333 if (
type.isUnsizedArray()) {
349 return std::string(
type.name());
352 return std::string(
type.name());
358 this->
write(
"struct ");
362 for (
const auto& f :
type.fields()) {
365 const Type& baseType = f.fType->isArray() ? f.fType->componentType() : *f.fType;
369 if (f.fType->isArray()) {
370 this->
write(
"[" + std::to_string(f.fType->columns()) +
"]");
383 switch (expr.
kind()) {
384 case Expression::Kind::kBinary:
387 case Expression::Kind::kConstructorDiagonalMatrix:
391 case Expression::Kind::kConstructorArrayCast:
394 case Expression::Kind::kConstructorCompound:
397 case Expression::Kind::kConstructorArray:
398 case Expression::Kind::kConstructorMatrixResize:
399 case Expression::Kind::kConstructorSplat:
400 case Expression::Kind::kConstructorStruct:
403 case Expression::Kind::kConstructorScalarCast:
404 case Expression::Kind::kConstructorCompoundCast:
407 case Expression::Kind::kEmpty:
408 this->
write(
"false");
410 case Expression::Kind::kFieldAccess:
413 case Expression::Kind::kFunctionCall:
416 case Expression::Kind::kLiteral:
419 case Expression::Kind::kPrefix:
422 case Expression::Kind::kPostfix:
425 case Expression::Kind::kSetting:
428 case Expression::Kind::kSwizzle:
431 case Expression::Kind::kVariableReference:
434 case Expression::Kind::kTernary:
437 case Expression::Kind::kIndex:
455 std::string tmpVar1 =
"minAbsHackVar" + std::to_string(
fVarCount++);
456 std::string tmpVar2 =
"minAbsHackVar" + std::to_string(
fVarCount++);
461 this->
write(
"((" + tmpVar1 +
" = ");
463 this->
write(
") < (" + tmpVar2 +
" = ");
465 this->
write(
") ? " + tmpVar1 +
" : " + tmpVar2 +
")");
469 this->
write(
"(1.0 / sqrt(");
475float _determinant2(mat2 m) {
476return m[0].x*m[1].y - m[0].y*m[1].x;
481float _determinant3(mat3 m) {
483 a00 = m[0].x, a01 = m[0].y, a02 = m[0].z,
484 a10 = m[1].x, a11 = m[1].y, a12 = m[1].z,
485 a20 = m[2].x, a21 = m[2].y, a22 = m[2].z,
486 b01 = a22*a11 - a12*a21,
487 b11 =-a22*a10 + a12*a20,
488 b21 = a21*a10 - a11*a20;
489return a00*b01 + a01*b11 + a02*b21;
494mat4 _determinant4(mat4 m) {
496 a00 = m[0].x, a01 = m[0].y, a02 = m[0].z, a03 = m[0].w,
497 a10 = m[1].x, a11 = m[1].y, a12 = m[1].z, a13 = m[1].w,
498 a20 = m[2].x, a21 = m[2].y, a22 = m[2].z, a23 = m[2].w,
499 a30 = m[3].x, a31 = m[3].y, a32 = m[3].z, a33 = m[3].w,
500 b00 = a00*a11 - a01*a10,
501 b01 = a00*a12 - a02*a10,
502 b02 = a00*a13 - a03*a10,
503 b03 = a01*a12 - a02*a11,
504 b04 = a01*a13 - a03*a11,
505 b05 = a02*a13 - a03*a12,
506 b06 = a20*a31 - a21*a30,
507 b07 = a20*a32 - a22*a30,
508 b08 = a20*a33 - a23*a30,
509 b09 = a21*a32 - a22*a31,
510 b10 = a21*a33 - a23*a31,
511 b11 = a22*a33 - a23*a32;
512return b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06;
520 this->
write(
"_determinant2(");
527 this->
write(
"_determinant3(");
534 this->
write(
"_determinant4(");
540 SkDEBUGFAILF(
"no polyfill for determinant(%s)",
type.description().c_str());
541 this->
write(
"determinant(");
548mat2 _inverse2(mat2 m) {
549return mat2(m[1].y, -m[0].y, -m[1].x, m[0].x) / (m[0].x * m[1].y - m[0].y * m[1].x);
554mat3 _inverse3(mat3 m) {
556 a00 = m[0].x, a01 = m[0].y, a02 = m[0].z,
557 a10 = m[1].x, a11 = m[1].y, a12 = m[1].z,
558 a20 = m[2].x, a21 = m[2].y, a22 = m[2].z,
559 b01 = a22*a11 - a12*a21,
560 b11 =-a22*a10 + a12*a20,
561 b21 = a21*a10 - a11*a20,
562 det = a00*b01 + a01*b11 + a02*b21;
564 b01, (-a22*a01 + a02*a21), ( a12*a01 - a02*a11),
565 b11, ( a22*a00 - a02*a20), (-a12*a00 + a02*a10),
566 b21, (-a21*a00 + a01*a20), ( a11*a00 - a01*a10)) / det;
571mat4 _inverse4(mat4 m) {
573 a00 = m[0].x, a01 = m[0].y, a02 = m[0].z, a03 = m[0].w,
574 a10 = m[1].x, a11 = m[1].y, a12 = m[1].z, a13 = m[1].w,
575 a20 = m[2].x, a21 = m[2].y, a22 = m[2].z, a23 = m[2].w,
576 a30 = m[3].x, a31 = m[3].y, a32 = m[3].z, a33 = m[3].w,
577 b00 = a00*a11 - a01*a10,
578 b01 = a00*a12 - a02*a10,
579 b02 = a00*a13 - a03*a10,
580 b03 = a01*a12 - a02*a11,
581 b04 = a01*a13 - a03*a11,
582 b05 = a02*a13 - a03*a12,
583 b06 = a20*a31 - a21*a30,
584 b07 = a20*a32 - a22*a30,
585 b08 = a20*a33 - a23*a30,
586 b09 = a21*a32 - a22*a31,
587 b10 = a21*a33 - a23*a31,
588 b11 = a22*a33 - a23*a32,
589 det = b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06;
591 a11*b11 - a12*b10 + a13*b09,
592 a02*b10 - a01*b11 - a03*b09,
593 a31*b05 - a32*b04 + a33*b03,
594 a22*b04 - a21*b05 - a23*b03,
595 a12*b08 - a10*b11 - a13*b07,
596 a00*b11 - a02*b08 + a03*b07,
597 a32*b02 - a30*b05 - a33*b01,
598 a20*b05 - a22*b02 + a23*b01,
599 a10*b10 - a11*b08 + a13*b06,
600 a01*b08 - a00*b10 - a03*b06,
601 a30*b04 - a31*b02 + a33*b00,
602 a21*b02 - a20*b04 - a23*b00,
603 a11*b07 - a10*b09 - a12*b06,
604 a00*b09 - a01*b07 + a02*b06,
605 a31*b01 - a30*b03 - a32*b00,
606 a20*b03 - a21*b01 + a22*b00) / det;
613 this->
write(
"_inverse2(");
620 this->
write(
"_inverse3(");
627 this->
write(
"_inverse4(");
634 this->
write(
"inverse(");
644 std::string
name =
"transpose" + std::to_string(c) + std::to_string(r);
649 if (!*writtenThisTranspose) {
650 *writtenThisTranspose =
true;
655 transposed +
"(").c_str());
657 for (
int row = 0; row < r; ++row) {
658 for (
int column = 0; column < c; ++column) {
661 std::to_string(row) +
"]").c_str());
666 this->
write(name +
"(");
674 bool isTextureFunctionWithBias =
false;
675 bool nameWritten =
false;
676 const char* closingParen =
")";
678 case k_abs_IntrinsicKind: {
686 this->
write(
"_absemulation");
694 case k_atan_IntrinsicKind:
696 arguments.
size() == 2 &&
699 if (p.getOperator().kind() == Operator::Kind::MINUS) {
700 this->
write(
"atan(");
702 this->
write(
", -1.0 * ");
709 case k_ldexp_IntrinsicKind:
711 arguments.
size() == 2 &&
714 if (p.getOperator().kind() == Operator::Kind::MINUS) {
715 this->
write(
"ldexp(");
719 this->
write(
" * -1)");
724 case k_dFdy_IntrinsicKind:
734 case k_dFdx_IntrinsicKind:
735 case k_fwidth_IntrinsicKind:
742 case k_determinant_IntrinsicKind:
749 case k_fma_IntrinsicKind:
754 this->
write(
") * (");
756 this->
write(
") + (");
762 case k_fract_IntrinsicKind:
765 this->
write(
"(0.5 - sign(");
767 this->
write(
") * (0.5 - fract(abs(");
773 case k_inverse_IntrinsicKind:
780 case k_inversesqrt_IntrinsicKind:
787 case k_min_IntrinsicKind:
790 if (
is_abs(*arguments[0])) {
794 if (
is_abs(*arguments[1])) {
802 case k_pow_IntrinsicKind:
810 this->
write(
"exp2(");
812 this->
write(
" * log2(");
816 case k_saturate_IntrinsicKind:
818 this->
write(
"clamp(");
820 this->
write(
", 0.0, 1.0)");
822 case k_sample_IntrinsicKind: {
823 const char* dim =
"";
825 const Type& arg0Type = arguments[0]->type();
826 const Type& arg1Type = arguments[1]->type();
830 isTextureFunctionWithBias =
true;
841 isTextureFunctionWithBias =
true;
852 isTextureFunctionWithBias =
true;
862 isTextureFunctionWithBias =
true;
880 this->
write(
"texture");
890 case k_sampleGrad_IntrinsicKind: {
892 this->
write(
"textureGrad");
896 case k_sampleLod_IntrinsicKind: {
898 this->
write(
"textureLod");
902 case k_transpose_IntrinsicKind:
918 for (
const auto& arg : arguments) {
919 this->
write(separator());
922 if (
fProgram.
fConfig->fSettings.fSharpenTextures && isTextureFunctionWithBias) {
925 this->
write(closingParen);
938 this->
write(
"(1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0) * ");
958 this->
write(
".xy, ");
962 std::string tempVec =
"_tempVec" + std::to_string(
fVarCount++);
966 this->
write(tempVec);
972 this->
write(tempVec);
973 this->
write(
".xy, ");
974 this->
write(tempVec);
975 this->
write(
".zw))");
987 const Expression& argument = *arguments.front();
1006 this->
write(separator());
1017 fFunctionHeader +=
" float sk_FragCoord_InvW = 1. / sk_FragCoord_Workaround.w;\n";
1020 "vec4(sk_FragCoord_Workaround.xyz * sk_FragCoord_InvW, sk_FragCoord_InvW);\n";
1022 fFunctionHeader +=
" sk_FragCoord_Resolved.xy = floor(sk_FragCoord_Resolved.xy) + "
1041 "gl_FragCoord.w);\n";
1071 " sk_Clockwise = !sk_Clockwise;\n"
1129 if (f.ownerKind() == FieldAccess::OwnerKind::kDefault) {
1133 const Type& baseType = f.base()->type();
1134 int builtin = baseType.
fields()[f.fieldIndex()].fLayout.fBuiltin;
1155 SkASSERT(op.
kind() == Operator::Kind::EQEQ || op.
kind() == Operator::Kind::NEQ);
1159 std::string tempMatrix1 =
"_tempMatrix" + std::to_string(
fVarCount++);
1160 std::string tempMatrix2 =
"_tempMatrix" + std::to_string(
fVarCount++);
1166 this->
write(
"((" + tempMatrix1 +
" = ");
1168 this->
write(
"), (" + tempMatrix2 +
" = ");
1170 this->
write(
"), (" + tempMatrix1);
1172 this->
write(tempMatrix2 +
"))");
1181 op.
kind() == Operator::Kind::LOGICALOR)) {
1193 if (precedence >= parentPrecedence) {
1201 if (needsPositionWorkaround) {
1202 this->
write(
"sk_FragCoord_Workaround = (");
1210 if (isAssignmentToSampleMask) {
1212 this->
write(
"int(");
1215 if (isAssignmentToSampleMask) {
1218 if (needsPositionWorkaround) {
1221 if (precedence >= parentPrecedence) {
1228 if (Precedence::kTernary >= parentPrecedence) {
1250 if (Precedence::kTernary >= parentPrecedence) {
1257 if (Precedence::kTernary >= parentPrecedence) {
1265 if (Precedence::kTernary >= parentPrecedence) {
1272 if (Precedence::kPrefix >= parentPrecedence) {
1277 if (Precedence::kPrefix >= parentPrecedence) {
1284 if (Precedence::kPostfix >= parentPrecedence) {
1289 if (Precedence::kPostfix >= parentPrecedence) {
1296 if (
type.isInteger()) {
1298 this->
write(std::to_string(l.
intValue() & 0xffffffff) +
"u");
1320 this->
write(
"float ");
1329 for (
size_t index = 0; index < f.parameters().size(); ++index) {
1330 const Variable* param = f.parameters()[index];
1336 if (f.isMain() && param == f.getMainCoordsParameter()) {
1339 this->
write(separator());
1345 std::vector<int> sizes;
1347 if (
type->isArray()) {
1348 sizes.push_back(
type->columns());
1354 if (!param->
name().empty()) {
1360 this->
write(
"_skAnonymousParam");
1361 this->
write(std::to_string(index));
1363 for (
int s : sizes) {
1364 this->
write(
"[" + std::to_string(
s) +
"]");
1384 for (
const std::unique_ptr<Statement>& stmt : f.body()->as<
Block>().children()) {
1385 if (!stmt->isEmpty()) {
1414 bool globalContext) {
1419 this->
write(
"flat ");
1422 this->
write(
"noperspective ");
1426 this->
write(
"const ");
1429 this->
write(
"uniform ");
1432 this->
write(
"inout ");
1442 this->
write(
"varying ");
1444 this->
write(
"out ");
1449 this->
write(
"readonly ");
1452 this->
write(
"writeonly ");
1455 this->
write(
"buffer ");
1460 if (intf.
typeName() ==
"sk_PerVertex") {
1468 for (
const auto& f : structType->
fields()) {
1501 return fProgram.
fConfig->fSettings.fForceHighPrecision ?
"highp " :
"mediump ";
1536 this->
write(
"inout ");
1538 this->
write(
"out ");
1541 this->
write(
"mediump ");
1561 this->
write(
"uniform ");
1600 case Statement::Kind::kBlock:
1603 case Statement::Kind::kExpression:
1606 case Statement::Kind::kReturn:
1609 case Statement::Kind::kVarDeclaration:
1612 case Statement::Kind::kIf:
1615 case Statement::Kind::kFor:
1618 case Statement::Kind::kDo:
1621 case Statement::Kind::kSwitch:
1624 case Statement::Kind::kBreak:
1625 this->
write(
"break;");
1627 case Statement::Kind::kContinue:
1628 this->
write(
"continue;");
1630 case Statement::Kind::kDiscard:
1631 this->
write(
"discard;");
1633 case Statement::Kind::kNop:
1645 bool isScope =
b.isScope() ||
b.isEmpty();
1650 for (
const std::unique_ptr<Statement>& stmt :
b.children()) {
1651 if (!stmt->isEmpty()) {
1663 this->
write(
"if (");
1668 this->
write(
" else ");
1675 if (!f.initializer() && f.test() && !f.next()) {
1676 this->
write(
"while (");
1683 this->
write(
"for (");
1684 if (f.
initializer() && !f.initializer()->isEmpty()) {
1692 Position(), f.test()->clone(), Operator::Kind::LOGICALAND,
1712 this->
write(
" while (");
1734 std::string tmpVar =
"_tmpLoopSeenOnce" + std::to_string(
fVarCount++);
1735 this->
write(
"bool ");
1736 this->
write(tmpVar);
1740 this->
write(
"if (");
1741 this->
write(tmpVar);
1744 this->
write(
"if (!");
1753 this->
write(tmpVar);
1772 std::string fallthroughVar =
"_tmpSwitchFallthrough" + std::to_string(
fVarCount++);
1773 std::string valueVar =
"_tmpSwitchValue" + std::to_string(
fVarCount++);
1774 std::string loopVar =
"_tmpSwitchLoop" + std::to_string(
fVarCount++);
1775 this->
write(
"int ");
1776 this->
write(valueVar);
1780 this->
write(fallthroughVar);
1782 this->
write(
"for (int ");
1783 this->
write(loopVar);
1784 this->
write(
" = 0; ");
1785 this->
write(loopVar);
1786 this->
write(
" < 1; ");
1787 this->
write(loopVar);
1791 bool firstCase =
true;
1792 for (
const std::unique_ptr<Statement>& stmt :
s.cases()) {
1795 this->
write(
"if ((");
1799 this->
write(fallthroughVar);
1800 this->
write(
" > 0) || (");
1802 this->
write(valueVar);
1803 this->
write(
" == ");
1816 this->
write(fallthroughVar);
1817 this->
write(
" = 1;");
1834 this->
write(
"switch (");
1850 bool foundEmptyCase =
false;
1852 for (
const std::unique_ptr<Statement>& stmt :
s.cases()) {
1857 this->
write(
"case ");
1862 foundEmptyCase =
true;
1864 foundEmptyCase =
false;
1871 if (foundEmptyCase) {
1884 this->
write(
"return");
1891 this->
write(
" 0.0");
1905 case ProgramElement::Kind::kExtension:
1909 case ProgramElement::Kind::kGlobalVar:
1913 case ProgramElement::Kind::kInterfaceBlock:
1917 case ProgramElement::Kind::kFunction:
1921 case ProgramElement::Kind::kFunctionPrototype:
1925 case ProgramElement::Kind::kModifiers: {
1931 case ProgramElement::Kind::kStructDefinition:
1936 SkDEBUGFAILF(
"unsupported program element %s\n", e.description().c_str());
1945 useRTFlipUniform &=
~Program::Interface::kRTFlip_FragCoord;
1994 this->
write(
"highp ");
1996 this->
write(
"vec4 sk_FragCoord_Workaround;\n");
2000 this->
write(
"highp ");
2002 this->
write(
"vec4 sk_FragCoord_Workaround;\n");
2007 const char* precision =
2008 fProgram.
fConfig->fSettings.fForceHighPrecision ?
"highp" :
"mediump";
2030 program.
fContext->fErrors->setSource(std::string_view());
#define SK_ABORT(message,...)
#define SkDEBUGFAILF(fmt,...)
static bool left(const SkPoint &p0, const SkPoint &p1)
static bool right(const SkPoint &p0, const SkPoint &p1)
constexpr int SK_SAMPLEMASK_BUILTIN
constexpr int SK_CLOCKWISE_BUILTIN
constexpr int SK_VERTEXID_BUILTIN
constexpr int SK_FRAGCOLOR_BUILTIN
constexpr int SK_LASTFRAGCOLOR_BUILTIN
constexpr int SK_POSITION_BUILTIN
constexpr int SK_INSTANCEID_BUILTIN
constexpr int SK_SECONDARYFRAGCOLOR_BUILTIN
constexpr int SK_POINTSIZE_BUILTIN
constexpr int SK_FRAGCOORD_BUILTIN
constexpr int SK_SAMPLEMASKIN_BUILTIN
virtual SkSpan< std::unique_ptr< Expression > > argumentSpan()=0
std::unique_ptr< Expression > & left()
std::unique_ptr< Expression > & right()
Operator getOperator() const
const std::unique_ptr< Type > fFloat2
const std::unique_ptr< Type > fFloatLiteral
const std::unique_ptr< Type > fHalf2x2
const std::unique_ptr< Type > fUShort
const std::unique_ptr< Type > fInt
const std::unique_ptr< Type > fFloat2x2
const std::unique_ptr< Type > fFloat4x4
const std::unique_ptr< Type > fShort
const std::unique_ptr< Type > fFloat4
const std::unique_ptr< Type > fHalf3x3
const std::unique_ptr< Type > fFloat3x3
const std::unique_ptr< Type > fSampler2DRect
const std::unique_ptr< Type > fSamplerExternalOES
const std::unique_ptr< Type > fUInt
const std::unique_ptr< Type > fBool
const std::unique_ptr< Type > fFloat
const std::unique_ptr< Type > fFloat3
const std::unique_ptr< Type > fHalf
const std::unique_ptr< Type > fHalf4x4
static constexpr float kSharpenTexturesBias
const BuiltinTypes & fTypes
std::unique_ptr< Expression > & test()
std::unique_ptr< Statement > & statement()
void error(Position position, std::string_view msg)
const std::unique_ptr< Expression > & expression() const
virtual const Type & type() const
std::string description() const final
AnyConstructor & asAnyConstructor()
std::string_view name() const
std::unique_ptr< Expression > & base()
std::unique_ptr< Statement > & statement()
std::unique_ptr< Expression > & next()
std::unique_ptr< Expression > & test()
std::unique_ptr< Statement > & initializer()
ExpressionArray & arguments()
const FunctionDeclaration & function() const
std::string mangledName() const
IntrinsicKind intrinsicKind() const
const Type & returnType() const
const FunctionDeclaration & declaration() const
const FunctionDeclaration & declaration() const
void writePrefixExpression(const PrefixExpression &p, Precedence parentPrecedence)
void writeIntrinsicCall(const FunctionCall &c)
void writeFieldAccess(const FieldAccess &f)
void writeModifiers(const Layout &layout, ModifierFlags flags, bool globalContext)
void writeIndexExpression(const IndexExpression &expr)
void writeLayout(const Layout &layout)
void writeExpression(const Expression &expr, Precedence parentPrecedence)
void writeForStatement(const ForStatement &f)
void writeAnyConstructor(const AnyConstructor &c, Precedence parentPrecedence)
void writeFunctionPrototype(const FunctionPrototype &f)
bool fFoundExternalSamplerDecl
void writeType(const Type &type)
void writeStructDefinition(const StructDefinition &s)
void writeInverseSqrtHack(const Expression &x)
void writeIdentifier(std::string_view identifier)
void writeTernaryExpression(const TernaryExpression &t, Precedence parentPrecedence)
void writeShortCircuitWorkaroundExpression(const BinaryExpression &b, Precedence parentPrecedence)
void writeCastConstructor(const AnyConstructor &c, Precedence parentPrecedence)
void writeTypePrecision(const Type &type)
bool fWrittenAbsEmulation
void writeExpressionStatement(const ExpressionStatement &s)
const char * getTypePrecision(const Type &type)
void writeBlock(const Block &b)
StringStream fExtraFunctions
bool fFoundRectSamplerDecl
void writeReturnStatement(const ReturnStatement &r)
void writeInverseHack(const Expression &mat)
std::string fFunctionHeader
void writeBinaryExpression(const BinaryExpression &b, Precedence parentPrecedence)
bool generateCode() override
void writeConstructorDiagonalMatrix(const ConstructorDiagonalMatrix &c, Precedence parentPrecedence)
void writeProgramElement(const ProgramElement &e)
bool fSetupFragCoordWorkaround
void writeSwitchStatement(const SwitchStatement &s)
void writeFunctionCall(const FunctionCall &c)
void writeSwizzle(const Swizzle &swizzle)
void writeStatement(const Statement &s)
void writeFunction(const FunctionDefinition &f)
void writeTransposeHack(const Expression &mat)
void writeGlobalVarDeclaration(const GlobalVarDeclaration &e)
void writeInterfaceBlock(const InterfaceBlock &intf)
void writeMinAbsHack(Expression &absExpr, Expression &otherExpr)
bool fWrittenDeterminant3
const FunctionDeclaration * fCurrentFunction
bool fWrittenDeterminant2
void writeLiteral(const Literal &l)
void writeVariableReference(const VariableReference &ref)
bool usesPrecisionModifiers() const
void writeMatrixComparisonWorkaround(const BinaryExpression &x)
bool shouldRewriteVoidTypedFunctions(const FunctionDeclaration *func) const
void writeDoStatement(const DoStatement &d)
GLSLCodeGenerator(const Context *context, const ShaderCaps *caps, const Program *program, OutputStream *out)
void writeLine(std::string_view s=std::string_view())
bool fWrittenTranspose[3][3]
void writeConstructorCompound(const ConstructorCompound &c, Precedence parentPrecedence)
void writePostfixExpression(const PostfixExpression &p, Precedence parentPrecedence)
void writeIfStatement(const IfStatement &stmt)
void writeDeterminantHack(const Expression &mat)
void write(std::string_view s)
void writeVarInitializer(const Variable &var, const Expression &value)
bool fWrittenDeterminant4
std::string getTypeName(const Type &type)
void writeFunctionDeclaration(const FunctionDeclaration &f)
void writeExtension(std::string_view name, bool require=true)
void writeVarDeclaration(const VarDeclaration &var, bool global)
Position position() const
virtual std::string description() const =0
std::unique_ptr< Expression > & test()
std::unique_ptr< Statement > & ifTrue()
std::unique_ptr< Statement > & ifFalse()
std::unique_ptr< Expression > & base()
std::unique_ptr< Expression > & index()
std::string_view instanceName() const
std::string_view typeName() const
static std::unique_ptr< Literal > MakeBool(const Context &context, Position pos, bool value)
std::string description(OperatorPrecedence) const override
SKSL_INT intValue() const
const Layout & layout() const
ExpressionArray & arguments()
std::string_view tightOperatorName() const
OperatorPrecedence getBinaryPrecedence() const
const char * operatorName() const
bool isAssignment() const
virtual void write(const void *s, size_t size)=0
virtual void writeText(const char *s)=0
Operator getOperator() const
std::unique_ptr< Expression > & operand()
Operator getOperator() const
std::unique_ptr< Expression > & operand()
std::unique_ptr< Expression > & expression()
std::unique_ptr< Expression > toLiteral(const ShaderCaps &caps) const
std::unique_ptr< Expression > & argument()
void writeText(const char *s) override
const std::string & str() const
void write(const void *s, size_t size) override
std::unique_ptr< Statement > & statement()
std::unique_ptr< Expression > & value()
std::unique_ptr< Expression > & base()
const ComponentArray & components() const
static std::string MaskString(const ComponentArray &inComponents)
std::string_view name() const
const Type & type() const
std::unique_ptr< Expression > & ifTrue()
std::unique_ptr< Expression > & test()
std::unique_ptr< Expression > & ifFalse()
virtual bool isVector() const
virtual const Type & componentType() const
virtual SkSpan< const Field > fields() const
bool matches(const Type &other) const
virtual bool isMatrix() const
virtual const Type & resolve() const
virtual int columns() const
virtual const Type & scalarTypeForLiteral() const
const Type & toCompound(const Context &context, int columns, int rows) const
TypeKind typeKind() const
virtual SpvDim_ dimensions() const
const Type & baseType() const
std::unique_ptr< Expression > & value()
const Variable * variable() const
virtual std::string_view mangledName() const
ModifierFlags modifierFlags() const
virtual const Layout & layout() const
static SkString identifier(const FontFamilyDesc &family, const FontDesc &font)
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
FlutterSemanticsFlag flags
static const uint8_t buffer[]
Dart_NativeFunction function
bool ContainsRTAdjust(const Expression &expr)
bool IsTrivialExpression(const Expression &expr)
bool HasSideEffects(const Expression &expr)
std::string printf(const char *fmt,...) SK_PRINTF_LIKE(1
std::string void void auto Separator()
static constexpr char kInverse4[]
static constexpr char kDeterminant4[]
static constexpr char kDeterminant2[]
void write_stringstream(const StringStream &s, OutputStream &out)
static bool is_abs(Expression &expr)
static constexpr char kDeterminant3[]
static constexpr char kInverse3[]
static constexpr char kInverse2[]
bool ToGLSL(Program &program, const ShaderCaps *caps, OutputStream &out)
bool is_sk_position(const Expression &expr)
bool is_sk_samplemask(const Expression &expr)
constexpr bool contains(std::string_view str, std::string_view needle)
std::string paddedDescription() const
static bool IsVertex(ProgramKind kind)
static bool IsFragment(ProgramKind kind)
ElementsCollection elements() const
std::shared_ptr< Context > fContext
ProgramInterface fInterface
std::vector< const ProgramElement * > fSharedElements
std::unique_ptr< std::string > fSource
std::unique_ptr< ProgramConfig > fConfig
const char * secondExternalTextureExtensionString() const
bool fRewriteMatrixComparisons
bool fExternalTextureSupport
const char * shaderDerivativeExtensionString() const
bool fMustForceNegatedAtanParamToFloat
bool fDualSourceBlendingSupport
bool fEmulateAbsIntFunction
bool fCanUseVoidInSequenceExpressions
const char * fFBFetchColorName
const char * externalTextureExtensionString() const
bool fUnfoldShortCircuitAsTernary
bool fRemovePowWithConstantExponent
bool fRewriteDoWhileLoops
bool fRewriteSwitchStatements
const char * fVersionDeclString
bool fBuiltinDeterminantSupport
bool fAddAndTrueToLoopCondition
bool fMustForceNegatedLdexpParamToMultiply
bool mustDeclareFragmentShaderOutput() const
bool fCanUseFractForNegativeValues
bool fRemoveConstFromFunctionParameters
bool fNoDefaultPrecisionForExternalSamplers
bool fUsesPrecisionModifiers
bool fCanUseMinAndAbsTogether
SkSL::GLSLGeneration fGLSLGeneration
#define TRACE_EVENT0(category_group, name)