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

Commit 5aaaeea

Browse files
brianosmanSkia Commit-Bot
authored andcommitted
Supply device and local coords to SkShader_Base::onProgram
Use that to add support for sk_FragCoord in SkRuntimeEffect. Change-Id: I587ad97057c13ec8a4052c7c20f655eae88786ba Reviewed-on: https://skia-review.googlesource.com/c/skia/+/298504 Commit-Queue: Brian Osman <[email protected]> Reviewed-by: Mike Klein <[email protected]>
1 parent fe02dd1 commit 5aaaeea

33 files changed

+173
-97
lines changed

src/core/SkRuntimeEffect.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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]};

src/core/SkVM.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,12 @@ namespace skvm {
476476
Builder* operator->() const { return a.operator->(); }
477477
};
478478

479+
struct Coord {
480+
F32 x,y;
481+
explicit operator bool() const { return x && y; }
482+
Builder* operator->() const { return x.operator->(); }
483+
};
484+
479485
struct Uniform {
480486
Arg ptr;
481487
int offset;

src/core/SkVMBlitter.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ namespace {
117117
skvm::I32 dx = p.uniform32(uniforms->base, offsetof(BlitterUniforms, right))
118118
- p.index(),
119119
dy = p.uniform32(uniforms->base, offsetof(BlitterUniforms, y));
120-
skvm::F32 x = to_f32(dx) + 0.5f,
121-
y = to_f32(dy) + 0.5f;
120+
skvm::Coord device = {to_f32(dx) + 0.5f,
121+
to_f32(dy) + 0.5f},
122+
local = device;
122123

123124
skvm::Color paint = {
124125
p.uniformF(uniforms->base, offsetof(BlitterUniforms, paint.fR)),
@@ -129,7 +130,7 @@ namespace {
129130

130131
uint64_t hash = 0;
131132
if (auto c = sb->program(&p,
132-
x,y, paint,
133+
device,local, paint,
133134
params.matrices, /*localM=*/nullptr,
134135
params.quality, params.dst,
135136
uniforms,alloc)) {
@@ -197,8 +198,9 @@ namespace {
197198
skvm::I32 dx = p->uniform32(uniforms->base, offsetof(BlitterUniforms, right))
198199
- p->index(),
199200
dy = p->uniform32(uniforms->base, offsetof(BlitterUniforms, y));
200-
skvm::F32 x = to_f32(dx) + 0.5f,
201-
y = to_f32(dy) + 0.5f;
201+
skvm::Coord device = {to_f32(dx) + 0.5f,
202+
to_f32(dy) + 0.5f},
203+
local = device;
202204

203205
skvm::Color paint = {
204206
p->uniformF(uniforms->base, offsetof(BlitterUniforms, paint.fR)),
@@ -207,7 +209,7 @@ namespace {
207209
p->uniformF(uniforms->base, offsetof(BlitterUniforms, paint.fA)),
208210
};
209211

210-
skvm::Color src = as_SB(params.shader)->program(p, x,y, paint,
212+
skvm::Color src = as_SB(params.shader)->program(p, device,local, paint,
211213
params.matrices, /*localM=*/nullptr,
212214
params.quality, params.dst,
213215
uniforms, alloc);
@@ -274,7 +276,7 @@ namespace {
274276
}
275277

276278
if (params.clip) {
277-
skvm::Color clip = as_SB(params.clip)->program(p, x,y, paint,
279+
skvm::Color clip = as_SB(params.clip)->program(p, device,local, paint,
278280
params.matrices, /*localM=*/nullptr,
279281
params.quality, params.dst,
280282
uniforms, alloc);
@@ -428,12 +430,13 @@ namespace {
428430

429431
bool isOpaque() const override { return fShader->isOpaque(); }
430432

431-
skvm::Color onProgram(skvm::Builder* p, skvm::F32 x, skvm::F32 y, skvm::Color paint,
433+
skvm::Color onProgram(skvm::Builder* p,
434+
skvm::Coord device, skvm::Coord local, skvm::Color paint,
432435
const SkMatrixProvider& matrices, const SkMatrix* localM,
433436
SkFilterQuality quality, const SkColorInfo& dst,
434437
skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const override {
435438
// Run our wrapped shader.
436-
skvm::Color c = as_SB(fShader)->program(p, x,y, paint,
439+
skvm::Color c = as_SB(fShader)->program(p, device,local, paint,
437440
matrices,localM, quality,dst, uniforms,alloc);
438441
if (!c) {
439442
return {};
@@ -467,8 +470,10 @@ namespace {
467470

468471
// See SkRasterPipeline dither stage.
469472
// This is 8x8 ordered dithering. From here we'll only need dx and dx^dy.
470-
skvm::I32 X = trunc(x - 0.5f),
471-
Y = X ^ trunc(y - 0.5f);
473+
SkASSERT(local.x.id == device.x.id);
474+
SkASSERT(local.y.id == device.y.id);
475+
skvm::I32 X = trunc(device.x - 0.5f),
476+
Y = X ^ trunc(device.y - 0.5f);
472477

473478
// If X's low bits are abc and Y's def, M is fcebda,
474479
// 6 bits producing all values [0,63] shuffled over an 8x8 grid.

src/core/SkVM_fwd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace skvm {
1616
struct I32;
1717
struct F32;
1818
struct Color;
19+
struct Coord;
1920
struct Uniforms;
2021
}
2122

src/shaders/SkColorFilterShader.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ bool SkColorFilterShader::onAppendStages(const SkStageRec& rec) const {
6262
}
6363

6464
skvm::Color SkColorFilterShader::onProgram(skvm::Builder* p,
65-
skvm::F32 x, skvm::F32 y, skvm::Color paint,
65+
skvm::Coord device, skvm::Coord local, skvm::Color paint,
6666
const SkMatrixProvider& matrices, const SkMatrix* localM,
6767
SkFilterQuality quality, const SkColorInfo& dst,
6868
skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const {
6969
// Run the shader.
70-
skvm::Color c = as_SB(fShader)->program(p, x,y, paint,
70+
skvm::Color c = as_SB(fShader)->program(p, device,local, paint,
7171
matrices,localM,
7272
quality,dst,
7373
uniforms,alloc);

src/shaders/SkColorFilterShader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class SkColorFilterShader : public SkShaderBase {
2626
void flatten(SkWriteBuffer&) const override;
2727
bool onAppendStages(const SkStageRec&) const override;
2828

29-
skvm::Color onProgram(skvm::Builder*, skvm::F32 x, skvm::F32 y, skvm::Color paint,
29+
skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint,
3030
const SkMatrixProvider&, const SkMatrix* localM,
3131
SkFilterQuality quality, const SkColorInfo& dst,
3232
skvm::Uniforms* uniforms, SkArenaAlloc*) const override;

src/shaders/SkColorShader.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,17 @@ bool SkColor4Shader::onAppendStages(const SkStageRec& rec) const {
9292
}
9393

9494
skvm::Color SkColorShader::onProgram(skvm::Builder* p,
95-
skvm::F32 /*x*/, skvm::F32 /*y*/, skvm::Color /*paint*/,
95+
skvm::Coord /*device*/, skvm::Coord /*local*/,
96+
skvm::Color /*paint*/,
9697
const SkMatrixProvider&, const SkMatrix* /*localM*/,
9798
SkFilterQuality /*quality*/, const SkColorInfo& dst,
9899
skvm::Uniforms* uniforms, SkArenaAlloc*) const {
99100
return p->uniformPremul(SkColor4f::FromColor(fColor), sk_srgb_singleton(),
100101
uniforms, dst.colorSpace());
101102
}
102103
skvm::Color SkColor4Shader::onProgram(skvm::Builder* p,
103-
skvm::F32 /*x*/, skvm::F32 /*y*/, skvm::Color /*paint*/,
104+
skvm::Coord /*device*/, skvm::Coord /*local*/,
105+
skvm::Color /*paint*/,
104106
const SkMatrixProvider&, const SkMatrix* /*localM*/,
105107
SkFilterQuality /*quality*/, const SkColorInfo& dst,
106108
skvm::Uniforms* uniforms, SkArenaAlloc*) const {

src/shaders/SkColorShader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class SkColorShader : public SkShaderBase {
4444

4545
bool onAppendStages(const SkStageRec&) const override;
4646

47-
skvm::Color onProgram(skvm::Builder*, skvm::F32 x, skvm::F32 y, skvm::Color paint,
47+
skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint,
4848
const SkMatrixProvider&, const SkMatrix* localM,
4949
SkFilterQuality quality, const SkColorInfo& dst,
5050
skvm::Uniforms* uniforms, SkArenaAlloc*) const override;
@@ -69,7 +69,7 @@ class SkColor4Shader : public SkShaderBase {
6969
void flatten(SkWriteBuffer&) const override;
7070
bool onAppendStages(const SkStageRec&) const override;
7171

72-
skvm::Color onProgram(skvm::Builder*, skvm::F32 x, skvm::F32 y, skvm::Color paint,
72+
skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint,
7373
const SkMatrixProvider&, const SkMatrix* localM,
7474
SkFilterQuality quality, const SkColorInfo& dst,
7575
skvm::Uniforms* uniforms, SkArenaAlloc*) const override;

src/shaders/SkComposeShader.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,14 @@ bool SkShader_Blend::onAppendStages(const SkStageRec& orig_rec) const {
127127
return true;
128128
}
129129

130-
skvm::Color SkShader_Blend::onProgram(skvm::Builder* p, skvm::F32 x, skvm::F32 y, skvm::Color paint,
131-
const SkMatrixProvider& matrices, const SkMatrix* localM,
130+
skvm::Color SkShader_Blend::onProgram(skvm::Builder* p,
131+
skvm::Coord device, skvm::Coord local, skvm::Color paint,
132+
const SkMatrixProvider& mats, const SkMatrix* localM,
132133
SkFilterQuality q, const SkColorInfo& dst,
133134
skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const {
134135
skvm::Color d,s;
135-
if ((d = as_SB(fDst)->program(p, x,y, paint, matrices,localM, q, dst, uniforms, alloc)) &&
136-
(s = as_SB(fSrc)->program(p, x,y, paint, matrices,localM, q, dst, uniforms, alloc)))
136+
if ((d = as_SB(fDst)->program(p, device,local, paint, mats,localM, q,dst, uniforms,alloc)) &&
137+
(s = as_SB(fSrc)->program(p, device,local, paint, mats,localM, q,dst, uniforms,alloc)))
137138
{
138139
return p->blend(fMode, s,d);
139140
}
@@ -167,13 +168,14 @@ bool SkShader_Lerp::onAppendStages(const SkStageRec& orig_rec) const {
167168
return true;
168169
}
169170

170-
skvm::Color SkShader_Lerp::onProgram(skvm::Builder* p, skvm::F32 x, skvm::F32 y, skvm::Color paint,
171-
const SkMatrixProvider& matrices, const SkMatrix* localM,
171+
skvm::Color SkShader_Lerp::onProgram(skvm::Builder* p,
172+
skvm::Coord device, skvm::Coord local, skvm::Color paint,
173+
const SkMatrixProvider& mats, const SkMatrix* localM,
172174
SkFilterQuality q, const SkColorInfo& dst,
173175
skvm::Uniforms* uniforms, SkArenaAlloc* alloc) const {
174176
skvm::Color d,s;
175-
if ((d = as_SB(fDst)->program(p, x,y, paint, matrices,localM, q, dst, uniforms, alloc)) &&
176-
(s = as_SB(fSrc)->program(p, x,y, paint, matrices,localM, q, dst, uniforms, alloc)))
177+
if ((d = as_SB(fDst)->program(p, device,local, paint, mats,localM, q,dst, uniforms,alloc)) &&
178+
(s = as_SB(fSrc)->program(p, device,local, paint, mats,localM, q,dst, uniforms,alloc)))
177179
{
178180
auto t = p->uniformF(uniforms->pushF(fWeight));
179181
return {

src/shaders/SkComposeShader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class SkShader_Blend final : public SkShaderBase {
2727
SkShader_Blend(SkReadBuffer&);
2828
void flatten(SkWriteBuffer&) const override;
2929
bool onAppendStages(const SkStageRec&) const override;
30-
skvm::Color onProgram(skvm::Builder*, skvm::F32 x, skvm::F32 y, skvm::Color paint,
30+
skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint,
3131
const SkMatrixProvider&, const SkMatrix* localM,
3232
SkFilterQuality, const SkColorInfo& dst,
3333
skvm::Uniforms*, SkArenaAlloc*) const override;
@@ -60,7 +60,7 @@ class SkShader_Lerp final : public SkShaderBase {
6060
SkShader_Lerp(SkReadBuffer&);
6161
void flatten(SkWriteBuffer&) const override;
6262
bool onAppendStages(const SkStageRec&) const override;
63-
skvm::Color onProgram(skvm::Builder*, skvm::F32 x, skvm::F32 y, skvm::Color paint,
63+
skvm::Color onProgram(skvm::Builder*, skvm::Coord device, skvm::Coord local, skvm::Color paint,
6464
const SkMatrixProvider&, const SkMatrix* localM,
6565
SkFilterQuality, const SkColorInfo& dst,
6666
skvm::Uniforms*, SkArenaAlloc*) const override;

0 commit comments

Comments
 (0)