aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-08-10 23:19:27 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-08-10 23:19:27 +0000
commit2db5600557ae990958d1fe329803617a9bd8b222 (patch)
tree2994247fd2267ef0f0e24e770ce40880ad701ca1
parent027a741852518a5b0c34ea40b875466e54719454 (diff)
parentcdab015e4485481aaa7a6a63412c715a4dffb925 (diff)
downloadskia-android13-qpr1-s4-release.tar.gz
Change-Id: I2e520e71f1a8700cad15c675b410c008b4f4f969
-rw-r--r--gm/runtimeshader.cpp47
-rw-r--r--src/core/SkRuntimeEffect.cpp5
2 files changed, 51 insertions, 1 deletions
diff --git a/gm/runtimeshader.cpp b/gm/runtimeshader.cpp
index 94b3e0d4c2..bd865ceabe 100644
--- a/gm/runtimeshader.cpp
+++ b/gm/runtimeshader.cpp
@@ -889,3 +889,50 @@ DEF_SIMPLE_GM(lit_shader_linear_rt, canvas, 512, 256) {
// Now draw the offscreen surface back to our original canvas:
canvas->drawImage(surface->makeImageSnapshot(), 0, 0);
}
+
+// skbug.com/13598 GPU was double applying the local matrix.
+DEF_SIMPLE_GM(local_matrix_shader_rt, canvas, 256, 256) {
+ SkString passthrough(R"(
+ uniform shader s;
+ half4 main(float2 p) { return s.eval(p); }
+ )");
+ auto [rte, error] = SkRuntimeEffect::MakeForShader(passthrough, {});
+ if (!rte) {
+ SkDebugf("%s\n", error.c_str());
+ return;
+ }
+
+ auto image = GetResourceAsImage("images/mandrill_128.png");
+ auto imgShader = image->makeShader(SkSamplingOptions{});
+
+ auto r = SkRect::MakeWH(image->width(), image->height());
+
+ auto lm = SkMatrix::RotateDeg(90.f, {image->width()/2.f, image->height()/2.f});
+
+ SkPaint paint;
+
+ // image
+ paint.setShader(imgShader);
+ canvas->drawRect(r, paint);
+
+ // passthrough(image)
+ canvas->save();
+ canvas->translate(image->width(), 0);
+ paint.setShader(rte->makeShader(nullptr, &imgShader, 1));
+ canvas->drawRect(r, paint);
+ canvas->restore();
+
+ // localmatrix(image)
+ canvas->save();
+ canvas->translate(0, image->height());
+ paint.setShader(imgShader->makeWithLocalMatrix(lm));
+ canvas->drawRect(r, paint);
+ canvas->restore();
+
+ // localmatrix(passthrough(image)) This was the bug.
+ canvas->save();
+ canvas->translate(image->width(), image->height());
+ paint.setShader(rte->makeShader(nullptr, &imgShader, 1)->makeWithLocalMatrix(lm));
+ canvas->drawRect(r, paint);
+ canvas->restore();
+}
diff --git a/src/core/SkRuntimeEffect.cpp b/src/core/SkRuntimeEffect.cpp
index 3e5543cad1..1c08fb84d4 100644
--- a/src/core/SkRuntimeEffect.cpp
+++ b/src/core/SkRuntimeEffect.cpp
@@ -1133,13 +1133,16 @@ public:
get_xformed_uniforms(fEffect.get(), fUniforms, args.fDstColorInfo->colorSpace());
SkASSERT(uniforms);
+ // We handle the pre-local matrix at this level so strip it out.
+ GrFPArgs fpArgs = args;
+ fpArgs.fPreLocalMatrix = nullptr;
auto [success, fp] = make_effect_fp(fEffect,
"runtime_shader",
std::move(uniforms),
/*inputFP=*/nullptr,
/*destColorFP=*/nullptr,
SkMakeSpan(fChildren),
- args);
+ fpArgs);
if (!success) {
return nullptr;
}