diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-08-10 23:19:27 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-08-10 23:19:27 +0000 |
commit | 2db5600557ae990958d1fe329803617a9bd8b222 (patch) | |
tree | 2994247fd2267ef0f0e24e770ce40880ad701ca1 | |
parent | 027a741852518a5b0c34ea40b875466e54719454 (diff) | |
parent | cdab015e4485481aaa7a6a63412c715a4dffb925 (diff) | |
download | skia-2db5600557ae990958d1fe329803617a9bd8b222.tar.gz |
Snap for 8931212 from cdab015e4485481aaa7a6a63412c715a4dffb925 to tm-qpr1-releaseandroid-13.0.0_r30android-13.0.0_r29android-13.0.0_r28android-13.0.0_r27android-13.0.0_r24android-13.0.0_r23android-13.0.0_r22android-13.0.0_r21android-13.0.0_r20android-13.0.0_r19android-13.0.0_r18android-13.0.0_r17android-13.0.0_r16android13-qpr1-s8-releaseandroid13-qpr1-s7-releaseandroid13-qpr1-s6-releaseandroid13-qpr1-s5-releaseandroid13-qpr1-s4-releaseandroid13-qpr1-s3-releaseandroid13-qpr1-s2-releaseandroid13-qpr1-s1-releaseandroid13-qpr1-release
Change-Id: I2e520e71f1a8700cad15c675b410c008b4f4f969
-rw-r--r-- | gm/runtimeshader.cpp | 47 | ||||
-rw-r--r-- | src/core/SkRuntimeEffect.cpp | 5 |
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; } |