@@ -415,7 +415,7 @@ static std::vector<skvm::F32> program_fn(skvm::Builder* p,
415415 std::vector<skvm::F32> stack,
416416 /* these parameters are used to call program() on children*/
417417 const std::vector<sk_sp<SkShader>>& children,
418- skvm::F32 x, skvm::F32 y , skvm::Color paint,
418+ skvm::Coord device , skvm::Color paint,
419419 SkFilterQuality quality, const SkColorInfo& dst,
420420 skvm::Uniforms* uniforms, SkArenaAlloc* alloc) {
421421 auto push = [&](skvm::F32 x) { stack.push_back (x); };
@@ -483,7 +483,7 @@ static std::vector<skvm::F32> program_fn(skvm::Builder* p,
483483 x = pop ();
484484
485485 SkOverrideDeviceMatrixProvider mats{matrices, SkMatrix::I ()};
486- skvm::Color c = as_SB (children[ix])->program (p, x,y,paint,
486+ skvm::Color c = as_SB (children[ix])->program (p, device, { x,y} ,paint,
487487 mats, nullptr ,
488488 quality, dst,
489489 uniforms, alloc);
@@ -548,6 +548,14 @@ static std::vector<skvm::F32> program_fn(skvm::Builder* p,
548548 push (uniform[ix + 3 ]);
549549 } break ;
550550
551+ case Inst::kLoadFragCoord : {
552+ // TODO: Actually supply Z and 1/W from the rasterizer?
553+ push (device.x );
554+ push (device.y );
555+ push (p->splat (0 .0f )); // Z
556+ push (p->splat (1 .0f )); // 1/W
557+ } break ;
558+
551559 case Inst::kStore : {
552560 int ix = u8 ();
553561 stack[ix + 0 ] = pop ();
@@ -828,7 +836,7 @@ class SkRuntimeColorFilter : public SkColorFilter {
828836 std::vector<skvm::F32> stack =
829837 program_fn (p, *fn, uniform, SkSimpleMatrixProvider{SkMatrix::I ()}, {c.r , c.g , c.b , c.a },
830838 /* the remaining parameters are for shaders only and won't be used here */
831- {},{},{},{},{},{},{},{} );
839+ {},{},{},{},{},{},{});
832840
833841 if (stack.size () == 4 ) {
834842 return {stack[0 ], stack[1 ], stack[2 ], stack[3 ]};
@@ -1017,7 +1025,8 @@ class SkRTShader : public SkShaderBase {
10171025 return true ;
10181026 }
10191027
1020- skvm::Color onProgram (skvm::Builder* p, skvm::F32 x, skvm::F32 y, skvm::Color paint,
1028+ skvm::Color onProgram (skvm::Builder* p,
1029+ skvm::Coord device, skvm::Coord local, skvm::Color paint,
10211030 const SkMatrixProvider& matrices, const SkMatrix* localM,
10221031 SkFilterQuality quality, const SkColorInfo& dst,
10231032 skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const override {
@@ -1047,12 +1056,13 @@ class SkRTShader : public SkShaderBase {
10471056 if (!this ->computeTotalInverse (matrices.localToDevice (), localM, &inv)) {
10481057 return {};
10491058 }
1050- SkShaderBase::ApplyMatrix (p,inv, &x,&y ,uniforms);
1059+ SkShaderBase::ApplyMatrix (p,inv, &local ,uniforms);
10511060
10521061 std::vector<skvm::F32> stack =
1053- program_fn (p, *fn, uniform, matrices, {x,y, paint.r , paint.g , paint.b , paint.a },
1062+ program_fn (p, *fn, uniform, matrices,
1063+ {local.x ,local.y , paint.r , paint.g , paint.b , paint.a },
10541064 /* parameters for calling program() on children*/
1055- fChildren , x,y ,paint, quality,dst, uniforms,alloc);
1065+ fChildren , device ,paint, quality,dst, uniforms,alloc);
10561066
10571067 if (stack.size () == 6 ) {
10581068 return {stack[2 ], stack[3 ], stack[4 ], stack[5 ]};
0 commit comments