Explicit control in tools of ANGLE frontend and backend

Update the ANGLE test GL context, GrContextFactory, and config parsing to allow explicit control of ANGLE front/backend.

This will allow us to explicitly test ES2 vs ES3 interfaces to ANGLE as well as D3D9, D3D11, and OpenGL backends.

Also makes the angle api types valid in all builds (but will just fail when SK_ANGLE=1 or not on windows for the d3d backends).

BUG=skia:5804
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2381033002

CQ_INCLUDE_TRYBOTS=master.client.skia:Test-Win-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug-ANGLE-Trybot

Review-Url: https://codereview.chromium.org/2381033002
diff --git a/tools/flags/SkCommonFlagsConfig.cpp b/tools/flags/SkCommonFlagsConfig.cpp
index 3fd8a97..0e91140 100644
--- a/tools/flags/SkCommonFlagsConfig.cpp
+++ b/tools/flags/SkCommonFlagsConfig.cpp
@@ -17,10 +17,8 @@
 
 static const char defaultConfigs[] =
     "8888 gpu nonrendering"
-#if SK_ANGLE
-#ifdef SK_BUILD_FOR_WIN
-    " angle"
-#endif
+#if defined(SK_BUILD_FOR_WIN)
+    " angle_d3d11_es2"
 #endif
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
     " hwui"
@@ -33,50 +31,46 @@
     const char* options;
 } gPredefinedConfigs[] ={
 #if SK_SUPPORT_GPU
-    { "gpu",         "gpu", "" },
-    { "gl",          "gpu", "api=gl" },
-    { "msaa4",       "gpu", "samples=4" },
-    { "glmsaa4",     "gpu", "api=gl,samples=4" },
-    { "msaa16",      "gpu", "samples=16" },
-    { "nvpr4",       "gpu", "nvpr=true,samples=4" },
-    { "glnvpr4",     "gpu", "api=gl,nvpr=true,samples=4" },
-    { "nvpr16",      "gpu", "nvpr=true,samples=16" },
-    { "nvprdit4",    "gpu", "nvpr=true,samples=4,dit=true" },
-    { "glnvprdit4",  "gpu", "api=gl,nvpr=true,samples=4,dit=true" },
-    { "nvprdit16",   "gpu", "nvpr=true,samples=16,dit=true" },
-    { "glinst",      "gpu", "api=gl,inst=true" },
-    { "glinst4",     "gpu", "api=gl,inst=true,samples=4" },
-    { "glinstdit4",  "gpu", "api=gl,inst=true,samples=4,dit=true" },
-    { "glinst16",    "gpu", "api=gl,inst=true,samples=16" },
-    { "glinstdit16", "gpu", "api=gl,inst=true,samples=16,dit=true" },
-    { "esinst",      "gpu", "api=gles,inst=true" },
-    { "esinst4",     "gpu", "api=gles,inst=true,samples=4" },
-    { "esinstdit4",  "gpu", "api=gles,inst=true,samples=4,dit=true" },
-    { "gpuf16",      "gpu", "color=f16" },
-    { "gpusrgb",     "gpu", "color=srgb" },
-    { "glsrgb",      "gpu", "api=gl,color=srgb" },
-    { "glwide",      "gpu", "api=gl,color=f16_wide" },
-    { "gpudft",      "gpu", "dit=true" },
-    { "gpudebug",    "gpu", "api=debug" },
-    { "gpunull",     "gpu", "api=null" },
-    { "debug",       "gpu", "api=debug" },
-    { "nullgpu",     "gpu", "api=null" }
-#if SK_ANGLE
-#ifdef SK_BUILD_FOR_WIN
-    ,{ "angle",      "gpu", "api=angle" }
-#endif
-    ,{ "angle-gl",   "gpu", "api=angle-gl" }
-#endif
-    ,{ "commandbuffer", "gpu", "api=commandbuffer" }
+    { "gpu",             "gpu", "" },
+    { "gl",              "gpu", "api=gl" },
+    { "msaa4",           "gpu", "samples=4" },
+    { "glmsaa4",         "gpu", "api=gl,samples=4" },
+    { "msaa16",          "gpu", "samples=16" },
+    { "nvpr4",           "gpu", "nvpr=true,samples=4" },
+    { "glnvpr4",         "gpu", "api=gl,nvpr=true,samples=4" },
+    { "nvpr16",          "gpu", "nvpr=true,samples=16" },
+    { "nvprdit4",        "gpu", "nvpr=true,samples=4,dit=true" },
+    { "glnvprdit4",      "gpu", "api=gl,nvpr=true,samples=4,dit=true" },
+    { "nvprdit16",       "gpu", "nvpr=true,samples=16,dit=true" },
+    { "glinst",          "gpu", "api=gl,inst=true" },
+    { "glinst4",         "gpu", "api=gl,inst=true,samples=4" },
+    { "glinstdit4",      "gpu", "api=gl,inst=true,samples=4,dit=true" },
+    { "glinst16",        "gpu", "api=gl,inst=true,samples=16" },
+    { "glinstdit16",     "gpu", "api=gl,inst=true,samples=16,dit=true" },
+    { "esinst",          "gpu", "api=gles,inst=true" },
+    { "esinst4",         "gpu", "api=gles,inst=true,samples=4" },
+    { "esinstdit4",      "gpu", "api=gles,inst=true,samples=4,dit=true" },
+    { "gpuf16",          "gpu", "color=f16" },
+    { "gpusrgb",         "gpu", "color=srgb" },
+    { "glsrgb",          "gpu", "api=gl,color=srgb" },
+    { "glwide",          "gpu", "api=gl,color=f16_wide" },
+    { "gpudft",          "gpu", "dit=true" },
+    { "gpudebug",        "gpu", "api=debug" },
+    { "gpunull",         "gpu", "api=null" },
+    { "debug",           "gpu", "api=debug" },
+    { "nullgpu",         "gpu", "api=null" },
+    { "angle_d3d11_es2", "gpu", "api=angle_d3d11_es2" },
+    { "angle_gl_es2",    "gpu", "api=angle_gl_es2" },
+    { "commandbuffer",   "gpu", "api=commandbuffer" }
 #if SK_MESA
-    ,{ "mesa", "gpu", "api=mesa" }
+    ,{ "mesa",           "gpu", "api=mesa" }
 #endif
 #ifdef SK_VULKAN
-    ,{ "vk",       "gpu", "api=vulkan" }
-    ,{ "vksrgb",   "gpu", "api=vulkan,color=srgb" }
-    ,{ "vkwide",   "gpu", "api=vulkan,color=f16_wide" }
-    ,{ "vkmsaa4",  "gpu", "api=vulkan,samples=4" }
-    ,{ "vkmsaa16", "gpu", "api=vulkan,samples=16" }
+    ,{ "vk",             "gpu", "api=vulkan" }
+    ,{ "vksrgb",         "gpu", "api=vulkan,color=srgb" }
+    ,{ "vkwide",         "gpu", "api=vulkan,color=f16_wide" }
+    ,{ "vkmsaa4",        "gpu", "api=vulkan,samples=4" }
+    ,{ "vkmsaa16",       "gpu", "api=vulkan,samples=16" }
 #endif
 
 #else
@@ -115,12 +109,11 @@
     "\t\tgles  \t\t\tUse OpenGL ES.\n"
     "\t\tdebug \t\t\tUse debug OpenGL.\n"
     "\t\tnull  \t\t\tUse null OpenGL.\n"
-#if SK_ANGLE
-#ifdef SK_BUILD_FOR_WIN
-    "\t\tangle\t\t\tUse ANGLE DirectX.\n"
-#endif
-    "\t\tangle-gl\t\t\tUse ANGLE OpenGL.\n"
-#endif
+    "\t\tangle_d3d9_es2\t\t\tUse OpenGL ES2 on the ANGLE Direct3D9 backend.\n"
+    "\t\tangle_d3d11_es2\t\t\tUse OpenGL ES2 on the ANGLE Direct3D11 backend.\n"
+    "\t\tangle_d3d11_es3\t\t\tUse OpenGL ES3 on the ANGLE Direct3D11 backend.\n"
+    "\t\tangle_gl_es2\t\t\tUse OpenGL ES2 on the ANGLE OpenGL backend.\n"
+    "\t\tangle_gl_es3\t\t\tUse OpenGL ES3 on the ANGLE OpenGL backend.\n"
     "\t\tcommandbuffer\t\tUse command buffer.\n"
 #if SK_MESA
     "\t\tmesa\t\t\tUse MESA.\n"
@@ -234,18 +227,26 @@
         *outContextType = GrContextFactory::kNullGL_ContextType;
         return true;
     }
-#if SK_ANGLE
-#ifdef SK_BUILD_FOR_WIN
-    if (value.equals("angle")) {
-        *outContextType = GrContextFactory::kANGLE_ContextType;
+    if (value.equals("angle_d3d9_es2")) {
+        *outContextType = GrContextFactory::kANGLE_D3D9_ES2_ContextType;
         return true;
     }
-#endif
-    if (value.equals("angle-gl")) {
-        *outContextType = GrContextFactory::kANGLE_GL_ContextType;
+    if (value.equals("angle_d3d11_es2")) {
+        *outContextType = GrContextFactory::kANGLE_D3D11_ES2_ContextType;
         return true;
     }
-#endif
+    if (value.equals("angle_d3d11_es3")) {
+        *outContextType = GrContextFactory::kANGLE_D3D11_ES3_ContextType;
+        return true;
+    }
+    if (value.equals("angle_gl_es2")) {
+        *outContextType = GrContextFactory::kANGLE_GL_ES2_ContextType;
+        return true;
+    }
+    if (value.equals("angle_gl_es3")) {
+        *outContextType = GrContextFactory::kANGLE_GL_ES3_ContextType;
+        return true;
+    }
     if (value.equals("commandbuffer")) {
         *outContextType = GrContextFactory::kCommandBuffer_ContextType;
         return true;
@@ -407,13 +408,6 @@
                 simpleBackend = vias[vias.count() - 1];
                 vias.pop_back();
             }
-            // Note: no #if SK_ANGLE: this is a special rule in the via-tag grammar.
-            if (vias.count() && simpleBackend.equals("gl") &&
-                vias[vias.count() - 1].equals("angle")) {
-                simpleBackend = "angle-gl";
-                vias.pop_back();
-            }
-
             for (auto& predefinedConfig : gPredefinedConfigs) {
                 if (simpleBackend.equals(predefinedConfig.predefinedConfig)) {
                     extendedBackend = predefinedConfig.backend;
diff --git a/tools/flags/SkCommonFlagsConfig.h b/tools/flags/SkCommonFlagsConfig.h
index e817339..9abf4cb 100644
--- a/tools/flags/SkCommonFlagsConfig.h
+++ b/tools/flags/SkCommonFlagsConfig.h
@@ -24,7 +24,7 @@
 // The string has following form:
 // tag:
 //   [via-]*backend
-// where 'backend' consists of chars excluding hyphen or "angle-gl"
+// where 'backend' consists of chars excluding hyphen
 // and each 'via' consists of chars excluding hyphen.
 class SkCommandLineConfig {
   public:
diff --git a/tools/gpu/GrContextFactory.cpp b/tools/gpu/GrContextFactory.cpp
index 5e6494f..4f18994 100644
--- a/tools/gpu/GrContextFactory.cpp
+++ b/tools/gpu/GrContextFactory.cpp
@@ -117,13 +117,24 @@
                     glCtx = CreatePlatformGLTestContext(kGLES_GrGLStandard);
                     break;
 #if SK_ANGLE
-#   ifdef SK_BUILD_FOR_WIN
-                case kANGLE_ContextType:
-                    glCtx = CreateANGLEDirect3DGLTestContext();
+                case kANGLE_D3D9_ES2_ContextType:
+                    glCtx = CreateANGLETestContext(ANGLEBackend::kD3D9, ANGLEContextVersion::kES2);
                     break;
-#   endif
-                case kANGLE_GL_ContextType:
-                    glCtx = CreateANGLEOpenGLGLTestContext();
+                case kANGLE_D3D11_ES2_ContextType:
+                    glCtx = CreateANGLETestContext(ANGLEBackend::kD3D11,
+                                                   ANGLEContextVersion::kES2);
+                    break;
+                case kANGLE_D3D11_ES3_ContextType:
+                    glCtx = CreateANGLETestContext(ANGLEBackend::kD3D11,
+                                                   ANGLEContextVersion::kES3);
+                    break;
+                case kANGLE_GL_ES2_ContextType:
+                    glCtx = CreateANGLETestContext(ANGLEBackend::kOpenGL,
+                                                   ANGLEContextVersion::kES2);
+                    break;
+                case kANGLE_GL_ES3_ContextType:
+                    glCtx = CreateANGLETestContext(ANGLEBackend::kOpenGL,
+                                                   ANGLEContextVersion::kES3);
                     break;
 #endif
                 case kCommandBuffer_ContextType:
diff --git a/tools/gpu/GrContextFactory.h b/tools/gpu/GrContextFactory.h
index a822ac7..d6baffc 100644
--- a/tools/gpu/GrContextFactory.h
+++ b/tools/gpu/GrContextFactory.h
@@ -68,15 +68,18 @@
     // The availability of context types is subject to platform and build configuration
     // restrictions.
     enum ContextType {
-        kGL_ContextType,            //! OpenGL context.
-        kGLES_ContextType,          //! OpenGL ES context.
-        kANGLE_ContextType,         //! ANGLE on DirectX OpenGL ES context.
-        kANGLE_GL_ContextType,      //! ANGLE on OpenGL OpenGL ES context.
-        kCommandBuffer_ContextType, //! Chromium command buffer OpenGL ES context.
-        kMESA_ContextType,          //! MESA OpenGL context
-        kNullGL_ContextType,        //! Non-rendering OpenGL mock context.
-        kDebugGL_ContextType,       //! Non-rendering, state verifying OpenGL context.
-        kVulkan_ContextType,        //! Vulkan
+        kGL_ContextType,             //! OpenGL context.
+        kGLES_ContextType,           //! OpenGL ES context.
+        kANGLE_D3D9_ES2_ContextType, //! ANGLE on Direct3D9 OpenGL ES 2 context.
+        kANGLE_D3D11_ES2_ContextType,//! ANGLE on Direct3D11 OpenGL ES 2 context.
+        kANGLE_D3D11_ES3_ContextType,//! ANGLE on Direct3D11 OpenGL ES 3 context.
+        kANGLE_GL_ES2_ContextType,   //! ANGLE on OpenGL OpenGL ES 2 context.
+        kANGLE_GL_ES3_ContextType,   //! ANGLE on OpenGL OpenGL ES 3 context.
+        kCommandBuffer_ContextType,  //! Chromium command buffer OpenGL ES context.
+        kMESA_ContextType,           //! MESA OpenGL context
+        kNullGL_ContextType,         //! Non-rendering OpenGL mock context.
+        kDebugGL_ContextType,        //! Non-rendering, state verifying OpenGL context.
+        kVulkan_ContextType,         //! Vulkan
         kLastContextType = kVulkan_ContextType
     };
 
@@ -127,29 +130,6 @@
         }
     }
 
-    static const char* ContextTypeName(ContextType type) {
-        switch (type) {
-            case kGL_ContextType:
-                return "gl";
-            case kGLES_ContextType:
-                return "gles";
-            case kANGLE_ContextType:
-                return "angle";
-            case kANGLE_GL_ContextType:
-                return "angle-gl";
-            case kCommandBuffer_ContextType:
-                return "commandbuffer";
-            case kMESA_ContextType:
-                return "mesa";
-            case kNullGL_ContextType:
-                return "nullgl";
-            case kDebugGL_ContextType:
-                return "debuggl";
-            case kVulkan_ContextType:
-                return "vulkan";
-        }
-    }
-
     explicit GrContextFactory(const GrContextOptions& opts);
     GrContextFactory();
 
diff --git a/tools/gpu/gl/angle/GLTestContext_angle.cpp b/tools/gpu/gl/angle/GLTestContext_angle.cpp
index 8cc6f99..449e14c 100644
--- a/tools/gpu/gl/angle/GLTestContext_angle.cpp
+++ b/tools/gpu/gl/angle/GLTestContext_angle.cpp
@@ -26,6 +26,9 @@
 #define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE     0x3208
 #define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE    0x320D
 
+using sk_gpu_test::ANGLEBackend;
+using sk_gpu_test::ANGLEContextVersion;
+
 namespace {
 struct Libs {
     void* fGLLib;
@@ -45,7 +48,7 @@
     return eglGetProcAddress(name);
 }
 
-void* get_angle_egl_display(void* nativeDisplay, bool useGLBackend) {
+void* get_angle_egl_display(void* nativeDisplay, ANGLEBackend type) {
     PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
     eglGetPlatformDisplayEXT =
         (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
@@ -55,38 +58,25 @@
         return EGL_NO_DISPLAY;
     }
 
-    EGLDisplay display = EGL_NO_DISPLAY;
-    if (useGLBackend) {
-        EGLint attribs[3] = {
-            EGL_PLATFORM_ANGLE_TYPE_ANGLE,
-            EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
-            EGL_NONE
-        };
-        display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, nativeDisplay, attribs);
-    } else {
-        // Try for an ANGLE D3D11 context, fall back to D3D9.
-        EGLint attribs[3][3] = {
-            {
-                EGL_PLATFORM_ANGLE_TYPE_ANGLE,
-                EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
-                EGL_NONE
-            },
-            {
-                EGL_PLATFORM_ANGLE_TYPE_ANGLE,
-                EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,
-                EGL_NONE
-            },
-        };
-        for (int i = 0; i < 3 && display == EGL_NO_DISPLAY; ++i) {
-            display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE,nativeDisplay, attribs[i]);
-        }
+    EGLint typeNum = 0;
+    switch (type) {
+        case ANGLEBackend::kD3D9:
+            typeNum = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
+            break;
+        case ANGLEBackend::kD3D11:
+            typeNum = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
+            break;
+        case ANGLEBackend::kOpenGL:
+            typeNum = EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE;
+            break;
     }
-    return display;
+    const EGLint attribs[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE, typeNum, EGL_NONE };
+    return eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, nativeDisplay, attribs);
 }
 
 class ANGLEGLContext : public sk_gpu_test::GLTestContext {
 public:
-    ANGLEGLContext(bool preferGLBackend);
+    ANGLEGLContext(ANGLEBackend, ANGLEContextVersion);
     ~ANGLEGLContext() override;
 
     GrEGLImage texture2DToEGLImage(GrGLuint texID) const override;
@@ -101,16 +91,19 @@
     void onPlatformSwapBuffers() const override;
     GrGLFuncPtr onPlatformGetProcAddress(const char* name) const override;
 
-    void* fContext;
-    void* fDisplay;
-    void* fSurface;
-    bool  fIsGLBackend;
+    void*                       fContext;
+    void*                       fDisplay;
+    void*                       fSurface;
+    ANGLEBackend                fType;
+    ANGLEContextVersion         fVersion;
 };
 
-ANGLEGLContext::ANGLEGLContext(bool useGLBackend)
+ANGLEGLContext::ANGLEGLContext(ANGLEBackend type, ANGLEContextVersion version)
     : fContext(EGL_NO_CONTEXT)
     , fDisplay(EGL_NO_DISPLAY)
-    , fSurface(EGL_NO_SURFACE) {
+    , fSurface(EGL_NO_SURFACE)
+    , fType(type)
+    , fVersion(version) {
 
     EGLint numConfigs;
     static const EGLint configAttribs[] = {
@@ -123,8 +116,7 @@
         EGL_NONE
     };
 
-    fIsGLBackend = useGLBackend;
-    fDisplay = get_angle_egl_display(EGL_DEFAULT_DISPLAY, useGLBackend);
+    fDisplay = get_angle_egl_display(EGL_DEFAULT_DISPLAY, type);
     if (EGL_NO_DISPLAY == fDisplay) {
         SkDebugf("Could not create EGL display!");
         return;
@@ -137,8 +129,9 @@
     EGLConfig surfaceConfig;
     eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs);
 
-    static const EGLint contextAttribs[] = {
-        EGL_CONTEXT_CLIENT_VERSION, 2,
+    int versionNum = ANGLEContextVersion::kES2 == version ? 2 : 3;
+    const EGLint contextAttribs[] = {
+        EGL_CONTEXT_CLIENT_VERSION, versionNum,
         EGL_NONE
     };
     fContext = eglCreateContext(fDisplay, surfaceConfig, nullptr, contextAttribs);
@@ -224,13 +217,7 @@
 }
 
 sk_gpu_test::GLTestContext* ANGLEGLContext::createNew() const {
-#ifdef SK_BUILD_FOR_WIN
-    sk_gpu_test::GLTestContext* ctx = fIsGLBackend
-        ? sk_gpu_test::CreateANGLEOpenGLGLTestContext()
-        : sk_gpu_test::CreateANGLEDirect3DGLTestContext();
-#else
-    sk_gpu_test::GLTestContext* ctx = sk_gpu_test::CreateANGLEOpenGLGLTestContext();
-#endif
+    sk_gpu_test::GLTestContext* ctx = sk_gpu_test::CreateANGLETestContext(fType, fVersion);
     if (ctx) {
         ctx->makeCurrent();
     }
@@ -299,19 +286,9 @@
     return GrGLAssembleGLESInterface(&gLibs, angle_get_gl_proc);
 }
 
-#ifdef SK_BUILD_FOR_WIN
-GLTestContext* CreateANGLEDirect3DGLTestContext() {
-        ANGLEGLContext* ctx = new ANGLEGLContext(false);
-        if (!ctx->isValid()) {
-            delete ctx;
-            return NULL;
-        }
-        return ctx;
-    }
-#endif
-
-GLTestContext* CreateANGLEOpenGLGLTestContext() {
-    ANGLEGLContext* ctx = new ANGLEGLContext(true);
+GLTestContext* CreateANGLETestContext(ANGLEBackend type,
+                                      ANGLEContextVersion version) {
+    ANGLEGLContext* ctx = new ANGLEGLContext(type, version);
     if (!ctx->isValid()) {
         delete ctx;
         return NULL;
diff --git a/tools/gpu/gl/angle/GLTestContext_angle.h b/tools/gpu/gl/angle/GLTestContext_angle.h
index 0140477..0da747f 100644
--- a/tools/gpu/gl/angle/GLTestContext_angle.h
+++ b/tools/gpu/gl/angle/GLTestContext_angle.h
@@ -13,18 +13,24 @@
 namespace sk_gpu_test {
 
 /**
- * Creates a GrGLInterface for the currently ANGLE GL context currently bound in ANGLE's EGL
- * implementation.
+ * Creates a GrGLInterface for the current ANGLE GLES Context. Here current means bound in ANGLE's
+ * implementation of EGL.
  */
 const GrGLInterface* CreateANGLEGLInterface();
 
-#ifdef SK_BUILD_FOR_WIN
-/** Creates a GLTestContext backed by ANGLE's Direct3D backend. */
-GLTestContext* CreateANGLEDirect3DGLTestContext();
-#endif
+enum class ANGLEBackend {
+    kD3D9,
+    kD3D11,
+    kOpenGL
+};
 
-/** Creates a GLTestContext backed by ANGLE's OpenGL backend. */
-GLTestContext* CreateANGLEOpenGLGLTestContext();
+enum class ANGLEContextVersion {
+    kES2,
+    kES3
+};
+
+/** Creates a GLTestContext backed by ANGLE. */
+GLTestContext* CreateANGLETestContext(ANGLEBackend, ANGLEContextVersion);
 
 }  // namespace sk_gpu_test
 #endif