diff options
author | robertphillips <robertphillips@google.com> | 2016-04-28 14:32:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-28 14:32:04 -0700 |
commit | 175dd9b5e3d7d749738dac743d2ac360b5340187 (patch) | |
tree | ff0ab4b2fb12c714a1723775d031220a68225d6d | |
parent | 801b44c45348144a483793e7b24f4d4092a4f74d (diff) |
Clean up test drawContext usage
The general idea is to provide access to SkGpuDevice's drawContext rather than its GrRenderTarget. That is usually what the testing framework actually wants.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1930623003
Review-Url: https://codereview.chromium.org/1930623003
-rw-r--r-- | gm/beziereffects.cpp | 54 | ||||
-rw-r--r-- | gm/bigrrectaaeffect.cpp | 12 | ||||
-rw-r--r-- | gm/constcolorprocessor.cpp | 16 | ||||
-rw-r--r-- | gm/convexpolyeffect.cpp | 17 | ||||
-rw-r--r-- | gm/imagefromyuvtextures.cpp | 5 | ||||
-rw-r--r-- | gm/rectangletexture.cpp | 5 | ||||
-rw-r--r-- | gm/rrects.cpp | 22 | ||||
-rw-r--r-- | gm/texdata.cpp | 177 | ||||
-rw-r--r-- | gm/texturedomaineffect.cpp | 14 | ||||
-rw-r--r-- | gm/yuvtorgbeffect.cpp | 16 | ||||
-rw-r--r-- | include/core/SkCanvas.h | 4 | ||||
-rw-r--r-- | include/core/SkDevice.h | 6 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 6 | ||||
-rw-r--r-- | src/core/SkMultiPictureDraw.cpp | 13 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 5 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 1 | ||||
-rw-r--r-- | tests/SurfaceTest.cpp | 9 | ||||
-rw-r--r-- | tools/VisualBench/WrappedBenchmark.h | 14 | ||||
-rw-r--r-- | tools/debugger/SkDebugCanvas.cpp | 9 |
19 files changed, 186 insertions, 219 deletions
diff --git a/gm/beziereffects.cpp b/gm/beziereffects.cpp index 015450895b..cfb84a5bcc 100644 --- a/gm/beziereffects.cpp +++ b/gm/beziereffects.cpp @@ -99,18 +99,14 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } - GrContext* context = rt->getContext(); - if (nullptr == context) { - return; - } - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); - if (!drawContext) { + GrContext* context = canvas->getGrContext(); + if (!context) { return; } @@ -125,8 +121,8 @@ protected: // Mult by 3 for each edge effect type int numCols = SkScalarCeilToInt(SkScalarSqrt(SkIntToScalar(kNumCubics*3))); int numRows = SkScalarCeilToInt(SkIntToScalar(kNumCubics*3) / numCols); - SkScalar w = SkIntToScalar(rt->width()) / numCols; - SkScalar h = SkIntToScalar(rt->height()) / numRows; + SkScalar w = SkIntToScalar(drawContext->width()) / numCols; + SkScalar h = SkIntToScalar(drawContext->height()) / numRows; int row = 0; int col = 0; static const GrColor color = 0xff000000; @@ -196,7 +192,7 @@ protected: GrPipelineBuilder pipelineBuilder; pipelineBuilder.setXPFactory( GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); SkAutoTUnref<GrDrawBatch> batch( new BezierCubicOrConicTestBatch(gp, bounds, color, klmEqs, klmSigns[c])); @@ -238,18 +234,14 @@ protected: void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } - GrContext* context = rt->getContext(); - if (nullptr == context) { - return; - } - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); - if (!drawContext) { + GrContext* context = canvas->getGrContext(); + if (!context) { return; } @@ -264,8 +256,8 @@ protected: // Mult by 3 for each edge effect type int numCols = SkScalarCeilToInt(SkScalarSqrt(SkIntToScalar(kNumConics*3))); int numRows = SkScalarCeilToInt(SkIntToScalar(kNumConics*3) / numCols); - SkScalar w = SkIntToScalar(rt->width()) / numCols; - SkScalar h = SkIntToScalar(rt->height()) / numRows; + SkScalar w = SkIntToScalar(drawContext->width()) / numCols; + SkScalar h = SkIntToScalar(drawContext->height()) / numRows; int row = 0; int col = 0; static const GrColor color = 0xff000000; @@ -333,7 +325,7 @@ protected: GrPipelineBuilder pipelineBuilder; pipelineBuilder.setXPFactory( GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); SkAutoTUnref<GrDrawBatch> batch( new BezierCubicOrConicTestBatch(gp, bounds, color, klmEqs, 1.f)); @@ -455,18 +447,14 @@ protected: void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } - GrContext* context = rt->getContext(); - if (nullptr == context) { - return; - } - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); - if (!drawContext) { + GrContext* context = canvas->getGrContext(); + if (!context) { return; } @@ -480,8 +468,8 @@ protected: int numCols = SkScalarCeilToInt(SkScalarSqrt(SkIntToScalar(kNumQuads*3))); int numRows = SkScalarCeilToInt(SkIntToScalar(kNumQuads*3) / numCols); - SkScalar w = SkIntToScalar(rt->width()) / numCols; - SkScalar h = SkIntToScalar(rt->height()) / numRows; + SkScalar w = SkIntToScalar(drawContext->width()) / numCols; + SkScalar h = SkIntToScalar(drawContext->height()) / numRows; int row = 0; int col = 0; static const GrColor color = 0xff000000; @@ -545,7 +533,7 @@ protected: GrPipelineBuilder pipelineBuilder; pipelineBuilder.setXPFactory( GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); GrPathUtils::QuadUVMatrix DevToUV(pts); diff --git a/gm/bigrrectaaeffect.cpp b/gm/bigrrectaaeffect.cpp index b852961826..b3f39a0f2d 100644 --- a/gm/bigrrectaaeffect.cpp +++ b/gm/bigrrectaaeffect.cpp @@ -49,15 +49,9 @@ protected: SkISize onISize() override { return SkISize::Make(fWidth, fHeight); } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - GrContext* context = rt ? rt->getContext() : nullptr; - if (!context) { - skiagm::GM::DrawGpuOnlyMessage(canvas); - return; - } - - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); if (!drawContext) { + skiagm::GM::DrawGpuOnlyMessage(canvas); return; } @@ -90,7 +84,7 @@ protected: SkASSERT(fp); if (fp) { pipelineBuilder.addCoverageFragmentProcessor(fp); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); SkRect bounds = testBounds; bounds.offset(SkIntToScalar(x), SkIntToScalar(y)); diff --git a/gm/constcolorprocessor.cpp b/gm/constcolorprocessor.cpp index cfc03398f6..4e0e68d2cb 100644 --- a/gm/constcolorprocessor.cpp +++ b/gm/constcolorprocessor.cpp @@ -47,18 +47,14 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { - return; - } - GrContext* context = rt->getContext(); - if (nullptr == context) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); - if (!drawContext) { + GrContext* context = canvas->getGrContext(); + if (!context) { return; } @@ -112,7 +108,9 @@ protected: SkAutoTUnref<GrFragmentProcessor> fp(GrConstColorProcessor::Create(color, mode)); GrClip clip; - GrPipelineBuilder pipelineBuilder(grPaint, rt, clip); + GrPipelineBuilder pipelineBuilder(grPaint, + drawContext->accessRenderTarget(), + clip); pipelineBuilder.addColorFragmentProcessor(fp); SkAutoTUnref<GrDrawBatch> batch( diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp index 0c4c94b3aa..5b278020f6 100644 --- a/gm/convexpolyeffect.cpp +++ b/gm/convexpolyeffect.cpp @@ -153,18 +153,9 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { - skiagm::GM::DrawGpuOnlyMessage(canvas); - return; - } - GrContext* context = rt->getContext(); - if (nullptr == context) { - return; - } - - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); if (!drawContext) { + skiagm::GM::DrawGpuOnlyMessage(canvas); return; } @@ -191,7 +182,7 @@ protected: pipelineBuilder.setXPFactory( GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); pipelineBuilder.addCoverageFragmentProcessor(fp); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); SkAutoTUnref<GrDrawBatch> batch(new PolyBoundsBatch(p.getBounds(), 0xff000000)); @@ -232,7 +223,7 @@ protected: pipelineBuilder.setXPFactory( GrPorterDuffXPFactory::Create(SkXfermode::kSrc_Mode))->unref(); pipelineBuilder.addCoverageFragmentProcessor(fp); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); SkAutoTUnref<GrDrawBatch> batch(new PolyBoundsBatch(rect, 0xff000000)); diff --git a/gm/imagefromyuvtextures.cpp b/gm/imagefromyuvtextures.cpp index c3184be1dd..a34ec6e513 100644 --- a/gm/imagefromyuvtextures.cpp +++ b/gm/imagefromyuvtextures.cpp @@ -123,9 +123,8 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - GrContext* context; - if (!rt || !(context = rt->getContext())) { + GrContext* context = canvas->getGrContext(); + if (!context) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } diff --git a/gm/rectangletexture.cpp b/gm/rectangletexture.cpp index 47390e2e19..099048754c 100644 --- a/gm/rectangletexture.cpp +++ b/gm/rectangletexture.cpp @@ -119,9 +119,8 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - GrContext* context; - if (!rt || !(context = rt->getContext())) { + GrContext *context = canvas->getGrContext(); + if (!context) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } diff --git a/gm/rrects.cpp b/gm/rrects.cpp index 57c11ada56..9f1c65d7e7 100644 --- a/gm/rrects.cpp +++ b/gm/rrects.cpp @@ -62,24 +62,8 @@ protected: SkISize onISize() override { return SkISize::Make(kImageWidth, kImageHeight); } void onDraw(SkCanvas* canvas) override { - GrContext* context = nullptr; -#if SK_SUPPORT_GPU - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - context = rt ? rt->getContext() : nullptr; - sk_sp<GrDrawContext> drawContext; - if (kEffect_Type == fType) { - if (!context) { - skiagm::GM::DrawGpuOnlyMessage(canvas); - return; - } - - drawContext = context->drawContext(sk_ref_sp(rt)); - if (!drawContext) { - return; - } - } -#endif - if (kEffect_Type == fType && nullptr == context) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (kEffect_Type == fType && !drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } @@ -128,7 +112,7 @@ protected: rrect)); if (fp) { pipelineBuilder.addCoverageFragmentProcessor(fp); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); SkRect bounds = rrect.getBounds(); bounds.outset(2.f, 2.f); diff --git a/gm/texdata.cpp b/gm/texdata.cpp index 20cad0c739..977947b0c6 100644 --- a/gm/texdata.cpp +++ b/gm/texdata.cpp @@ -19,100 +19,105 @@ static const int S = 200; DEF_SIMPLE_GM_BG(texdata, canvas, 2 * S, 2 * S, SK_ColorBLACK) { - GrRenderTarget* target = canvas->internal_private_accessTopLayerRenderTarget(); - GrContext* ctx = canvas->getGrContext(); - sk_sp<GrDrawContext> drawContext(ctx ? ctx->drawContext(sk_ref_sp(target)) : nullptr); - if (drawContext && target) { - SkAutoTArray<SkPMColor> gTextureData((2 * S) * (2 * S)); - static const int stride = 2 * S; - static const SkPMColor gray = SkPackARGB32(0x40, 0x40, 0x40, 0x40); - static const SkPMColor white = SkPackARGB32(0xff, 0xff, 0xff, 0xff); - static const SkPMColor red = SkPackARGB32(0x80, 0x80, 0x00, 0x00); - static const SkPMColor blue = SkPackARGB32(0x80, 0x00, 0x00, 0x80); - static const SkPMColor green = SkPackARGB32(0x80, 0x00, 0x80, 0x00); - static const SkPMColor black = SkPackARGB32(0x00, 0x00, 0x00, 0x00); - for (int i = 0; i < 2; ++i) { - int offset = 0; - // fill upper-left - for (int y = 0; y < S; ++y) { - for (int x = 0; x < S; ++x) { - gTextureData[offset + y * stride + x] = gray; - } - } - // fill upper-right - offset = S; - for (int y = 0; y < S; ++y) { - for (int x = 0; x < S; ++x) { - gTextureData[offset + y * stride + x] = white; - } - } - // fill lower left - offset = S * stride; - for (int y = 0; y < S; ++y) { - for (int x = 0; x < S; ++x) { - gTextureData[offset + y * stride + x] = black; - } - } - // fill lower right - offset = S * stride + S; - for (int y = 0; y < S; ++y) { - for (int x = 0; x < S; ++x) { - gTextureData[offset + y * stride + x] = gray; - } - } + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { + skiagm::GM::DrawGpuOnlyMessage(canvas); + return; + } - GrSurfaceDesc desc; - // use RT flag bit because in GL it makes the texture be bottom-up - desc.fFlags = i ? kRenderTarget_GrSurfaceFlag : - kNone_GrSurfaceFlags; - desc.fConfig = kSkia8888_GrPixelConfig; - desc.fWidth = 2 * S; - desc.fHeight = 2 * S; - GrTexture* texture = ctx->textureProvider()->createTexture( - desc, SkBudgeted::kNo, gTextureData.get(), 0); + GrContext* context = canvas->getGrContext(); + if (!context) { + return; + } - if (!texture) { - return; - } - SkAutoTUnref<GrTexture> au(texture); + SkAutoTArray<SkPMColor> gTextureData((2 * S) * (2 * S)); + static const int stride = 2 * S; + static const SkPMColor gray = SkPackARGB32(0x40, 0x40, 0x40, 0x40); + static const SkPMColor white = SkPackARGB32(0xff, 0xff, 0xff, 0xff); + static const SkPMColor red = SkPackARGB32(0x80, 0x80, 0x00, 0x00); + static const SkPMColor blue = SkPackARGB32(0x80, 0x00, 0x00, 0x80); + static const SkPMColor green = SkPackARGB32(0x80, 0x00, 0x80, 0x00); + static const SkPMColor black = SkPackARGB32(0x00, 0x00, 0x00, 0x00); + for (int i = 0; i < 2; ++i) { + int offset = 0; + // fill upper-left + for (int y = 0; y < S; ++y) { + for (int x = 0; x < S; ++x) { + gTextureData[offset + y * stride + x] = gray; + } + } + // fill upper-right + offset = S; + for (int y = 0; y < S; ++y) { + for (int x = 0; x < S; ++x) { + gTextureData[offset + y * stride + x] = white; + } + } + // fill lower left + offset = S * stride; + for (int y = 0; y < S; ++y) { + for (int x = 0; x < S; ++x) { + gTextureData[offset + y * stride + x] = black; + } + } + // fill lower right + offset = S * stride + S; + for (int y = 0; y < S; ++y) { + for (int x = 0; x < S; ++x) { + gTextureData[offset + y * stride + x] = gray; + } + } - // setup new clip - GrClip clip(SkRect::MakeWH(2*S, 2*S)); + GrSurfaceDesc desc; + // use RT flag bit because in GL it makes the texture be bottom-up + desc.fFlags = i ? kRenderTarget_GrSurfaceFlag : + kNone_GrSurfaceFlags; + desc.fConfig = kSkia8888_GrPixelConfig; + desc.fWidth = 2 * S; + desc.fHeight = 2 * S; + GrTexture* texture = context->textureProvider()->createTexture( + desc, SkBudgeted::kNo, gTextureData.get(), 0); - GrPaint paint; - paint.setPorterDuffXPFactory(SkXfermode::kSrcOver_Mode); + if (!texture) { + return; + } + SkAutoTUnref<GrTexture> au(texture); - SkMatrix vm; - if (i) { - vm.setRotate(90 * SK_Scalar1, - S * SK_Scalar1, - S * SK_Scalar1); - } else { - vm.reset(); - } - SkMatrix tm; - tm = vm; - tm.postIDiv(2*S, 2*S); - paint.addColorTextureProcessor(texture, tm); + // setup new clip + GrClip clip(SkRect::MakeWH(2*S, 2*S)); - drawContext->drawRect(clip, paint, vm, SkRect::MakeWH(2*S, 2*S)); + GrPaint paint; + paint.setPorterDuffXPFactory(SkXfermode::kSrcOver_Mode); - // now update the lower right of the texture in first pass - // or upper right in second pass - offset = 0; - for (int y = 0; y < S; ++y) { - for (int x = 0; x < S; ++x) { - gTextureData[offset + y * stride + x] = - ((x + y) % 2) ? (i ? green : red) : blue; - } - } - texture->writePixels(S, (i ? 0 : S), S, S, - texture->config(), gTextureData.get(), - 4 * stride); - drawContext->drawRect(clip, paint, vm, SkRect::MakeWH(2*S, 2*S)); - } + SkMatrix vm; + if (i) { + vm.setRotate(90 * SK_Scalar1, + S * SK_Scalar1, + S * SK_Scalar1); } else { - skiagm::GM::DrawGpuOnlyMessage(canvas); + vm.reset(); } + SkMatrix tm; + tm = vm; + tm.postIDiv(2*S, 2*S); + paint.addColorTextureProcessor(texture, tm); + + drawContext->drawRect(clip, paint, vm, SkRect::MakeWH(2*S, 2*S)); + + // now update the lower right of the texture in first pass + // or upper right in second pass + offset = 0; + for (int y = 0; y < S; ++y) { + for (int x = 0; x < S; ++x) { + gTextureData[offset + y * stride + x] = + ((x + y) % 2) ? (i ? green : red) : blue; + } + } + texture->writePixels(S, (i ? 0 : S), S, S, + texture->config(), gTextureData.get(), + 4 * stride); + drawContext->drawRect(clip, paint, vm, SkRect::MakeWH(2*S, 2*S)); + } } #endif + diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp index e4a02c15d9..6607488731 100644 --- a/gm/texturedomaineffect.cpp +++ b/gm/texturedomaineffect.cpp @@ -70,18 +70,14 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { - return; - } - GrContext* context = rt->getContext(); - if (nullptr == context) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); - if (!drawContext) { + GrContext* context = canvas->getGrContext(); + if (!context) { return; } @@ -128,7 +124,7 @@ protected: continue; } const SkMatrix viewMatrix = SkMatrix::MakeTrans(x, y); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); pipelineBuilder.addColorFragmentProcessor(fp); SkAutoTUnref<GrDrawBatch> batch( diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp index 09c61765fb..40a2f03f27 100644 --- a/gm/yuvtorgbeffect.cpp +++ b/gm/yuvtorgbeffect.cpp @@ -69,18 +69,14 @@ protected: } void onDraw(SkCanvas* canvas) override { - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (nullptr == rt) { - return; - } - GrContext* context = rt->getContext(); - if (nullptr == context) { + GrDrawContext* drawContext = canvas->internal_private_accessTopLayerDrawContext(); + if (!drawContext) { skiagm::GM::DrawGpuOnlyMessage(canvas); - return; + return; } - sk_sp<GrDrawContext> drawContext(context->drawContext(sk_ref_sp(rt))); - if (!drawContext) { + GrContext* context = canvas->getGrContext(); + if (!context) { return; } @@ -126,7 +122,7 @@ protected: if (fp) { SkMatrix viewMatrix; viewMatrix.setTranslate(x, y); - pipelineBuilder.setRenderTarget(rt); + pipelineBuilder.setRenderTarget(drawContext->accessRenderTarget()); pipelineBuilder.addColorFragmentProcessor(fp); SkAutoTUnref<GrDrawBatch> batch( GrRectBatchFactory::CreateNonAAFill(GrColor_WHITE, viewMatrix, diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h index 4853d35cef..b6d0cc704a 100644 --- a/include/core/SkCanvas.h +++ b/include/core/SkCanvas.h @@ -19,7 +19,7 @@ #include "SkXfermode.h" class GrContext; -class GrRenderTarget; +class GrDrawContext; class SkBaseDevice; class SkCanvasClipVisitor; class SkClipStack; @@ -1222,7 +1222,7 @@ public: /////////////////////////////////////////////////////////////////////////// // don't call - GrRenderTarget* internal_private_accessTopLayerRenderTarget(); + GrDrawContext* internal_private_accessTopLayerDrawContext(); // don't call static void Internal_Private_SetIgnoreSaveLayerBounds(bool); diff --git a/include/core/SkDevice.h b/include/core/SkDevice.h index 73c35c3341..e06650036d 100644 --- a/include/core/SkDevice.h +++ b/include/core/SkDevice.h @@ -106,8 +106,12 @@ public: /** * Return the device's associated gpu render target, or NULL. */ - virtual GrRenderTarget* accessRenderTarget() { return NULL; } + virtual GrRenderTarget* accessRenderTarget() { return nullptr; } + /** + * Don't call this! + */ + virtual GrDrawContext* accessDrawContext() { return nullptr; } /** * Return the device's origin: its offset in device coordinates from diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index c7a9dc72f2..f8b0a0ab0b 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1143,6 +1143,8 @@ static void draw_filter_into_device(SkBaseDevice* src, const SkImageFilter* filt SkBitmap srcBM; #if SK_SUPPORT_GPU + // TODO: remove this virtual usage of accessRenderTarget! It is preventing + // removal of the virtual on SkBaseDevice. GrRenderTarget* srcRT = src->accessRenderTarget(); if (srcRT && !srcRT->asTexture() && dst->accessRenderTarget()) { // When both the src & the dst are on the gpu but the src doesn't have a texture, @@ -1858,9 +1860,9 @@ const SkRegion& SkCanvas::internal_private_getTotalClip() const { return fMCRec->fRasterClip.forceGetBW(); } -GrRenderTarget* SkCanvas::internal_private_accessTopLayerRenderTarget() { +GrDrawContext* SkCanvas::internal_private_accessTopLayerDrawContext() { SkBaseDevice* dev = this->getTopDevice(); - return dev ? dev->accessRenderTarget() : nullptr; + return dev ? dev->accessDrawContext() : nullptr; } GrContext* SkCanvas::getGrContext() { diff --git a/src/core/SkMultiPictureDraw.cpp b/src/core/SkMultiPictureDraw.cpp index 09efba9377..26e446d2ad 100644 --- a/src/core/SkMultiPictureDraw.cpp +++ b/src/core/SkMultiPictureDraw.cpp @@ -16,6 +16,7 @@ #if SK_SUPPORT_GPU #include "GrContext.h" +#include "GrDrawContext.h" #include "GrLayerHoister.h" #include "GrRecordReplaceDraw.h" #include "GrRenderTarget.h" @@ -132,8 +133,8 @@ void SkMultiPictureDraw::draw(bool flush) { SkMatrix initialMatrix = data.fCanvas->getTotalMatrix(); initialMatrix.preConcat(data.fMatrix); - GrRenderTarget* rt = data.fCanvas->internal_private_accessTopLayerRenderTarget(); - SkASSERT(rt); + GrDrawContext* dc = data.fCanvas->internal_private_accessTopLayerDrawContext(); + SkASSERT(dc); // TODO: sorting the cacheable layers from smallest to largest // would improve the packing and reduce the number of swaps @@ -142,7 +143,7 @@ void SkMultiPictureDraw::draw(bool flush) { GrLayerHoister::FindLayersToAtlas(context, data.fPicture, initialMatrix, clipBounds, &atlasedNeedRendering, &atlasedRecycled, - rt->numColorSamples()); + dc->numColorSamples()); } } @@ -168,14 +169,14 @@ void SkMultiPictureDraw::draw(bool flush) { const SkMatrix initialMatrix = canvas->getTotalMatrix(); - GrRenderTarget* rt = data.fCanvas->internal_private_accessTopLayerRenderTarget(); - SkASSERT(rt); + GrDrawContext* dc = data.fCanvas->internal_private_accessTopLayerDrawContext(); + SkASSERT(dc); // Find the layers required by this canvas. It will return atlased // layers in the 'recycled' list since they have already been drawn. GrLayerHoister::FindLayersToHoist(context, picture, initialMatrix, clipBounds, &needRendering, &recycled, - rt->numColorSamples()); + dc->numColorSamples()); GrLayerHoister::DrawLayers(context, needRendering); diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 78b3cfc7d0..0e6eb92537 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -347,6 +347,11 @@ GrRenderTarget* SkGpuDevice::accessRenderTarget() { return fRenderTarget; } +GrDrawContext* SkGpuDevice::accessDrawContext() { + ASSERT_SINGLE_OWNER + return fDrawContext.get(); +} + void SkGpuDevice::clearAll() { ASSERT_SINGLE_OWNER GrColor color = 0; diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 49bf13c438..8420449a9a 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -71,6 +71,7 @@ public: void replaceRenderTarget(bool shouldRetainContent); GrRenderTarget* accessRenderTarget() override; + GrDrawContext* accessDrawContext() override; SkImageInfo imageInfo() const override { return fLegacyBitmap.info(); diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index ba66a2b3bb..878adeda3d 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -18,6 +18,7 @@ #if SK_SUPPORT_GPU #include "GrContext.h" +#include "GrDrawContext.h" #include "GrGpu.h" #endif @@ -413,8 +414,8 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(UniqueImageSnapshot_Gpu, reporter, ctxInfo) { }; auto surfaceBackingStore = [reporter](SkSurface* surface) { - GrRenderTarget* rt = - surface->getCanvas()->internal_private_accessTopLayerRenderTarget(); + GrDrawContext* dc = surface->getCanvas()->internal_private_accessTopLayerDrawContext(); + GrRenderTarget* rt = dc->accessRenderTarget(); if (!rt) { ERRORF(reporter, "Not render target backed."); return static_cast<intptr_t>(0); @@ -861,7 +862,9 @@ void test_surface_clear(skiatest::Reporter* reporter, sk_sp<SkSurface> surface, DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SurfaceClear_Gpu, reporter, ctxInfo) { GrContext* context = ctxInfo.fGrContext; std::function<GrSurface*(SkSurface*)> grSurfaceGetters[] = { - [] (SkSurface* s){ return s->getCanvas()->internal_private_accessTopLayerRenderTarget(); }, + [] (SkSurface* s){ + GrDrawContext* dc = s->getCanvas()->internal_private_accessTopLayerDrawContext(); + return dc->accessRenderTarget(); }, [] (SkSurface* s){ SkBaseDevice* d = s->getCanvas()->getDevice_just_for_deprecated_compatibility_testing(); diff --git a/tools/VisualBench/WrappedBenchmark.h b/tools/VisualBench/WrappedBenchmark.h index ddf601ddf8..8939fda319 100644 --- a/tools/VisualBench/WrappedBenchmark.h +++ b/tools/VisualBench/WrappedBenchmark.h @@ -11,6 +11,7 @@ #include "Benchmark.h" #include "SkSurface.h" #include "GrContext.h" +#include "GrDrawContext.h" #include "GrRenderTarget.h" // Wrap some other benchmark to allow specialization to either @@ -112,15 +113,18 @@ private: void onBlitToScreen(SkCanvas* canvas, int w, int h) override { // We call copySurface directly on the underlying GPU surfaces for a more efficient blit. - GrRenderTarget* dst = canvas->internal_private_accessTopLayerRenderTarget(); - SkASSERT(dst); + GrDrawContext* dstDC = canvas->internal_private_accessTopLayerDrawContext(); + SkASSERT(dstDC); - GrRenderTarget* src = fOffScreen->getCanvas()->internal_private_accessTopLayerRenderTarget(); + GrDrawContext* srcDC = + fOffScreen->getCanvas()->internal_private_accessTopLayerDrawContext(); + SkASSERT(srcDC); + GrRenderTarget* src = srcDC->accessRenderTarget(); SkASSERT(src); - SkASSERT(dst->getContext() == src->getContext()); + SkASSERT(canvas->getGrContext() == fOffScreen->getCanvas()->getGrContext()); - dst->getContext()->copySurface(dst, src, SkIRect::MakeWH(w, h), SkIPoint::Make(0, 0)); + dstDC->copySurface(src, SkIRect::MakeWH(w, h), SkIPoint::Make(0, 0)); } int fNumSamples; diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp index 8568029d38..5ee22eba3f 100644 --- a/tools/debugger/SkDebugCanvas.cpp +++ b/tools/debugger/SkDebugCanvas.cpp @@ -418,12 +418,9 @@ SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() { GrAuditTrail* SkDebugCanvas::getAuditTrail(SkCanvas* canvas) { GrAuditTrail* at = nullptr; #if SK_SUPPORT_GPU - GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); - if (rt) { - GrContext* ctx = rt->getContext(); - if (ctx) { - at = ctx->getAuditTrail(); - } + GrContext* ctx = canvas->getGrContext(); + if (ctx) { + at = ctx->getAuditTrail(); } #endif return at; |