aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2016-04-28 14:32:04 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-28 14:32:04 -0700
commit175dd9b5e3d7d749738dac743d2ac360b5340187 (patch)
treeff0ab4b2fb12c714a1723775d031220a68225d6d
parent801b44c45348144a483793e7b24f4d4092a4f74d (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.cpp54
-rw-r--r--gm/bigrrectaaeffect.cpp12
-rw-r--r--gm/constcolorprocessor.cpp16
-rw-r--r--gm/convexpolyeffect.cpp17
-rw-r--r--gm/imagefromyuvtextures.cpp5
-rw-r--r--gm/rectangletexture.cpp5
-rw-r--r--gm/rrects.cpp22
-rw-r--r--gm/texdata.cpp177
-rw-r--r--gm/texturedomaineffect.cpp14
-rw-r--r--gm/yuvtorgbeffect.cpp16
-rw-r--r--include/core/SkCanvas.h4
-rw-r--r--include/core/SkDevice.h6
-rw-r--r--src/core/SkCanvas.cpp6
-rw-r--r--src/core/SkMultiPictureDraw.cpp13
-rw-r--r--src/gpu/SkGpuDevice.cpp5
-rw-r--r--src/gpu/SkGpuDevice.h1
-rw-r--r--tests/SurfaceTest.cpp9
-rw-r--r--tools/VisualBench/WrappedBenchmark.h14
-rw-r--r--tools/debugger/SkDebugCanvas.cpp9
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;