@@ -336,15 +336,28 @@ SkRuntimeEffect::ByteCodeResult SkRuntimeEffect::toByteCode() const {
336336
337337using SampleChildFn = std::function<skvm::Color(int , skvm::Coord)>;
338338
339- static std::vector<skvm::F32> program_fn (skvm::Builder* p,
340- const SkSL::ByteCodeFunction& fn,
341- const std::vector<skvm::F32>& uniform,
342- std::vector<skvm::F32> stack,
343- SampleChildFn sampleChild,
344- skvm::Coord device, skvm::Coord local) {
339+ static skvm::Color program_fn (skvm::Builder* p,
340+ const SkSL::ByteCodeFunction& fn,
341+ const std::vector<skvm::F32>& uniform,
342+ skvm::Color inColor,
343+ SampleChildFn sampleChild,
344+ skvm::Coord device, skvm::Coord local) {
345+ std::vector<skvm::F32> stack;
346+
345347 auto push = [&](skvm::F32 x) { stack.push_back (x); };
346348 auto pop = [&]{ skvm::F32 x = stack.back (); stack.pop_back (); return x; };
347349
350+ // main(inout half4 color) or main(float2 local, inout half4 color)
351+ SkASSERT (fn.getParameterCount () == 4 || fn.getParameterCount () == 6 );
352+ if (fn.getParameterCount () == 6 ) {
353+ push (local.x );
354+ push (local.y );
355+ }
356+ push (inColor.r );
357+ push (inColor.g );
358+ push (inColor.b );
359+ push (inColor.a );
360+
348361 for (int i = 0 ; i < fn.getLocalCount (); i++) {
349362 push (p->splat (0 .0f ));
350363 }
@@ -586,7 +599,12 @@ static std::vector<skvm::F32> program_fn(skvm::Builder* p,
586599 for (int i = 0 ; i < fn.getLocalCount (); i++) {
587600 pop ();
588601 }
589- return stack;
602+ SkASSERT (stack.size () == (size_t )fn.getParameterCount ());
603+ skvm::F32 a = pop (),
604+ b = pop (),
605+ g = pop (),
606+ r = pop ();
607+ return { r, g, b, a };
590608}
591609
592610static sk_sp<SkData> get_xformed_uniforms (const SkRuntimeEffect* effect,
@@ -752,14 +770,8 @@ class SkRuntimeColorFilter : public SkColorFilterBase {
752770 // Regardless, just to be extra-safe, we pass something valid (0, 0) as both coords, so
753771 // the builder isn't trying to do math on invalid values.
754772 skvm::Coord zeroCoord = { p->splat (0 .0f ), p->splat (0 .0f ) };
755- std::vector<skvm::F32> stack =
756- program_fn (p, *fn, uniform, {c.r , c.g , c.b , c.a }, sampleChild,
757- /* device=*/ zeroCoord, /* local=*/ zeroCoord);
758-
759- if (stack.size () == 4 ) {
760- return {stack[0 ], stack[1 ], stack[2 ], stack[3 ]};
761- }
762- return {};
773+ return program_fn (p, *fn, uniform, c, sampleChild,
774+ /* device=*/ zeroCoord, /* local=*/ zeroCoord);
763775 }
764776
765777 void flatten (SkWriteBuffer& buffer) const override {
@@ -914,15 +926,7 @@ class SkRTShader : public SkShaderBase {
914926 }
915927 };
916928
917- std::vector<skvm::F32> stack =
918- program_fn (p, *fn, uniform,
919- {local.x ,local.y , paint.r , paint.g , paint.b , paint.a },
920- sampleChild, device, local);
921-
922- if (stack.size () == 6 ) {
923- return {stack[2 ], stack[3 ], stack[4 ], stack[5 ]};
924- }
925- return {};
929+ return program_fn (p, *fn, uniform, paint, sampleChild, device, local);
926930 }
927931
928932 void flatten (SkWriteBuffer& buffer) const override {
0 commit comments