Remove GL-specific code from GMs and tests

TBR=bsalomon@google.com

Review URL: https://codereview.chromium.org/1232173002
diff --git a/bench/GLBench.cpp b/bench/GLBench.cpp
index b3bec74..0252c26 100644
--- a/bench/GLBench.cpp
+++ b/bench/GLBench.cpp
@@ -17,15 +17,13 @@
         return NULL;
     }
     GrContext* context = canvas->getGrContext();
-
-    GrTestTarget tt;
-    context->getTestTarget(&tt);
-    if (!tt.target()) {
-        SkDebugf("Couldn't get Gr test target.");
+    GrGpu* gpu = context->getGpu();
+    if (!gpu) {
+        SkDebugf("Couldn't get Gr gpu.");
         return NULL;
     }
 
-    const GrGLContext* ctx = tt.glContext();
+    const GrGLContext* ctx = gpu->glContextForTesting();
     if (!ctx) {
         SkDebugf("Couldn't get an interface\n");
         return NULL;
diff --git a/gm/imagefromyuvtextures.cpp b/gm/imagefromyuvtextures.cpp
index b39a4dc..dbed06f 100644
--- a/gm/imagefromyuvtextures.cpp
+++ b/gm/imagefromyuvtextures.cpp
@@ -13,8 +13,6 @@
 #if SK_SUPPORT_GPU
 
 #include "GrContext.h"
-#include "gl/GrGLInterface.h"
-#include "gl/GrGLUtil.h"
 #include "GrTest.h"
 #include "SkBitmap.h"
 #include "SkGradientShader.h"
@@ -96,54 +94,32 @@
         fRGBImage.reset(SkImage::NewRasterCopy(rgbBmp.info(), rgbColors, rgbBmp.rowBytes()));
     }
 
-    void createYUVTextures(GrContext* context, GrGLuint yuvIDs[3]) {
-        GrTestTarget tt;
-        context->getTestTarget(&tt);
-        if (!tt.target()) {
-            SkDEBUGFAIL("Couldn't get Gr test target.");
+    void createYUVTextures(GrContext* context, GrBackendObject yuvIDs[3]) {
+        const GrGpu* gpu = context->getGpu();
+        if (!gpu) {
             return;
         }
 
-        // We currently hav only implemented the texture uploads for GL.
-        const GrGLInterface* gl = tt.glContext()->interface();
-        if (!gl) {
-            return;
-        }
-
-        GR_GL_CALL(gl, GenTextures(3, yuvIDs));
-        GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE0));
-        GR_GL_CALL(gl, PixelStorei(GR_GL_UNPACK_ALIGNMENT, 1));
         for (int i = 0; i < 3; ++i) {
-            GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, yuvIDs[i]));
-            GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER,
-                                         GR_GL_NEAREST));
-            GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER,
-                                         GR_GL_NEAREST));
-            GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S,
-                                         GR_GL_CLAMP_TO_EDGE));
-            GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T,
-                                         GR_GL_CLAMP_TO_EDGE));
             SkASSERT(fYUVBmps[i].width() == SkToInt(fYUVBmps[i].rowBytes()));
-            GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RED, fYUVBmps[i].width(),
-                                      fYUVBmps[i].height(), 0, GR_GL_RED, GR_GL_UNSIGNED_BYTE,
-                                      fYUVBmps[i].getPixels()));
+            yuvIDs[i] = gpu->createBackendTexture(fYUVBmps[i].getPixels(),
+                                                  fYUVBmps[i].width(), fYUVBmps[i].height(),
+                                                  kAlpha_8_GrPixelConfig);
         }
         context->resetContext();
     }
 
-    void deleteYUVTextures(GrContext* context, const GrGLuint yuvIDs[3]) {
-        GrTestTarget tt;
-        context->getTestTarget(&tt);
-        if (!tt.target()) {
-            SkDEBUGFAIL("Couldn't get Gr test target.");
+    void deleteYUVTextures(GrContext* context, const GrBackendObject yuvIDs[3]) {
+
+        const GrGpu* gpu = context->getGpu();
+        if (!gpu) {
             return;
         }
 
-        const GrGLInterface* gl = tt.glContext()->interface();
-        if (!gl) {
-            return;
+        for (int i = 0; i < 3; ++i) {
+            gpu->deleteBackendTexture(yuvIDs[i]);
         }
-        GR_GL_CALL(gl, DeleteTextures(3, yuvIDs));
+
         context->resetContext();
     }
 
@@ -155,16 +131,11 @@
             return;
         }
 
-        GrGLuint yuvIDs[3];
+        GrBackendObject yuvIDs[3];
         this->createYUVTextures(context, yuvIDs);
 
         static const SkScalar kPad = 10.f;
 
-        GrBackendObject backendTextureObjects[] = {
-            static_cast<GrBackendObject>(yuvIDs[0]),
-            static_cast<GrBackendObject>(yuvIDs[1]),
-            static_cast<GrBackendObject>(yuvIDs[2])
-        };
         SkISize sizes[] = {
             { fYUVBmps[0].width(), fYUVBmps[0].height()},
             { fYUVBmps[1].width(), fYUVBmps[1].height()},
@@ -175,7 +146,7 @@
         for (int space = kJPEG_SkYUVColorSpace; space <= kLastEnum_SkYUVColorSpace; ++space) {
             images.push_back(SkImage::NewFromYUVTexturesCopy(context,
                                                              static_cast<SkYUVColorSpace>(space),
-                                                             backendTextureObjects, sizes,
+                                                             yuvIDs, sizes,
                                                              kTopLeft_GrSurfaceOrigin));
         }
         this->deleteYUVTextures(context, yuvIDs);
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 8d449b7..0ce6bea 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -362,10 +362,16 @@
     void saveActiveTraceMarkers();
     void restoreActiveTraceMarkers();
 
+    // creation and deletion of raw texture for testing
+    virtual GrBackendObject createBackendTexture(void* pixels, int w, int h,
+                                                 GrPixelConfig config) const = 0;
+    virtual bool isBackendTexture(GrBackendObject id) const = 0;
+    virtual void deleteBackendTexture(GrBackendObject id) const = 0;
+
     // Given a rt, find or create a stencil buffer and attach it
     bool attachStencilAttachmentToRenderTarget(GrRenderTarget* target);
 
-    // This is only to be used in tests.
+    // This is only to be used in GL-specific tests.
     virtual const GrGLContext* glContextForTesting() const { return NULL; }
 
 protected:
diff --git a/src/gpu/GrTest.cpp b/src/gpu/GrTest.cpp
index 3e1ef6c..5a3c014 100644
--- a/src/gpu/GrTest.cpp
+++ b/src/gpu/GrTest.cpp
@@ -13,12 +13,11 @@
 #include "GrResourceCache.h"
 #include "SkString.h"
 
-void GrTestTarget::init(GrContext* ctx, GrDrawTarget* target, const GrGLContext* gl) {
+void GrTestTarget::init(GrContext* ctx, GrDrawTarget* target) {
     SkASSERT(!fContext);
 
     fContext.reset(SkRef(ctx));
     fDrawTarget.reset(SkRef(target));
-    fGLContext.reset(SkRef(gl));
 }
 
 void GrContext::getTestTarget(GrTestTarget* tar) {
@@ -27,7 +26,7 @@
     // then disconnects. This would help prevent test writers from mixing using the returned
     // GrDrawTarget and regular drawing. We could also assert or fail in GrContext drawing methods
     // until ~GrTestTarget().
-    tar->init(this, fDrawingMgr.fDrawTarget, fGpu->glContextForTesting());
+    tar->init(this, fDrawingMgr.fDrawTarget);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -236,6 +235,11 @@
 
     void didRemoveGpuTraceMarker() override {}
 
+    GrBackendObject createBackendTexture(void* pixels, int w, int h,
+                                         GrPixelConfig config) const override { return 0; }
+    bool isBackendTexture(GrBackendObject id) const override { return false;  }
+    void deleteBackendTexture(GrBackendObject id) const override {}
+
     typedef GrGpu INHERITED;
 };
 
diff --git a/src/gpu/GrTest.h b/src/gpu/GrTest.h
index 7e2ffed..7b0d564 100644
--- a/src/gpu/GrTest.h
+++ b/src/gpu/GrTest.h
@@ -18,19 +18,15 @@
     GrContext. In the future this object may provide some guards to prevent this. */
 class GrTestTarget {
 public:
-    GrTestTarget() : fGLContext(NULL) {};
+    GrTestTarget() {};
 
-    void init(GrContext*, GrDrawTarget*, const GrGLContext*);
+    void init(GrContext*, GrDrawTarget*);
 
     GrDrawTarget* target() { return fDrawTarget.get(); }
 
-    /** Returns a GrGLContext if the GrContext is backed by OpenGL. */
-    const GrGLContext* glContext() { return fGLContext; }
-
 private:
     SkAutoTUnref<GrDrawTarget>              fDrawTarget;
     SkAutoTUnref<GrContext>                 fContext;
-    SkAutoTUnref<const GrGLContext>         fGLContext;
 };
 
 #endif
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 626a72f..e185ef0 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -2379,7 +2379,7 @@
                                 bool getSizedInternalFormat,
                                 GrGLenum* internalFormat,
                                 GrGLenum* externalFormat,
-                                GrGLenum* externalType) {
+                                GrGLenum* externalType) const {
     GrGLenum dontCare;
     if (NULL == internalFormat) {
         internalFormat = &dontCare;
@@ -3067,6 +3067,44 @@
     }
 }
 
+GrBackendObject GrGLGpu::createBackendTexture(void* pixels, int w, int h,
+                                              GrPixelConfig config) const {
+    GrGLuint texID;
+    GL_CALL(GenTextures(1, &texID));
+    GL_CALL(ActiveTexture(GR_GL_TEXTURE0));
+    GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, 1));
+    GL_CALL(BindTexture(GR_GL_TEXTURE_2D, texID));
+    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, GR_GL_NEAREST));
+    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, GR_GL_NEAREST));
+    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S, GR_GL_CLAMP_TO_EDGE));
+    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T, GR_GL_CLAMP_TO_EDGE));
+
+    GrGLenum internalFormat = 0x0; // suppress warning
+    GrGLenum externalFormat = 0x0; // suppress warning
+    GrGLenum externalType = 0x0;   // suppress warning
+
+    this->configToGLFormats(config, false, &internalFormat, &externalFormat, &externalType);
+
+    GL_CALL(TexImage2D(GR_GL_TEXTURE_2D, 0, internalFormat, w, h, 0, externalFormat,
+                       externalType, pixels));
+
+    return texID;
+}
+
+bool GrGLGpu::isBackendTexture(GrBackendObject id) const {
+    GrGLuint texID = (GrGLuint)id;
+
+    GrGLboolean result;
+    GL_CALL_RET(result, IsTexture(texID));
+
+    return (GR_GL_TRUE == result);
+}
+
+void GrGLGpu::deleteBackendTexture(GrBackendObject id) const {
+    GrGLuint texID = (GrGLuint)id;
+    GL_CALL(DeleteTextures(1, &texID));
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 GrGLAttribArrayState* GrGLGpu::HWGeometryState::bindArrayAndBuffersToDraw(
                                                 GrGLGpu* gpu,
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index e5cd7a9..368bda1 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -112,6 +112,11 @@
         return &this->glContext();
     }
 
+    GrBackendObject createBackendTexture(void* pixels, int w, int h,
+                                         GrPixelConfig config) const override;
+    bool isBackendTexture(GrBackendObject id) const override;
+    void deleteBackendTexture(GrBackendObject id) const override;
+
 private:
     GrGLGpu(GrGLContext* ctx, GrContext* context);
 
@@ -265,7 +270,7 @@
                            bool getSizedInternal,
                            GrGLenum* internalFormat,
                            GrGLenum* externalFormat,
-                           GrGLenum* externalType);
+                           GrGLenum* externalType) const;
     // helper for onCreateTexture and writeTexturePixels
     bool uploadTexData(const GrSurfaceDesc& desc,
                        bool isNewTexture,
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
index 07cd655..a870a08 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -12,7 +12,6 @@
 
 #include "GrContext.h"
 #include "GrContextFactory.h"
-#include "gl/GrGLInterface.h"
 #include "GrGpu.h"
 #include "GrGpuResourceCacheAccess.h"
 #include "GrGpuResourcePriv.h"
@@ -25,8 +24,6 @@
 #include "SkMessageBus.h"
 #include "SkSurface.h"
 #include "Test.h"
-#include "../src/gpu/gl/GrGLDefines.h"
-#include "../src/gpu/gl/GrGLUtil.h"
 
 static const int gWidth = 640;
 static const int gHeight = 480;
@@ -178,26 +175,18 @@
 }
 
 static void test_wrapped_resources(skiatest::Reporter* reporter, GrContext* context) {
-    GrTestTarget tt;
-    context->getTestTarget(&tt);
-
-    const GrGLInterface* gl = tt.glContext()->interface();
-    if (!gl) {
+    const GrGpu* gpu = context->getGpu();
+    if (!gpu) {
         return;
     }
 
-    GrGLuint texIDs[2];
+    GrBackendObject texIDs[2];
     static const int kW = 100;
     static const int kH = 100;
-    GR_GL_CALL(gl, GenTextures(2, texIDs));
-    GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE0));
-    GR_GL_CALL(gl, PixelStorei(GR_GL_UNPACK_ALIGNMENT, 1));
-    GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texIDs[0]));
-    GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA,
-                              GR_GL_UNSIGNED_BYTE, NULL));
-    GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texIDs[1]));
-    GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA,
-                              GR_GL_UNSIGNED_BYTE, NULL));
+
+    texIDs[0] = gpu->createBackendTexture(NULL, kW, kH, kRGBA_8888_GrPixelConfig);
+    texIDs[1] = gpu->createBackendTexture(NULL, kW, kH, kRGBA_8888_GrPixelConfig);
+
     context->resetContext();
 
     GrBackendTextureDesc desc;
@@ -223,15 +212,13 @@
 
     context->flush();
 
-    GrGLboolean borrowedIsAlive;
-    GrGLboolean adoptedIsAlive;
-    GR_GL_CALL_RET(gl, borrowedIsAlive, IsTexture(texIDs[0]));
-    GR_GL_CALL_RET(gl, adoptedIsAlive, IsTexture(texIDs[1]));
+    bool borrowedIsAlive = gpu->isBackendTexture(texIDs[0]);
+    bool adoptedIsAlive = gpu->isBackendTexture(texIDs[1]);
 
     REPORTER_ASSERT(reporter, borrowedIsAlive);
     REPORTER_ASSERT(reporter, !adoptedIsAlive);
 
-    GR_GL_CALL(gl, GenTextures(1, &texIDs[0]));
+    gpu->deleteBackendTexture(texIDs[0]);
 
     context->resetContext();
 }
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 57ad5e0..7e1b3c9 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -18,8 +18,6 @@
 #if SK_SUPPORT_GPU
 #include "GrContextFactory.h"
 #include "GrTest.h"
-#include "gl/GrGLInterface.h"
-#include "gl/GrGLUtil.h"
 #else
 class GrContextFactory;
 class GrContext;
@@ -107,42 +105,20 @@
         return;
     }
 
-    GrTestTarget tt;
-    ctx->getTestTarget(&tt);
-    if (!tt.target()) {
-        SkDEBUGFAIL("Couldn't get Gr test target.");
+    const GrGpu* gpu = ctx->getGpu();
+    if (!gpu) {
         return;
     }
 
-    // We currently have only implemented the texture uploads for GL.
-    const GrGLInterface* gl = tt.glContext()->interface();
-    if (!gl) {
-        return;
-    }
-
-    // Test the wrapped factory for SkSurface by creating a texture using GL and then wrap it in
+    // Test the wrapped factory for SkSurface by creating a backend texture and then wrap it in
     // a SkSurface.
-    GrGLuint texID;
     static const int kW = 100;
     static const int kH = 100;
     static const uint32_t kOrigColor = 0xFFAABBCC;
     SkAutoTArray<uint32_t> pixels(kW * kH);
     sk_memset32(pixels.get(), kOrigColor, kW * kH);
-    GR_GL_CALL(gl, GenTextures(1, &texID));
-    GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE0));
-    GR_GL_CALL(gl, PixelStorei(GR_GL_UNPACK_ALIGNMENT, 1));
-    GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texID));
-    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER,
-                                 GR_GL_NEAREST));
-    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER,
-                                 GR_GL_NEAREST));
-    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S,
-                                 GR_GL_CLAMP_TO_EDGE));
-    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T,
-                                 GR_GL_CLAMP_TO_EDGE));
-    GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA,
-                              GR_GL_UNSIGNED_BYTE,
-                              pixels.get()));
+    GrBackendObject texID = gpu->createBackendTexture(pixels.get(), kW, kH,
+                                                      kRGBA_8888_GrPixelConfig);
 
     GrBackendTextureDesc wrappedDesc;
     wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig;