@@ -15,8 +15,19 @@ static inline int new_sksl_index() {
1515 return nextIndex++;
1616}
1717
18- sk_sp<SkRuntimeEffect> SkRuntimeEffect::Make (SkString sksl) {
19- return sk_sp<SkRuntimeEffect>(new SkRuntimeEffect (std::move (sksl)));
18+ SkRuntimeEffect::EffectResult SkRuntimeEffect::Make (SkString sksl) {
19+ auto compiler = std::make_unique<SkSL::Compiler>();
20+ auto program = compiler->convertProgram (SkSL::Program::kPipelineStage_Kind ,
21+ SkSL::String (sksl.c_str (), sksl.size ()),
22+ SkSL::Program::Settings ());
23+ if (!program) {
24+ return std::make_pair (nullptr , SkString (compiler->errorText ().c_str ()));
25+ }
26+ SkASSERT (!compiler->errorCount ());
27+
28+ sk_sp<SkRuntimeEffect> effect (new SkRuntimeEffect (std::move (sksl), std::move (compiler),
29+ std::move (program)));
30+ return std::make_pair (std::move (effect), SkString ());
2031}
2132
2233size_t SkRuntimeEffect::Variable::sizeInBytes () const {
@@ -38,17 +49,13 @@ size_t SkRuntimeEffect::Variable::sizeInBytes() const {
3849 return element_size (fType ) * fCount ;
3950}
4051
41- SkRuntimeEffect::SkRuntimeEffect (SkString sksl)
52+ SkRuntimeEffect::SkRuntimeEffect (SkString sksl, std::unique_ptr<SkSL::Compiler> compiler,
53+ std::unique_ptr<SkSL::Program> baseProgram)
4254 : fIndex(new_sksl_index())
43- , fSkSL(std::move(sksl)) {
44- fBaseProgram = fCompiler .convertProgram (SkSL::Program::kPipelineStage_Kind ,
45- SkSL::String (fSkSL .c_str (), fSkSL .size ()),
46- SkSL::Program::Settings ());
47- if (!fBaseProgram ) {
48- SkDebugf (" %s\n " , fCompiler .errorText ().c_str ());
49- return ;
50- }
51- SkASSERT (!fCompiler .errorCount ());
55+ , fSkSL(std::move(sksl))
56+ , fCompiler(std::move(compiler))
57+ , fBaseProgram(std::move(baseProgram)) {
58+ SkASSERT (fCompiler && fBaseProgram );
5259
5360 size_t offset = 0 ;
5461 auto gather_variables = [this , &offset](SkSL::Modifiers::Flag flag) {
@@ -68,7 +75,7 @@ SkRuntimeEffect::SkRuntimeEffect(SkString sksl)
6875 SkASSERT ((var.fModifiers .fLayout .fFlags & SkSL::Layout::kTracked_Flag ) == 0 );
6976
7077 if (var.fModifiers .fFlags & flag) {
71- if (&var.fType == fCompiler . context ().fFragmentProcessor_Type .get ()) {
78+ if (&var.fType == fCompiler -> context ().fFragmentProcessor_Type .get ()) {
7279 fChildren .push_back (var.fName );
7380 continue ;
7481 }
@@ -94,7 +101,7 @@ SkRuntimeEffect::SkRuntimeEffect(SkString sksl)
94101#define SET_TYPES (cpuType, gpuType ) do { v.fType = cpuType; } while (false )
95102#endif
96103
97- const SkSL::Context& ctx (fCompiler . context ());
104+ const SkSL::Context& ctx (fCompiler -> context ());
98105 if (type == ctx.fBool_Type .get ()) {
99106 SET_TYPES (Variable::Type::kBool , kVoid_GrSLType );
100107 } else if (type == ctx.fInt_Type .get ()) {
@@ -168,9 +175,9 @@ bool SkRuntimeEffect::toPipelineStage(const void* inputs, const GrShaderCaps* sh
168175 SkSL::Program::Settings settings;
169176 settings.fCaps = shaderCaps;
170177
171- auto baseProgram = fCompiler . convertProgram (SkSL::Program::kPipelineStage_Kind ,
172- SkSL::String (fSkSL .c_str (), fSkSL .size ()),
173- settings);
178+ auto baseProgram = fCompiler -> convertProgram (SkSL::Program::kPipelineStage_Kind ,
179+ SkSL::String (fSkSL .c_str (), fSkSL .size ()),
180+ settings);
174181 SkASSERT (baseProgram);
175182
176183 std::unordered_map<SkSL::String, SkSL::Program::Settings::Value> inputMap;
@@ -203,16 +210,16 @@ bool SkRuntimeEffect::toPipelineStage(const void* inputs, const GrShaderCaps* sh
203210 }
204211 }
205212
206- auto specialized = fCompiler . specialize (*baseProgram, inputMap);
207- bool optimized = fCompiler . optimize (*specialized);
213+ auto specialized = fCompiler -> specialize (*baseProgram, inputMap);
214+ bool optimized = fCompiler -> optimize (*specialized);
208215 if (!optimized) {
209- SkDebugf (" %s\n " , fCompiler . errorText ().c_str ());
216+ SkDebugf (" %s\n " , fCompiler -> errorText ().c_str ());
210217 SkASSERT (false );
211218 return false ;
212219 }
213220
214- if (!fCompiler . toPipelineStage (*specialized, outCode, outFormatArgs, outFunctions)) {
215- SkDebugf (" %s\n " , fCompiler . errorText ().c_str ());
221+ if (!fCompiler -> toPipelineStage (*specialized, outCode, outFormatArgs, outFunctions)) {
222+ SkDebugf (" %s\n " , fCompiler -> errorText ().c_str ());
216223 SkASSERT (false );
217224 return false ;
218225 }
@@ -221,8 +228,7 @@ bool SkRuntimeEffect::toPipelineStage(const void* inputs, const GrShaderCaps* sh
221228}
222229#endif
223230
224- std::tuple<std::unique_ptr<SkSL::ByteCode>, int , SkString> SkRuntimeEffect::toByteCode () {
225- auto byteCode = fCompiler .toByteCode (*fBaseProgram );
226- return std::make_tuple (std::move (byteCode), fCompiler .errorCount (),
227- SkString (fCompiler .errorText ().c_str ()));
231+ SkRuntimeEffect::ByteCodeResult SkRuntimeEffect::toByteCode () {
232+ auto byteCode = fCompiler ->toByteCode (*fBaseProgram );
233+ return std::make_tuple (std::move (byteCode), SkString (fCompiler ->errorText ().c_str ()));
228234}
0 commit comments