make context() virtual on device

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1922123002

TBR=robertphilips

Review URL: https://codereview.chromium.org/1922123002
diff --git a/include/core/SkDevice.h b/include/core/SkDevice.h
index c8a1d5e..5301d1e 100644
--- a/include/core/SkDevice.h
+++ b/include/core/SkDevice.h
@@ -280,6 +280,8 @@
     */
     virtual const SkBitmap& onAccessBitmap() = 0;
 
+    virtual GrContext* context() const { return nullptr; }
+
 protected:
     virtual sk_sp<SkSurface> makeSurface(const SkImageInfo&, const SkSurfaceProps&);
     virtual bool onPeekPixels(SkPixmap*) { return false; }
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 3924260..9058492 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1863,18 +1863,8 @@
 }
 
 GrContext* SkCanvas::getGrContext() {
-#if SK_SUPPORT_GPU
     SkBaseDevice* device = this->getTopDevice();
-    if (device) {
-        GrRenderTarget* renderTarget = device->accessRenderTarget();
-        if (renderTarget) {
-            return renderTarget->getContext();
-        }
-    }
-#endif
-
-    return nullptr;
-
+    return device ? device->context() : nullptr;
 }
 
 void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner,
diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h
index 1923525..ca0488b 100644
--- a/src/gpu/SkGpuDevice.h
+++ b/src/gpu/SkGpuDevice.h
@@ -63,7 +63,7 @@
         return static_cast<SkGpuDevice*>(dev);
     }
 
-    GrContext* context() const { return fContext; }
+    GrContext* context() const override { return fContext; }
 
     // set all pixels to 0
     void clearAll();