Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 607d36b

Browse files
johnstiles-googleSkia Commit-Bot
authored andcommitted
Add a fBuiltin flag to FunctionDefinition.
This is useful because we can clone FunctionDefinitions without cloning the matching FunctionDeclaration. The FunctionDeclaration will remain a builtin, but the definition should be a malleable clone. Change-Id: Icfc1e0855fb8fcd6914a5d657f5098986fcf19ea Reviewed-on: https://skia-review.googlesource.com/c/skia/+/328396 Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Auto-Submit: John Stiles <johnstiles@google.com>
1 parent 13fa346 commit 607d36b

File tree

5 files changed

+31
-14
lines changed

5 files changed

+31
-14
lines changed

src/sksl/SkSLIRGenerator.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ std::unique_ptr<Block> IRGenerator::applyInvocationIDWorkaround(std::unique_ptr<
728728
fContext.fVoid_Type.get(),
729729
fIsBuiltinCode));
730730
fProgramElements->push_back(std::make_unique<FunctionDefinition>(/*offset=*/-1,
731-
invokeDecl,
731+
invokeDecl, fIsBuiltinCode,
732732
std::move(main)));
733733

734734
std::vector<std::unique_ptr<VarDeclaration>> variables;
@@ -1062,8 +1062,8 @@ void IRGenerator::convertFunction(const ASTNode& f) {
10621062
if (Program::kVertex_Kind == fKind && funcData.fName == "main" && fRTAdjust) {
10631063
body->children().push_back(this->getNormalizeSkPositionCode());
10641064
}
1065-
auto result = std::make_unique<FunctionDefinition>(f.fOffset, decl, std::move(body),
1066-
std::move(fReferencedIntrinsics));
1065+
auto result = std::make_unique<FunctionDefinition>(
1066+
f.fOffset, decl, fIsBuiltinCode, std::move(body), std::move(fReferencedIntrinsics));
10671067
decl->setDefinition(result.get());
10681068
result->setSource(&f);
10691069
fProgramElements->push_back(std::move(result));
@@ -2020,7 +2020,11 @@ void IRGenerator::copyIntrinsicIfNeeded(const FunctionDeclaration& function) {
20202020
for (const FunctionDeclaration* f : intrinsics) {
20212021
this->copyIntrinsicIfNeeded(*f);
20222022
}
2023-
fProgramElements->push_back(original.clone());
2023+
2024+
// Unmark the function as a built-in when cloning it, so that it is eligible for alteration.
2025+
std::unique_ptr<ProgramElement> clonedIntrinsicFn = original.clone();
2026+
clonedIntrinsicFn->as<FunctionDefinition>().setBuiltin(false);
2027+
fProgramElements->push_back(std::move(clonedIntrinsicFn));
20242028
}
20252029
}
20262030

src/sksl/SkSLInliner.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -822,8 +822,10 @@ class InlineCandidateAnalyzer {
822822
switch (pe->kind()) {
823823
case ProgramElement::Kind::kFunction: {
824824
FunctionDefinition& funcDef = pe->as<FunctionDefinition>();
825-
fEnclosingFunction = &funcDef;
826-
this->visitStatement(&funcDef.body());
825+
if (!funcDef.isBuiltin()) {
826+
fEnclosingFunction = &funcDef;
827+
this->visitStatement(&funcDef.body());
828+
}
827829
break;
828830
}
829831
default:

src/sksl/SkSLRehydrator.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,10 +316,11 @@ std::unique_ptr<ProgramElement> Rehydrator::element() {
316316
refs.insert(this->symbolRef<FunctionDeclaration>(
317317
Symbol::Kind::kFunctionDeclaration));
318318
}
319-
FunctionDefinition* result = new FunctionDefinition(-1, decl, std::move(body),
320-
std::move(refs));
321-
decl->setDefinition(result);
322-
return std::unique_ptr<ProgramElement>(result);
319+
auto result = std::make_unique<FunctionDefinition>(/*offset=*/-1, decl,
320+
/*builtin=*/true, std::move(body),
321+
std::move(refs));
322+
decl->setDefinition(result.get());
323+
return std::move(result);
323324
}
324325
case Rehydrator::kInterfaceBlock_Command: {
325326
const Symbol* var = this->symbol();

src/sksl/ir/SkSLFunctionDefinition.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,27 @@ struct FunctionDefinition : public ProgramElement {
2323
static constexpr Kind kProgramElementKind = Kind::kFunction;
2424

2525
FunctionDefinition(int offset,
26-
const FunctionDeclaration* declaration,
26+
const FunctionDeclaration* declaration, bool builtin,
2727
std::unique_ptr<Statement> body,
2828
std::unordered_set<const FunctionDeclaration*> referencedIntrinsics = {})
29-
: INHERITED(offset, FunctionDefinitionData{declaration, std::move(referencedIntrinsics),
30-
nullptr}) {
29+
: INHERITED(offset,
30+
FunctionDefinitionData{declaration, builtin, std::move(referencedIntrinsics),
31+
/*fSource=*/nullptr}) {
3132
fStatementChildren.push_back(std::move(body));
3233
}
3334

3435
const FunctionDeclaration& declaration() const {
3536
return *this->functionDefinitionData().fDeclaration;
3637
}
3738

39+
bool isBuiltin() const {
40+
return this->functionDefinitionData().fBuiltin;
41+
}
42+
43+
void setBuiltin(bool builtin) {
44+
this->functionDefinitionData().fBuiltin = builtin;
45+
}
46+
3847
std::unique_ptr<Statement>& body() {
3948
return this->fStatementChildren[0];
4049
}
@@ -57,7 +66,7 @@ struct FunctionDefinition : public ProgramElement {
5766

5867
std::unique_ptr<ProgramElement> clone() const override {
5968
return std::make_unique<FunctionDefinition>(fOffset, &this->declaration(),
60-
this->body()->clone(),
69+
this->isBuiltin(), this->body()->clone(),
6170
this->referencedIntrinsics());
6271
}
6372

src/sksl/ir/SkSLIRNode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ class IRNode {
139139

140140
struct FunctionDefinitionData {
141141
const FunctionDeclaration* fDeclaration;
142+
bool fBuiltin;
142143
// We track intrinsic functions we reference so that we can ensure that all of them end up
143144
// copied into the final output.
144145
std::unordered_set<const FunctionDeclaration*> fReferencedIntrinsics;

0 commit comments

Comments
 (0)