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

Commit 5240e18

Browse files
brianosmanSkia Commit-Bot
authored andcommitted
SkRuntimeEffect: Handle different main() signatures on CPU
Bug: skia:10603 Change-Id: Ib4d2b36c09c30a9a112f5a2d2d7060c09009671b Reviewed-on: https://skia-review.googlesource.com/c/skia/+/309782 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
1 parent 089b7c9 commit 5240e18

File tree

3 files changed

+49
-33
lines changed

3 files changed

+49
-33
lines changed

gm/runtimecolorfilter.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include <stddef.h>
2121
#include <utility>
2222

23-
const char* SKSL_TEST_SRC = R"(
23+
const char* gLumaSrc = R"(
2424
void main(inout half4 color) {
2525
color.a = color.r*0.3 + color.g*0.6 + color.b*0.1;
2626
color.r = 0;
@@ -29,14 +29,24 @@ const char* SKSL_TEST_SRC = R"(
2929
}
3030
)";
3131

32-
DEF_SIMPLE_GM(runtimecolorfilter, canvas, 512, 256) {
32+
const char* gLumaSrcWithCoords = R"(
33+
void main(float2 p, inout half4 color) {
34+
color.a = color.r*0.3 + color.g*0.6 + color.b*0.1;
35+
color.r = 0;
36+
color.g = 0;
37+
color.b = 0;
38+
}
39+
)";
40+
41+
DEF_SIMPLE_GM(runtimecolorfilter, canvas, 256 * 3, 256) {
3342
auto img = GetResourceAsImage("images/mandrill_256.png");
3443
canvas->drawImage(img, 0, 0, nullptr);
3544

36-
sk_sp<SkRuntimeEffect> effect = std::get<0>(SkRuntimeEffect::Make(SkString(SKSL_TEST_SRC)));
37-
38-
auto cf1 = effect->makeColorFilter(nullptr);
39-
SkPaint p;
40-
p.setColorFilter(cf1);
41-
canvas->drawImage(img, 256, 0, &p);
45+
for (auto src : { gLumaSrc, gLumaSrcWithCoords }) {
46+
sk_sp<SkRuntimeEffect> effect = std::get<0>(SkRuntimeEffect::Make(SkString(src)));
47+
SkPaint p;
48+
p.setColorFilter(effect->makeColorFilter(nullptr));
49+
canvas->translate(256, 0);
50+
canvas->drawImage(img, 0, 0, &p);
51+
}
4252
}

gm/runtimeshader.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,11 @@ DEF_GM(return new ColorCubeRT;)
299299

300300
class DefaultColorRT : public RuntimeShaderGM {
301301
public:
302+
// This test also *explicitly* doesn't include coords in main's parameter list, to test that
303+
// runtime shaders work without them being declared (when they're not used).
302304
DefaultColorRT() : RuntimeShaderGM("default_color_rt", {512, 256}, R"(
303305
in shader input;
304-
void main(float2 xy, inout half4 color) {
306+
void main(inout half4 color) {
305307
color = sample(input);
306308
}
307309
)") {}

src/core/SkRuntimeEffect.cpp

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,28 @@ SkRuntimeEffect::ByteCodeResult SkRuntimeEffect::toByteCode() const {
336336

337337
using 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

592610
static 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

Comments
 (0)