Add support for using alternative backends (like DirectX) when creating a GrGpu.
authoregdaniel <egdaniel@google.com>
Thu, 26 Mar 2015 16:09:41 +0000 (09:09 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 26 Mar 2015 16:09:41 +0000 (09:09 -0700)
BUG=skia:

Review URL: https://codereview.chromium.org/1038643002

gyp/gpu.gypi
src/gpu/GrGpuFactory.cpp
src/gpu/GrGpuFactory.h [new file with mode: 0644]

index d7d16e0..98c9175 100644 (file)
       '<(skia_src_path)/gpu/GrGpuResourcePriv.h',
       '<(skia_src_path)/gpu/GrGpuResource.cpp',
       '<(skia_src_path)/gpu/GrGpuFactory.cpp',
+      '<(skia_src_path)/gpu/GrGpuFactory.h',
       '<(skia_src_path)/gpu/GrIndexBuffer.h',
       '<(skia_src_path)/gpu/GrInvariantOutput.cpp',
       '<(skia_src_path)/gpu/GrInOrderDrawBuffer.cpp',
index 4b09c14..74adf98 100644 (file)
@@ -7,37 +7,49 @@
  */
 
 
-#include "GrTypes.h"
+#include "GrGpuFactory.h"
 
 #include "gl/GrGLConfig.h"
 
 #include "GrGpu.h"
 #include "gl/GrGLGpu.h"
 
-GrGpu* GrGpu::Create(GrBackend backend, GrBackendContext backendContext, GrContext* context) {
-
+static GrGpu* gl_gpu_create(GrBackendContext backendContext, GrContext* context) {
     const GrGLInterface* glInterface = NULL;
     SkAutoTUnref<const GrGLInterface> glInterfaceUnref;
 
-    if (kOpenGL_GrBackend == backend) {
-        glInterface = reinterpret_cast<const GrGLInterface*>(backendContext);
-        if (NULL == glInterface) {
-            glInterface = GrGLDefaultInterface();
-            // By calling GrGLDefaultInterface we've taken a ref on the
-            // returned object. We only want to hold that ref until after
-            // the GrGpu is constructed and has taken ownership.
-            glInterfaceUnref.reset(glInterface);
-        }
-        if (NULL == glInterface) {
+    glInterface = reinterpret_cast<const GrGLInterface*>(backendContext);
+    if (NULL == glInterface) {
+        glInterface = GrGLDefaultInterface();
+        // By calling GrGLDefaultInterface we've taken a ref on the
+        // returned object. We only want to hold that ref until after
+        // the GrGpu is constructed and has taken ownership.
+        glInterfaceUnref.reset(glInterface);
+    }
+    if (NULL == glInterface) {
 #ifdef SK_DEBUG
-            SkDebugf("No GL interface provided!\n");
+        SkDebugf("No GL interface provided!\n");
 #endif
-            return NULL;
-        }
-        GrGLContext ctx(glInterface);
-        if (ctx.isInitialized()) {
-            return SkNEW_ARGS(GrGLGpu, (ctx, context));
-        }
+        return NULL;
+    }
+    GrGLContext ctx(glInterface);
+    if (ctx.isInitialized()) {
+        return SkNEW_ARGS(GrGLGpu, (ctx, context));
     }
     return NULL;
 }
+
+static const int kMaxNumBackends = 4;
+static CreateGpuProc gGpuFactories[kMaxNumBackends] = {gl_gpu_create, NULL, NULL, NULL};
+
+GrGpuFactoryRegistrar::GrGpuFactoryRegistrar(int i, CreateGpuProc proc) {
+    gGpuFactories[i] = proc;
+}
+
+GrGpu* GrGpu::Create(GrBackend backend, GrBackendContext backendContext, GrContext* context) {
+    SkASSERT((int)backend < kMaxNumBackends);
+    if (!gGpuFactories[backend]) {
+        return NULL;
+    }
+    return (gGpuFactories[backend])(backendContext, context);
+}
diff --git a/src/gpu/GrGpuFactory.h b/src/gpu/GrGpuFactory.h
new file mode 100644 (file)
index 0000000..180f264
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrGpuFactory_DEFINED
+#define GrGpuFactory_DEFINED
+
+#include "GrTypes.h"
+
+class GrGpu;
+class GrContext;
+
+typedef GrGpu* (*CreateGpuProc)(GrBackendContext, GrContext*);
+
+class GrGpuFactoryRegistrar {
+public:
+    GrGpuFactoryRegistrar(int i, CreateGpuProc proc);
+};
+
+#endif