Simplify specification of default interface
authorbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 16 Sep 2011 18:51:57 +0000 (18:51 +0000)
committerbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 16 Sep 2011 18:51:57 +0000 (18:51 +0000)
Review URL: http://codereview.appspot.com/5036045/

git-svn-id: http://skia.googlecode.com/svn/trunk@2276 2bbb7eff-a529-9590-31e7-b0007b416f81

gpu/include/GrGLInterface.h
gpu/src/GrGLDefaultInterface_none.cpp
gpu/src/GrGLInterface.cpp
gpu/src/GrGpuFactory.cpp
gpu/src/android/GrGLDefaultInterface_android.cpp
gpu/src/ios/GrGLDefaultInterface_iOS.cpp
gpu/src/mac/GrGLDefaultInterface_mac.cpp
gpu/src/mesa/GrGLDefaultInterface_mesa.cpp
gpu/src/unix/GrGLDefaultInterface_unix.cpp
gpu/src/win/GrGLDefaultInterface_win.cpp
samplecode/SampleApp.cpp

index 3fd4fd996602d4907dede07097853b91ba03b786..37ea3c41443035071c19e3900c0654902bb7df25 100644 (file)
@@ -45,14 +45,14 @@ float gl_version_as_float(const GrGLInterface*);
  * passed to Create then the "default" GL interface is used. If the default is
  * also NULL GrContext creation will fail.
  *
- * The default interface is specified by calling GrGLSetDefaultInterface. If
- * this function hasn't been called or was last called with NULL then
- * GrGLInitializeDefaultGLInterface will be called to attempt to initialize it.
- * There are several implementations of this function provided. Each builds a
- * GrGLInterface for a specific platform and sets it as the default. There is
- * also an implementation that does nothing. You can link in any of the provided
- * implementations or your own implementation that sets up the GL function 
- * pointers for your specific platform.
+ * The default interface is returned by GrGLDefaultInterface. This function's
+ * implementation is platform-specifc. Several have been provided, along with an
+ * implementation that simply returns NULL. It is implementation-specific
+ * whether the same GrGLInterface is returned or whether a new one is created
+ * at each call. Some platforms may not be able to use a single GrGLInterface
+ * because extension function ptrs vary across contexts. Note that GrGLInterface
+ * is ref-counted. So if the same object is returned by multiple calls to 
+ * GrGLDefaultInterface, each should bump the ref count.
  *
  * By defining GR_GL_PER_GL_CALL_IFACE_CALLBACK to 1 the client can specify a
  * callback function that will be called prior to each GL function call. See
@@ -61,13 +61,7 @@ float gl_version_as_float(const GrGLInterface*);
 
 struct GrGLInterface;
 
-GR_API const GrGLInterface* GrGLGetDefaultGLInterface();
-// returns param so that you can unref it
-GR_API const GrGLInterface* GrGLSetDefaultGLInterface(const GrGLInterface* gl_interface);
-
-// If this is implemented it must allocate a GrGLInterface on the heap because
-// GrGLInterface subclasses SkRefCnt.
-void GrGLInitializeDefaultGLInterface();
+const GrGLInterface* GrGLDefaultInterface();
 
 typedef unsigned int GrGLenum;
 typedef unsigned char GrGLboolean;
index 93789075c2e56264f09b7c8862026f5e95655850..b6308e3b68289e0b4cb2ffda4f8636251da873fc 100644 (file)
@@ -7,5 +7,6 @@
  */
 
 
-void GrGLInitializeDefaultGLInterface() {
+const GrGLInterface* GrGLDefaultInterface() {
+    return NULL;
 }
index 38770f124dc514f27ce663e09d8f917b3c33ed32..4bbcfa55c0f3058859a659e21a29c5532b563500 100644 (file)
@@ -19,8 +19,6 @@ void GrGLDefaultInterfaceCallback(const GrGLInterface*) {}
 }
 #endif
 
-static SkAutoTUnref<const GrGLInterface> gDefaultGLInterface;
-
 void gl_version_from_string(int* major, int* minor,
                             const char* versionString) {
     if (NULL == versionString) {
@@ -89,19 +87,6 @@ bool has_gl_extension_from_string(const char* ext,
     return false;
 }
 
-GR_API const GrGLInterface* GrGLSetDefaultGLInterface(const GrGLInterface* gl_interface) {
-    gl_interface->ref();
-    gDefaultGLInterface.reset(gl_interface);
-    return gl_interface;
-}
-
-GR_API const GrGLInterface* GrGLGetDefaultGLInterface() {
-    if (NULL == gDefaultGLInterface.get()) {
-        GrGLInitializeDefaultGLInterface();
-    }
-    return gDefaultGLInterface.get();
-}
-
 bool has_gl_extension(const GrGLInterface* gl, const char* ext) {
     const GrGLubyte* glstr;
     GR_GL_CALL_RET(gl, glstr, GetString(GR_GL_EXTENSIONS));
index 071e67cecba43fa2272049ed13b6fdfc63d23e02..a7aa4d5a267aad6785605db7eae054a1b2dcc80a 100644 (file)
 GrGpu* GrGpu::Create(GrEngine engine, GrPlatform3DContext context3D) {
 
     const GrGLInterface* glInterface = NULL;
+    SkAutoTUnref<const GrGLInterface> glInterfaceUnref;
 
     if (kOpenGL_Shaders_GrEngine == engine ||
         kOpenGL_Fixed_GrEngine == engine) {
         glInterface = reinterpret_cast<const GrGLInterface*>(context3D);
         if (NULL == glInterface) {
-            glInterface = GrGLGetDefaultGLInterface();
+            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) {
 #if GR_DEBUG
index 269de977a2edd580359064c53f4a3bda01a69085..7de4bd1a650cf3c00644c364859d4234b21614a3 100644 (file)
 #include <GLES2/gl2.h>
 #include <GLES2/gl2ext.h>
 
-void GrGLInitializeDefaultGLInterface() {
-    GrGLInterface* glInterface = new GrGLInterface;
-
-    glInterface->fBindingsExported = kES2_GrGLBinding;
-    glInterface->fActiveTexture = glActiveTexture;
-    glInterface->fAttachShader = glAttachShader;
-    glInterface->fBindAttribLocation = glBindAttribLocation;
-    glInterface->fBindBuffer = glBindBuffer;
-    glInterface->fBindTexture = glBindTexture;
-    glInterface->fBlendColor = glBlendColor;
-    glInterface->fBlendFunc = glBlendFunc;
-    glInterface->fBufferData = glBufferData;
-    glInterface->fBufferSubData = glBufferSubData;
-    glInterface->fClear = glClear;
-    glInterface->fClearColor = glClearColor;
-    glInterface->fClearStencil = glClearStencil;
-    glInterface->fColorMask = glColorMask;
-    glInterface->fCompileShader = glCompileShader;
-    glInterface->fCompressedTexImage2D = glCompressedTexImage2D;
-    glInterface->fCreateProgram = glCreateProgram;
-    glInterface->fCreateShader = glCreateShader;
-    glInterface->fCullFace = glCullFace;
-    glInterface->fDeleteBuffers = glDeleteBuffers;
-    glInterface->fDeleteProgram = glDeleteProgram;
-    glInterface->fDeleteShader = glDeleteShader;
-    glInterface->fDeleteTextures = glDeleteTextures;
-    glInterface->fDepthMask = glDepthMask;
-    glInterface->fDisable = glDisable;
-    glInterface->fDisableVertexAttribArray = glDisableVertexAttribArray;
-    glInterface->fDrawArrays = glDrawArrays;
-    glInterface->fDrawElements = glDrawElements;
-    glInterface->fEnable = glEnable;
-    glInterface->fEnableVertexAttribArray = glEnableVertexAttribArray;
-    glInterface->fFrontFace = glFrontFace;
-    glInterface->fGenBuffers = glGenBuffers;
-    glInterface->fGenTextures = glGenTextures;
-    glInterface->fGetBufferParameteriv = glGetBufferParameteriv;
-    glInterface->fGetError = glGetError;
-    glInterface->fGetIntegerv = glGetIntegerv;
-    glInterface->fGetProgramInfoLog = glGetProgramInfoLog;
-    glInterface->fGetProgramiv = glGetProgramiv;
-    glInterface->fGetShaderInfoLog = glGetShaderInfoLog;
-    glInterface->fGetShaderiv = glGetShaderiv;
-    glInterface->fGetString = glGetString;
-    glInterface->fGetUniformLocation = glGetUniformLocation;
-    glInterface->fLineWidth = glLineWidth;
-    glInterface->fLinkProgram = glLinkProgram;
-    glInterface->fPixelStorei = glPixelStorei;
-    glInterface->fReadPixels = glReadPixels;
-    glInterface->fScissor = glScissor;
-    glInterface->fShaderSource = glShaderSource;
-    glInterface->fStencilFunc = glStencilFunc;
-    glInterface->fStencilFuncSeparate = glStencilFuncSeparate;
-    glInterface->fStencilMask = glStencilMask;
-    glInterface->fStencilMaskSeparate = glStencilMaskSeparate;
-    glInterface->fStencilOp = glStencilOp;
-    glInterface->fStencilOpSeparate = glStencilOpSeparate;
-    glInterface->fTexImage2D = glTexImage2D;
-    glInterface->fTexParameteri = glTexParameteri;
-    glInterface->fTexSubImage2D = glTexSubImage2D;
-    glInterface->fUniform1f = glUniform1f;
-    glInterface->fUniform1i = glUniform1i;
-    glInterface->fUniform1fv = glUniform1fv;
-    glInterface->fUniform1iv = glUniform1iv;
-    glInterface->fUniform2f = glUniform2f;
-    glInterface->fUniform2i = glUniform2i;
-    glInterface->fUniform2fv = glUniform2fv;
-    glInterface->fUniform2iv = glUniform2iv;
-    glInterface->fUniform3f = glUniform3f;
-    glInterface->fUniform3i = glUniform3i;
-    glInterface->fUniform3fv = glUniform3fv;
-    glInterface->fUniform3iv = glUniform3iv;
-    glInterface->fUniform4f = glUniform4f;
-    glInterface->fUniform4i = glUniform4i;
-    glInterface->fUniform4fv = glUniform4fv;
-    glInterface->fUniform4iv = glUniform4iv;
-    glInterface->fUniformMatrix2fv = glUniformMatrix2fv;
-    glInterface->fUniformMatrix3fv = glUniformMatrix3fv;
-    glInterface->fUniformMatrix4fv = glUniformMatrix4fv;
-    glInterface->fUseProgram = glUseProgram;
-    glInterface->fVertexAttrib4fv = glVertexAttrib4fv;
-    glInterface->fVertexAttribPointer = glVertexAttribPointer;
-    glInterface->fViewport = glViewport;
-    glInterface->fBindFramebuffer = glBindFramebuffer;
-    glInterface->fBindRenderbuffer = glBindRenderbuffer;
-    glInterface->fCheckFramebufferStatus = glCheckFramebufferStatus;
-    glInterface->fDeleteFramebuffers = glDeleteFramebuffers;
-    glInterface->fDeleteRenderbuffers = glDeleteRenderbuffers;
-    glInterface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
-    glInterface->fFramebufferTexture2D = glFramebufferTexture2D;
-    glInterface->fGenFramebuffers = glGenFramebuffers;
-    glInterface->fGenRenderbuffers = glGenRenderbuffers;
-    glInterface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
-    glInterface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
-    glInterface->fRenderbufferStorage = glRenderbufferStorage;
-#if GL_OES_mapbuffer
-    glInterface->fMapBuffer = glMapBufferOES;
-    glInterface->fUnmapBuffer = glUnmapBufferOES;
-#endif
-    GrGLSetDefaultGLInterface(glInterface)->unref();
+const GrGLInterface* GrGLDefaultInterface() {
+    static SkAutoTUnref<GrGLInterface> glInterface;
+    if (!glInterface.get()) {
+        GrGLInteface* interface = new GrGLInterface;
+        glInterface.reset(interface);
+        interface->fBindingsExported = kES2_GrGLBinding;
+        interface->fActiveTexture = glActiveTexture;
+        interface->fAttachShader = glAttachShader;
+        interface->fBindAttribLocation = glBindAttribLocation;
+        interface->fBindBuffer = glBindBuffer;
+        interface->fBindTexture = glBindTexture;
+        interface->fBlendColor = glBlendColor;
+        interface->fBlendFunc = glBlendFunc;
+        interface->fBufferData = glBufferData;
+        interface->fBufferSubData = glBufferSubData;
+        interface->fClear = glClear;
+        interface->fClearColor = glClearColor;
+        interface->fClearStencil = glClearStencil;
+        interface->fColorMask = glColorMask;
+        interface->fCompileShader = glCompileShader;
+        interface->fCompressedTexImage2D = glCompressedTexImage2D;
+        interface->fCreateProgram = glCreateProgram;
+        interface->fCreateShader = glCreateShader;
+        interface->fCullFace = glCullFace;
+        interface->fDeleteBuffers = glDeleteBuffers;
+        interface->fDeleteProgram = glDeleteProgram;
+        interface->fDeleteShader = glDeleteShader;
+        interface->fDeleteTextures = glDeleteTextures;
+        interface->fDepthMask = glDepthMask;
+        interface->fDisable = glDisable;
+        interface->fDisableVertexAttribArray = glDisableVertexAttribArray;
+        interface->fDrawArrays = glDrawArrays;
+        interface->fDrawElements = glDrawElements;
+        interface->fEnable = glEnable;
+        interface->fEnableVertexAttribArray = glEnableVertexAttribArray;
+        interface->fFrontFace = glFrontFace;
+        interface->fGenBuffers = glGenBuffers;
+        interface->fGenTextures = glGenTextures;
+        interface->fGetBufferParameteriv = glGetBufferParameteriv;
+        interface->fGetError = glGetError;
+        interface->fGetIntegerv = glGetIntegerv;
+        interface->fGetProgramInfoLog = glGetProgramInfoLog;
+        interface->fGetProgramiv = glGetProgramiv;
+        interface->fGetShaderInfoLog = glGetShaderInfoLog;
+        interface->fGetShaderiv = glGetShaderiv;
+        interface->fGetString = glGetString;
+        interface->fGetUniformLocation = glGetUniformLocation;
+        interface->fLineWidth = glLineWidth;
+        interface->fLinkProgram = glLinkProgram;
+        interface->fPixelStorei = glPixelStorei;
+        interface->fReadPixels = glReadPixels;
+        interface->fScissor = glScissor;
+        interface->fShaderSource = glShaderSource;
+        interface->fStencilFunc = glStencilFunc;
+        interface->fStencilFuncSeparate = glStencilFuncSeparate;
+        interface->fStencilMask = glStencilMask;
+        interface->fStencilMaskSeparate = glStencilMaskSeparate;
+        interface->fStencilOp = glStencilOp;
+        interface->fStencilOpSeparate = glStencilOpSeparate;
+        interface->fTexImage2D = glTexImage2D;
+        interface->fTexParameteri = glTexParameteri;
+        interface->fTexSubImage2D = glTexSubImage2D;
+        interface->fUniform1f = glUniform1f;
+        interface->fUniform1i = glUniform1i;
+        interface->fUniform1fv = glUniform1fv;
+        interface->fUniform1iv = glUniform1iv;
+        interface->fUniform2f = glUniform2f;
+        interface->fUniform2i = glUniform2i;
+        interface->fUniform2fv = glUniform2fv;
+        interface->fUniform2iv = glUniform2iv;
+        interface->fUniform3f = glUniform3f;
+        interface->fUniform3i = glUniform3i;
+        interface->fUniform3fv = glUniform3fv;
+        interface->fUniform3iv = glUniform3iv;
+        interface->fUniform4f = glUniform4f;
+        interface->fUniform4i = glUniform4i;
+        interface->fUniform4fv = glUniform4fv;
+        interface->fUniform4iv = glUniform4iv;
+        interface->fUniformMatrix2fv = glUniformMatrix2fv;
+        interface->fUniformMatrix3fv = glUniformMatrix3fv;
+        interface->fUniformMatrix4fv = glUniformMatrix4fv;
+        interface->fUseProgram = glUseProgram;
+        interface->fVertexAttrib4fv = glVertexAttrib4fv;
+        interface->fVertexAttribPointer = glVertexAttribPointer;
+        interface->fViewport = glViewport;
+        interface->fBindFramebuffer = glBindFramebuffer;
+        interface->fBindRenderbuffer = glBindRenderbuffer;
+        interface->fCheckFramebufferStatus = glCheckFramebufferStatus;
+        interface->fDeleteFramebuffers = glDeleteFramebuffers;
+        interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
+        interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
+        interface->fFramebufferTexture2D = glFramebufferTexture2D;
+        interface->fGenFramebuffers = glGenFramebuffers;
+        interface->fGenRenderbuffers = glGenRenderbuffers;
+        interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
+        interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
+        interface->fRenderbufferStorage = glRenderbufferStorage;
+    #if GL_OES_mapbuffer
+        interface->fMapBuffer = glMapBufferOES;
+        interface->fUnmapBuffer = glUnmapBufferOES;
+    #endif
+    }
+    glInterface.get()->ref();
+    return glInterface.get();
 }
index 8755299bbdd32e0592780f18b1c4c100d08b75e5..7be40db89ac015738dfdc169e452dd024180595c 100644 (file)
 #import <OpenGLES/ES2/gl.h>
 #import <OpenGLES/ES2/glext.h>
 
-void GrGLInitializeDefaultGLInterface() {
-    GrGLInterface* defaultInterface = new GrGLInterface();
+const GrGLInterface* GrGLDefaultInterface() {
+    static SkAutoTUnref<GrGLInterface> glInterface;
+    if (!glInterface.get()) {
+        GrGLInteface* interface = new GrGLInterface;
+        glInterface.reset(interface);
 
-    defaultInterface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-    defaultInterface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-    defaultInterface->fMinRenderTargetWidth = kProbe_GrGLCapability;
-    defaultInterface->fActiveTexture = glActiveTexture;
-    defaultInterface->fAttachShader = glAttachShader;
-    defaultInterface->fBindAttribLocation = glBindAttribLocation;
-    defaultInterface->fBindBuffer = glBindBuffer;
-    defaultInterface->fBindTexture = glBindTexture;
-    defaultInterface->fBlendColor = glBlendColor;
-    defaultInterface->fBlendFunc = glBlendFunc;
-    defaultInterface->fBufferData = (GrGLBufferDataProc)glBufferData;
-    defaultInterface->fBufferSubData = (GrGLBufferSubDataProc)glBufferSubData;
-    defaultInterface->fClear = glClear;
-    defaultInterface->fClearColor = glClearColor;
-    defaultInterface->fClearStencil = glClearStencil;
-    defaultInterface->fClientActiveTexture = glClientActiveTexture;
-    defaultInterface->fColorMask = glColorMask;
-    defaultInterface->fColorPointer = glColorPointer;
-    defaultInterface->fColor4ub = glColor4ub;
-    defaultInterface->fCompileShader = glCompileShader;
-    defaultInterface->fCompressedTexImage2D = glCompressedTexImage2D;
-    defaultInterface->fCreateProgram = glCreateProgram;
-    defaultInterface->fCreateShader = glCreateShader;
-    defaultInterface->fCullFace = glCullFace;
-    defaultInterface->fDeleteBuffers = glDeleteBuffers;
-    defaultInterface->fDeleteProgram = glDeleteProgram;
-    defaultInterface->fDeleteShader = glDeleteShader;
-    defaultInterface->fDeleteTextures = glDeleteTextures;
-    defaultInterface->fDepthMask = glDepthMask;
-    defaultInterface->fDisable = glDisable;
-    defaultInterface->fDisableClientState = glDisableClientState;
-    defaultInterface->fDisableVertexAttribArray =
-    glDisableVertexAttribArray;
-    defaultInterface->fDrawArrays = glDrawArrays;
-    defaultInterface->fDrawBuffer = NULL;
-    defaultInterface->fDrawBuffers = NULL;
-    defaultInterface->fDrawElements = glDrawElements;
-    defaultInterface->fEnable = glEnable;
-    defaultInterface->fEnableClientState = glEnableClientState;
-    defaultInterface->fEnableVertexAttribArray = glEnableVertexAttribArray;
-    defaultInterface->fFrontFace = glFrontFace;
-    defaultInterface->fGenBuffers = glGenBuffers;
-    defaultInterface->fGetBufferParameteriv = glGetBufferParameteriv;
-    defaultInterface->fGetError = glGetError;
-    defaultInterface->fGetIntegerv = glGetIntegerv;
-    defaultInterface->fGetProgramInfoLog = glGetProgramInfoLog;
-    defaultInterface->fGetProgramiv = glGetProgramiv;
-    defaultInterface->fGetShaderInfoLog = glGetShaderInfoLog;
-    defaultInterface->fGetShaderiv = glGetShaderiv;
-    defaultInterface->fGetString = glGetString;
-    defaultInterface->fGenTextures = glGenTextures;
-    defaultInterface->fGetUniformLocation = glGetUniformLocation;
-    defaultInterface->fLineWidth = glLineWidth;
-    defaultInterface->fLinkProgram = glLinkProgram;
-    defaultInterface->fLoadMatrixf = glLoadMatrixf;
-    defaultInterface->fMatrixMode = glMatrixMode;
-    defaultInterface->fPointSize = glPointSize;
-    defaultInterface->fPixelStorei = glPixelStorei;
-    defaultInterface->fReadBuffer = NULL;
-    defaultInterface->fReadPixels = glReadPixels;
-    defaultInterface->fScissor = glScissor;
-    defaultInterface->fShadeModel = glShadeModel;
-    defaultInterface->fShaderSource = glShaderSource;
-    defaultInterface->fStencilFunc = glStencilFunc;
-    defaultInterface->fStencilFuncSeparate = glStencilFuncSeparate;
-    defaultInterface->fStencilMask = glStencilMask;
-    defaultInterface->fStencilMaskSeparate = glStencilMaskSeparate;
-    defaultInterface->fStencilOp = glStencilOp;
-    defaultInterface->fStencilOpSeparate = glStencilOpSeparate;
-    defaultInterface->fTexCoordPointer = glTexCoordPointer;
-    defaultInterface->fTexEnvi = glTexEnvi;
-    // mac uses GLenum for internalFormat param (non-standard)
-    // amounts to int vs. uint.
-    defaultInterface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
-    defaultInterface->fTexParameteri = glTexParameteri;
-    defaultInterface->fTexSubImage2D = glTexSubImage2D;
-    defaultInterface->fUniform1f = glUniform1f;
-    defaultInterface->fUniform1i = glUniform1i;
-    defaultInterface->fUniform1fv = glUniform1fv;
-    defaultInterface->fUniform1iv = glUniform1iv;
-    defaultInterface->fUniform2f = glUniform2f;
-    defaultInterface->fUniform2i = glUniform2i;
-    defaultInterface->fUniform2fv = glUniform2fv;
-    defaultInterface->fUniform2iv = glUniform2iv;
-    defaultInterface->fUniform3f = glUniform3f;
-    defaultInterface->fUniform3i = glUniform3i;
-    defaultInterface->fUniform3fv = glUniform3fv;
-    defaultInterface->fUniform3iv = glUniform3iv;
-    defaultInterface->fUniform4f = glUniform4f;
-    defaultInterface->fUniform4i = glUniform4i;
-    defaultInterface->fUniform4fv = glUniform4fv;
-    defaultInterface->fUniform4iv = glUniform4iv;
-    defaultInterface->fUniform4fv = glUniform4fv;
-    defaultInterface->fUniformMatrix2fv = glUniformMatrix2fv;
-    defaultInterface->fUniformMatrix3fv = glUniformMatrix3fv;
-    defaultInterface->fUniformMatrix4fv = glUniformMatrix4fv;
-    defaultInterface->fUseProgram = glUseProgram;
-    defaultInterface->fVertexAttrib4fv = glVertexAttrib4fv;
-    defaultInterface->fVertexAttribPointer = glVertexAttribPointer;
-    defaultInterface->fVertexPointer = glVertexPointer;
-    defaultInterface->fViewport = glViewport;
-    defaultInterface->fGenFramebuffers = glGenFramebuffers;
-    defaultInterface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
-    defaultInterface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
-    defaultInterface->fBindFramebuffer = glBindFramebuffer;
-    defaultInterface->fFramebufferTexture2D = glFramebufferTexture2D;
-    defaultInterface->fCheckFramebufferStatus = glCheckFramebufferStatus;
-    defaultInterface->fDeleteFramebuffers = glDeleteFramebuffers;
-    defaultInterface->fRenderbufferStorage = glRenderbufferStorage;
-    defaultInterface->fGenRenderbuffers = glGenRenderbuffers;
-    defaultInterface->fDeleteRenderbuffers = glDeleteRenderbuffers;
-    defaultInterface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
-    defaultInterface->fBindRenderbuffer = glBindRenderbuffer;
+        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
+        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
+        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
+        interface->fActiveTexture = glActiveTexture;
+        interface->fAttachShader = glAttachShader;
+        interface->fBindAttribLocation = glBindAttribLocation;
+        interface->fBindBuffer = glBindBuffer;
+        interface->fBindTexture = glBindTexture;
+        interface->fBlendColor = glBlendColor;
+        interface->fBlendFunc = glBlendFunc;
+        interface->fBufferData = (GrGLBufferDataProc)glBufferData;
+        interface->fBufferSubData = (GrGLBufferSubDataProc)glBufferSubData;
+        interface->fClear = glClear;
+        interface->fClearColor = glClearColor;
+        interface->fClearStencil = glClearStencil;
+        interface->fClientActiveTexture = glClientActiveTexture;
+        interface->fColorMask = glColorMask;
+        interface->fColorPointer = glColorPointer;
+        interface->fColor4ub = glColor4ub;
+        interface->fCompileShader = glCompileShader;
+        interface->fCompressedTexImage2D = glCompressedTexImage2D;
+        interface->fCreateProgram = glCreateProgram;
+        interface->fCreateShader = glCreateShader;
+        interface->fCullFace = glCullFace;
+        interface->fDeleteBuffers = glDeleteBuffers;
+        interface->fDeleteProgram = glDeleteProgram;
+        interface->fDeleteShader = glDeleteShader;
+        interface->fDeleteTextures = glDeleteTextures;
+        interface->fDepthMask = glDepthMask;
+        interface->fDisable = glDisable;
+        interface->fDisableClientState = glDisableClientState;
+        interface->fDisableVertexAttribArray = glDisableVertexAttribArray;
+        interface->fDrawArrays = glDrawArrays;
+        interface->fDrawBuffer = NULL;
+        interface->fDrawBuffers = NULL;
+        interface->fDrawElements = glDrawElements;
+        interface->fEnable = glEnable;
+        interface->fEnableClientState = glEnableClientState;
+        interface->fEnableVertexAttribArray = glEnableVertexAttribArray;
+        interface->fFrontFace = glFrontFace;
+        interface->fGenBuffers = glGenBuffers;
+        interface->fGetBufferParameteriv = glGetBufferParameteriv;
+        interface->fGetError = glGetError;
+        interface->fGetIntegerv = glGetIntegerv;
+        interface->fGetProgramInfoLog = glGetProgramInfoLog;
+        interface->fGetProgramiv = glGetProgramiv;
+        interface->fGetShaderInfoLog = glGetShaderInfoLog;
+        interface->fGetShaderiv = glGetShaderiv;
+        interface->fGetString = glGetString;
+        interface->fGenTextures = glGenTextures;
+        interface->fGetUniformLocation = glGetUniformLocation;
+        interface->fLineWidth = glLineWidth;
+        interface->fLinkProgram = glLinkProgram;
+        interface->fLoadMatrixf = glLoadMatrixf;
+        interface->fMatrixMode = glMatrixMode;
+        interface->fPointSize = glPointSize;
+        interface->fPixelStorei = glPixelStorei;
+        interface->fReadBuffer = NULL;
+        interface->fReadPixels = glReadPixels;
+        interface->fScissor = glScissor;
+        interface->fShadeModel = glShadeModel;
+        interface->fShaderSource = glShaderSource;
+        interface->fStencilFunc = glStencilFunc;
+        interface->fStencilFuncSeparate = glStencilFuncSeparate;
+        interface->fStencilMask = glStencilMask;
+        interface->fStencilMaskSeparate = glStencilMaskSeparate;
+        interface->fStencilOp = glStencilOp;
+        interface->fStencilOpSeparate = glStencilOpSeparate;
+        interface->fTexCoordPointer = glTexCoordPointer;
+        interface->fTexEnvi = glTexEnvi;
+        // mac uses GLenum for internalFormat param (non-standard)
+        // amounts to int vs. uint.
+        interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
+        interface->fTexParameteri = glTexParameteri;
+        interface->fTexSubImage2D = glTexSubImage2D;
+        interface->fUniform1f = glUniform1f;
+        interface->fUniform1i = glUniform1i;
+        interface->fUniform1fv = glUniform1fv;
+        interface->fUniform1iv = glUniform1iv;
+        interface->fUniform2f = glUniform2f;
+        interface->fUniform2i = glUniform2i;
+        interface->fUniform2fv = glUniform2fv;
+        interface->fUniform2iv = glUniform2iv;
+        interface->fUniform3f = glUniform3f;
+        interface->fUniform3i = glUniform3i;
+        interface->fUniform3fv = glUniform3fv;
+        interface->fUniform3iv = glUniform3iv;
+        interface->fUniform4f = glUniform4f;
+        interface->fUniform4i = glUniform4i;
+        interface->fUniform4fv = glUniform4fv;
+        interface->fUniform4iv = glUniform4iv;
+        interface->fUniform4fv = glUniform4fv;
+        interface->fUniformMatrix2fv = glUniformMatrix2fv;
+        interface->fUniformMatrix3fv = glUniformMatrix3fv;
+        interface->fUniformMatrix4fv = glUniformMatrix4fv;
+        interface->fUseProgram = glUseProgram;
+        interface->fVertexAttrib4fv = glVertexAttrib4fv;
+        interface->fVertexAttribPointer = glVertexAttribPointer;
+        interface->fVertexPointer = glVertexPointer;
+        interface->fViewport = glViewport;
+        interface->fGenFramebuffers = glGenFramebuffers;
+        interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
+        interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
+        interface->fBindFramebuffer = glBindFramebuffer;
+        interface->fFramebufferTexture2D = glFramebufferTexture2D;
+        interface->fCheckFramebufferStatus = glCheckFramebufferStatus;
+        interface->fDeleteFramebuffers = glDeleteFramebuffers;
+        interface->fRenderbufferStorage = glRenderbufferStorage;
+        interface->fGenRenderbuffers = glGenRenderbuffers;
+        interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
+        interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
+        interface->fBindRenderbuffer = glBindRenderbuffer;
        
-#if GL_OES_mapbuffer
-    defaultInterface->fMapBuffer = glMapBufferOES;
-    defaultInterface->fUnmapBuffer = glUnmapBufferOES;
-#endif
+    #if GL_OES_mapbuffer
+        interface->fMapBuffer = glMapBufferOES;
+        interface->fUnmapBuffer = glUnmapBufferOES;
+    #endif
         
-#if GL_APPLE_framebuffer_multisample
-    defaultInterface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleAPPLE;
-    defaultInterface->fResolveMultisampleFramebuffer = glResolveMultisampleFramebufferAPPLE;
-#endif
-    defaultInterface->fBindFragDataLocationIndexed = NULL;
+    #if GL_APPLE_framebuffer_multisample
+        interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisampleAPPLE;
+        interface->fResolveMultisampleFramebuffer = glResolveMultisampleFramebufferAPPLE;
+    #endif
+        interface->fBindFragDataLocationIndexed = NULL;
         
-    defaultInterface->fBindingsExported = (GrGLBinding)(kES2_GrGLBinding | kES1_GrGLBinding);
-
-    GrGLSetDefaultGLInterface(defaultInterface)->unref();
-}
\ No newline at end of file
+        interface->fBindingsExported = (GrGLBinding)(kES2_GrGLBinding | kES1_GrGLBinding);
+    }
+    glInterface.get()->ref();
+    return glInterface.get();
+}
index 3901797be92c3824634403bd0f56f0cca571c4d3..26931ffd83f4adff15463668346664e16381af27 100644 (file)
 #include <OpenGL/gl.h>
 #include <OpenGL/glext.h>
 
-void GrGLInitializeDefaultGLInterface() {
-    GrGLInterface* defaultInterface = new GrGLInterface;
-    defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
-    defaultInterface->fActiveTexture = glActiveTexture;
-    defaultInterface->fAttachShader = glAttachShader;
-    defaultInterface->fBindAttribLocation = glBindAttribLocation;
-    defaultInterface->fBindBuffer = glBindBuffer;
-    defaultInterface->fBindTexture = glBindTexture;
-    defaultInterface->fBlendColor = glBlendColor;
-    defaultInterface->fBlendFunc = glBlendFunc;
-    defaultInterface->fBufferData = glBufferData;
-    defaultInterface->fBufferSubData = glBufferSubData;
-    defaultInterface->fClear = glClear;
-    defaultInterface->fClearColor = glClearColor;
-    defaultInterface->fClearStencil = glClearStencil;
-    defaultInterface->fClientActiveTexture = glClientActiveTexture;
-    defaultInterface->fColorMask = glColorMask;
-    defaultInterface->fColorPointer = glColorPointer;
-    defaultInterface->fColor4ub = glColor4ub;
-    defaultInterface->fCompileShader = glCompileShader;
-    defaultInterface->fCompressedTexImage2D = glCompressedTexImage2D;
-    defaultInterface->fCreateProgram = glCreateProgram;
-    defaultInterface->fCreateShader = glCreateShader;
-    defaultInterface->fCullFace = glCullFace;
-    defaultInterface->fDeleteBuffers = glDeleteBuffers;
-    defaultInterface->fDeleteProgram = glDeleteProgram;
-    defaultInterface->fDeleteShader = glDeleteShader;
-    defaultInterface->fDeleteTextures = glDeleteTextures;
-    defaultInterface->fDepthMask = glDepthMask;
-    defaultInterface->fDisable = glDisable;
-    defaultInterface->fDisableClientState = glDisableClientState;
-    defaultInterface->fDisableVertexAttribArray = 
-                                        glDisableVertexAttribArray;
-    defaultInterface->fDrawArrays = glDrawArrays;
-    defaultInterface->fDrawBuffer = glDrawBuffer;
-    defaultInterface->fDrawBuffers = glDrawBuffers;
-    defaultInterface->fDrawElements = glDrawElements;
-    defaultInterface->fEnable = glEnable;
-    defaultInterface->fEnableClientState = glEnableClientState;
-    defaultInterface->fEnableVertexAttribArray = glEnableVertexAttribArray;
-    defaultInterface->fFrontFace = glFrontFace;
-    defaultInterface->fGenBuffers = glGenBuffers;
-    defaultInterface->fGetBufferParameteriv = glGetBufferParameteriv;
-    defaultInterface->fGetError = glGetError;
-    defaultInterface->fGetIntegerv = glGetIntegerv;
-    defaultInterface->fGetProgramInfoLog = glGetProgramInfoLog;
-    defaultInterface->fGetProgramiv = glGetProgramiv;
-    defaultInterface->fGetShaderInfoLog = glGetShaderInfoLog;
-    defaultInterface->fGetShaderiv = glGetShaderiv;
-    defaultInterface->fGetString = glGetString;
-    defaultInterface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
-    defaultInterface->fGenTextures = glGenTextures;
-    defaultInterface->fGetUniformLocation = glGetUniformLocation;
-    defaultInterface->fLineWidth = glLineWidth;
-    defaultInterface->fLinkProgram = glLinkProgram;
-    defaultInterface->fLoadMatrixf = glLoadMatrixf;
-    defaultInterface->fMapBuffer = glMapBuffer;
-    defaultInterface->fMatrixMode = glMatrixMode;
-    defaultInterface->fPointSize = glPointSize;
-    defaultInterface->fPixelStorei = glPixelStorei;
-    defaultInterface->fReadBuffer = glReadBuffer;
-    defaultInterface->fReadPixels = glReadPixels;
-    defaultInterface->fScissor = glScissor;
-    defaultInterface->fShadeModel = glShadeModel;
-    defaultInterface->fShaderSource = glShaderSource;
-    defaultInterface->fStencilFunc = glStencilFunc;
-    defaultInterface->fStencilFuncSeparate = glStencilFuncSeparate;
-    defaultInterface->fStencilMask = glStencilMask;
-    defaultInterface->fStencilMaskSeparate = glStencilMaskSeparate;
-    defaultInterface->fStencilOp = glStencilOp;
-    defaultInterface->fStencilOpSeparate = glStencilOpSeparate;
-    defaultInterface->fTexCoordPointer = glTexCoordPointer;
-    defaultInterface->fTexEnvi = glTexEnvi;
-    // mac uses GLenum for internalFormat param (non-standard)
-    // amounts to int vs. uint.
-    defaultInterface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
-    defaultInterface->fTexParameteri = glTexParameteri;
-    defaultInterface->fTexSubImage2D = glTexSubImage2D;
-    defaultInterface->fUniform1f = glUniform1f;
-    defaultInterface->fUniform1i = glUniform1i;
-    defaultInterface->fUniform1fv = glUniform1fv;
-    defaultInterface->fUniform1iv = glUniform1iv;
-    defaultInterface->fUniform2f = glUniform2f;
-    defaultInterface->fUniform2i = glUniform2i;
-    defaultInterface->fUniform2fv = glUniform2fv;
-    defaultInterface->fUniform2iv = glUniform2iv;
-    defaultInterface->fUniform3f = glUniform3f;
-    defaultInterface->fUniform3i = glUniform3i;
-    defaultInterface->fUniform3fv = glUniform3fv;
-    defaultInterface->fUniform3iv = glUniform3iv;
-    defaultInterface->fUniform4f = glUniform4f;
-    defaultInterface->fUniform4i = glUniform4i;
-    defaultInterface->fUniform4fv = glUniform4fv;
-    defaultInterface->fUniform4iv = glUniform4iv;
-    defaultInterface->fUniform4fv = glUniform4fv;
-    defaultInterface->fUniformMatrix2fv = glUniformMatrix2fv;
-    defaultInterface->fUniformMatrix3fv = glUniformMatrix3fv;
-    defaultInterface->fUniformMatrix4fv = glUniformMatrix4fv;
-    defaultInterface->fUnmapBuffer = glUnmapBuffer;
-    defaultInterface->fUseProgram = glUseProgram;
-    defaultInterface->fVertexAttrib4fv = glVertexAttrib4fv;
-    defaultInterface->fVertexAttribPointer = glVertexAttribPointer;
-    defaultInterface->fVertexPointer = glVertexPointer;
-    defaultInterface->fViewport = glViewport;
+const GrGLInterface* GrGLDefaultInterface() {
+    static SkAutoTUnref<GrGLInterface> glInterface;
+    if (!glInterface.get()) {
+        GrGLInterface* interface = new GrGLInterface;
+        glInterface.reset(interface);
+        interface->fBindingsExported = kDesktop_GrGLBinding;
+        interface->fActiveTexture = glActiveTexture;
+        interface->fAttachShader = glAttachShader;
+        interface->fBindAttribLocation = glBindAttribLocation;
+        interface->fBindBuffer = glBindBuffer;
+        interface->fBindTexture = glBindTexture;
+        interface->fBlendColor = glBlendColor;
+        interface->fBlendFunc = glBlendFunc;
+        interface->fBufferData = glBufferData;
+        interface->fBufferSubData = glBufferSubData;
+        interface->fClear = glClear;
+        interface->fClearColor = glClearColor;
+        interface->fClearStencil = glClearStencil;
+        interface->fClientActiveTexture = glClientActiveTexture;
+        interface->fColorMask = glColorMask;
+        interface->fColorPointer = glColorPointer;
+        interface->fColor4ub = glColor4ub;
+        interface->fCompileShader = glCompileShader;
+        interface->fCompressedTexImage2D = glCompressedTexImage2D;
+        interface->fCreateProgram = glCreateProgram;
+        interface->fCreateShader = glCreateShader;
+        interface->fCullFace = glCullFace;
+        interface->fDeleteBuffers = glDeleteBuffers;
+        interface->fDeleteProgram = glDeleteProgram;
+        interface->fDeleteShader = glDeleteShader;
+        interface->fDeleteTextures = glDeleteTextures;
+        interface->fDepthMask = glDepthMask;
+        interface->fDisable = glDisable;
+        interface->fDisableClientState = glDisableClientState;
+        interface->fDisableVertexAttribArray = 
+                                            glDisableVertexAttribArray;
+        interface->fDrawArrays = glDrawArrays;
+        interface->fDrawBuffer = glDrawBuffer;
+        interface->fDrawBuffers = glDrawBuffers;
+        interface->fDrawElements = glDrawElements;
+        interface->fEnable = glEnable;
+        interface->fEnableClientState = glEnableClientState;
+        interface->fEnableVertexAttribArray = glEnableVertexAttribArray;
+        interface->fFrontFace = glFrontFace;
+        interface->fGenBuffers = glGenBuffers;
+        interface->fGetBufferParameteriv = glGetBufferParameteriv;
+        interface->fGetError = glGetError;
+        interface->fGetIntegerv = glGetIntegerv;
+        interface->fGetProgramInfoLog = glGetProgramInfoLog;
+        interface->fGetProgramiv = glGetProgramiv;
+        interface->fGetShaderInfoLog = glGetShaderInfoLog;
+        interface->fGetShaderiv = glGetShaderiv;
+        interface->fGetString = glGetString;
+        interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
+        interface->fGenTextures = glGenTextures;
+        interface->fGetUniformLocation = glGetUniformLocation;
+        interface->fLineWidth = glLineWidth;
+        interface->fLinkProgram = glLinkProgram;
+        interface->fLoadMatrixf = glLoadMatrixf;
+        interface->fMapBuffer = glMapBuffer;
+        interface->fMatrixMode = glMatrixMode;
+        interface->fPointSize = glPointSize;
+        interface->fPixelStorei = glPixelStorei;
+        interface->fReadBuffer = glReadBuffer;
+        interface->fReadPixels = glReadPixels;
+        interface->fScissor = glScissor;
+        interface->fShadeModel = glShadeModel;
+        interface->fShaderSource = glShaderSource;
+        interface->fStencilFunc = glStencilFunc;
+        interface->fStencilFuncSeparate = glStencilFuncSeparate;
+        interface->fStencilMask = glStencilMask;
+        interface->fStencilMaskSeparate = glStencilMaskSeparate;
+        interface->fStencilOp = glStencilOp;
+        interface->fStencilOpSeparate = glStencilOpSeparate;
+        interface->fTexCoordPointer = glTexCoordPointer;
+        interface->fTexEnvi = glTexEnvi;
+        // mac uses GLenum for internalFormat param (non-standard)
+        // amounts to int vs. uint.
+        interface->fTexImage2D = (GrGLTexImage2DProc)glTexImage2D;
+        interface->fTexParameteri = glTexParameteri;
+        interface->fTexSubImage2D = glTexSubImage2D;
+        interface->fUniform1f = glUniform1f;
+        interface->fUniform1i = glUniform1i;
+        interface->fUniform1fv = glUniform1fv;
+        interface->fUniform1iv = glUniform1iv;
+        interface->fUniform2f = glUniform2f;
+        interface->fUniform2i = glUniform2i;
+        interface->fUniform2fv = glUniform2fv;
+        interface->fUniform2iv = glUniform2iv;
+        interface->fUniform3f = glUniform3f;
+        interface->fUniform3i = glUniform3i;
+        interface->fUniform3fv = glUniform3fv;
+        interface->fUniform3iv = glUniform3iv;
+        interface->fUniform4f = glUniform4f;
+        interface->fUniform4i = glUniform4i;
+        interface->fUniform4fv = glUniform4fv;
+        interface->fUniform4iv = glUniform4iv;
+        interface->fUniform4fv = glUniform4fv;
+        interface->fUniformMatrix2fv = glUniformMatrix2fv;
+        interface->fUniformMatrix3fv = glUniformMatrix3fv;
+        interface->fUniformMatrix4fv = glUniformMatrix4fv;
+        interface->fUnmapBuffer = glUnmapBuffer;
+        interface->fUseProgram = glUseProgram;
+        interface->fVertexAttrib4fv = glVertexAttrib4fv;
+        interface->fVertexAttribPointer = glVertexAttribPointer;
+        interface->fVertexPointer = glVertexPointer;
+        interface->fViewport = glViewport;
 
-#if GL_ARB_framebuffer_object
-    defaultInterface->fGenFramebuffers = glGenFramebuffers;
-    defaultInterface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
-    defaultInterface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
-    defaultInterface->fBindFramebuffer = glBindFramebuffer;
-    defaultInterface->fFramebufferTexture2D = glFramebufferTexture2D;
-    defaultInterface->fCheckFramebufferStatus = glCheckFramebufferStatus;
-    defaultInterface->fDeleteFramebuffers = glDeleteFramebuffers;
-    defaultInterface->fRenderbufferStorage = glRenderbufferStorage;
-    defaultInterface->fGenRenderbuffers = glGenRenderbuffers;
-    defaultInterface->fDeleteRenderbuffers = glDeleteRenderbuffers;
-    defaultInterface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
-    defaultInterface->fBindRenderbuffer = glBindRenderbuffer;
-    defaultInterface->fRenderbufferStorageMultisample = 
-                                    glRenderbufferStorageMultisample;
-    defaultInterface->fBlitFramebuffer = glBlitFramebuffer;
-#elif GL_EXT_framebuffer_object
-    defaultInterface->fGenFramebuffers = glGenFramebuffersEXT;
-    defaultInterface->fGetFramebufferAttachmentivParameter = glGetFramebufferAttachmentParameterivEXT;
-    defaultInterface->fGLGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
-    defaultInterface->fBindFramebuffer = glBindFramebufferEXT;
-    defaultInterface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
-    defaultInterface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
-    defaultInterface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
-    defaultInterface->fRenderbufferStorage = glRenderbufferStorageEXT;
-    defaultInterface->fGenRenderbuffers = glGenRenderbuffersEXT;
-    defaultInterface->fDeleteRenderbuffers = glDeleteRenderbuffers;
-    defaultInterface->fFramebufferRenderbuffer = 
-                                            glFramebufferRenderbufferEXT;
-    defaultInterface->fBindRenderbuffer = glBindRenderbufferEXT;
-#if GL_EXT_framebuffer_multisample
-    defaultInterface->fRenderbufferStorageMultisample = 
-                                        glRenderbufferStorageMultisampleEXT;
-#endif
-#if GL_EXT_framebuffer_blit
-    defaultInterface->fBlitFramebuffer = glBlitFramebufferEXT;
-#endif
-#endif
-    defaultInterface->fBindFragDataLocationIndexed = NULL;
+    #if GL_ARB_framebuffer_object
+        interface->fGenFramebuffers = glGenFramebuffers;
+        interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv;
+        interface->fGetRenderbufferParameteriv = glGetRenderbufferParameteriv;
+        interface->fBindFramebuffer = glBindFramebuffer;
+        interface->fFramebufferTexture2D = glFramebufferTexture2D;
+        interface->fCheckFramebufferStatus = glCheckFramebufferStatus;
+        interface->fDeleteFramebuffers = glDeleteFramebuffers;
+        interface->fRenderbufferStorage = glRenderbufferStorage;
+        interface->fGenRenderbuffers = glGenRenderbuffers;
+        interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
+        interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer;
+        interface->fBindRenderbuffer = glBindRenderbuffer;
+        interface->fRenderbufferStorageMultisample = 
+                                        glRenderbufferStorageMultisample;
+        interface->fBlitFramebuffer = glBlitFramebuffer;
+    #elif GL_EXT_framebuffer_object
+        interface->fGenFramebuffers = glGenFramebuffersEXT;
+        interface->fGetFramebufferAttachmentivParameter = glGetFramebufferAttachmentParameterivEXT;
+        interface->fGLGetRenderbufferParameteriv = glGetRenderbufferParameterivEXT;
+        interface->fBindFramebuffer = glBindFramebufferEXT;
+        interface->fFramebufferTexture2D = glFramebufferTexture2DEXT;
+        interface->fCheckFramebufferStatus = glCheckFramebufferStatusEXT;
+        interface->fDeleteFramebuffers = glDeleteFramebuffersEXT;
+        interface->fRenderbufferStorage = glRenderbufferStorageEXT;
+        interface->fGenRenderbuffers = glGenRenderbuffersEXT;
+        interface->fDeleteRenderbuffers = glDeleteRenderbuffers;
+        interface->fFramebufferRenderbuffer = 
+                                                glFramebufferRenderbufferEXT;
+        interface->fBindRenderbuffer = glBindRenderbufferEXT;
+    #if GL_EXT_framebuffer_multisample
+        interface->fRenderbufferStorageMultisample = 
+                                            glRenderbufferStorageMultisampleEXT;
+    #endif
+    #if GL_EXT_framebuffer_blit
+        interface->fBlitFramebuffer = glBlitFramebufferEXT;
+    #endif
+    #endif
+        interface->fBindFragDataLocationIndexed = NULL;
 
-    defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
-
-    GrGLSetDefaultGLInterface(defaultInterface)->unref();
+        interface->fBindingsExported = kDesktop_GrGLBinding;
+    }
+    glInterface.get()->ref();
+    return glInterface.get();
 }
index 6d5661aa31cb15d96abc47f66c5996afc54e4226..cc2720511e33e8794a3b271ed56692feb481a198 100644 (file)
 #include <GL/glext.h>
 #include <GL/glu.h>
 
-#define GR_GL_GET_PROC(F) defaultInterface->f ## F = (GrGL ## F ## Proc) \
+#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) \
         OSMesaGetProcAddress("gl" #F);
-#define GR_GL_GET_PROC_SUFFIX(F, S) defaultInterface->f ## F = (GrGL ## F ## Proc) \
+#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) \
         OSMesaGetProcAddress("gl" #F #S);
 
-void GrGLInitializeDefaultGLInterface() {
+const GrGLInterface* GrGLDefaultInterface() {
     if (NULL != OSMesaGetCurrentContext()) {
-        GrGLInterface defaultInterface = new GrGLInterface();
         int major, minor;
         const char* versionString = (const char*) glGetString(GL_VERSION);
         const char* extString = (const char*) glGetString(GL_EXTENSIONS);
@@ -28,85 +27,86 @@ void GrGLInitializeDefaultGLInterface() {
 
         if (major == 1 && minor < 5) {
             // We must have array and element_array buffer objects.
-            return;
+            return NULL;
         }
-        defaultInterface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        defaultInterface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        defaultInterface->fMinRenderTargetWidth = kProbe_GrGLCapability;
+        GrGLInterface* interface = new GrGLInterface();
+        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
+        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
+        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
 
-        defaultInterface->fActiveTexture = glActiveTexture;
+        interface->fActiveTexture = glActiveTexture;
         GR_GL_GET_PROC(AttachShader);
         GR_GL_GET_PROC(BindAttribLocation);
         GR_GL_GET_PROC(BindBuffer);
-        defaultInterface->fBindTexture = glBindTexture;
-        defaultInterface->fBlendColor = glBlendColor;
-        defaultInterface->fBlendFunc = glBlendFunc;
+        interface->fBindTexture = glBindTexture;
+        interface->fBlendColor = glBlendColor;
+        interface->fBlendFunc = glBlendFunc;
         GR_GL_GET_PROC(BufferData);
         GR_GL_GET_PROC(BufferSubData);
-        defaultInterface->fClear = glClear;
-        defaultInterface->fClearColor = glClearColor;
-        defaultInterface->fClearStencil = glClearStencil;
-        defaultInterface->fClientActiveTexture = glClientActiveTexture;
-        defaultInterface->fColorMask = glColorMask;
-        defaultInterface->fColorPointer = glColorPointer;
-        defaultInterface->fColor4ub = glColor4ub;
+        interface->fClear = glClear;
+        interface->fClearColor = glClearColor;
+        interface->fClearStencil = glClearStencil;
+        interface->fClientActiveTexture = glClientActiveTexture;
+        interface->fColorMask = glColorMask;
+        interface->fColorPointer = glColorPointer;
+        interface->fColor4ub = glColor4ub;
         GR_GL_GET_PROC(CompileShader);
-        defaultInterface->fCompressedTexImage2D = glCompressedTexImage2D;
+        interface->fCompressedTexImage2D = glCompressedTexImage2D;
         GR_GL_GET_PROC(CreateProgram);
         GR_GL_GET_PROC(CreateShader);
-        defaultInterface->fCullFace = glCullFace;
+        interface->fCullFace = glCullFace;
         GR_GL_GET_PROC(DeleteBuffers);
         GR_GL_GET_PROC(DeleteProgram);
         GR_GL_GET_PROC(DeleteShader);
-        defaultInterface->fDeleteTextures = glDeleteTextures;
-        defaultInterface->fDepthMask = glDepthMask;
-        defaultInterface->fDisable = glDisable;
-        defaultInterface->fDisableClientState = glDisableClientState;
+        interface->fDeleteTextures = glDeleteTextures;
+        interface->fDepthMask = glDepthMask;
+        interface->fDisable = glDisable;
+        interface->fDisableClientState = glDisableClientState;
         GR_GL_GET_PROC(DisableVertexAttribArray);
-        defaultInterface->fDrawArrays = glDrawArrays;
-        defaultInterface->fDrawBuffer = glDrawBuffer;
+        interface->fDrawArrays = glDrawArrays;
+        interface->fDrawBuffer = glDrawBuffer;
         GR_GL_GET_PROC(DrawBuffers);
-        defaultInterface->fDrawElements = glDrawElements;
-        defaultInterface->fEnable = glEnable;
-        defaultInterface->fEnableClientState = glEnableClientState;
+        interface->fDrawElements = glDrawElements;
+        interface->fEnable = glEnable;
+        interface->fEnableClientState = glEnableClientState;
         GR_GL_GET_PROC(EnableVertexAttribArray);
-        defaultInterface->fFrontFace = glFrontFace;
+        interface->fFrontFace = glFrontFace;
         GR_GL_GET_PROC(GenBuffers);
         GR_GL_GET_PROC(GetBufferParameteriv);
-        defaultInterface->fGetError = glGetError;
-        defaultInterface->fGetIntegerv = glGetIntegerv;
+        interface->fGetError = glGetError;
+        interface->fGetIntegerv = glGetIntegerv;
         GR_GL_GET_PROC(GetProgramInfoLog);
         GR_GL_GET_PROC(GetProgramiv);
         GR_GL_GET_PROC(GetShaderInfoLog);
         GR_GL_GET_PROC(GetShaderiv);
-        defaultInterface->fGetString = glGetString;
-        defaultInterface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
-        defaultInterface->fGenTextures = glGenTextures;
+        interface->fGetString = glGetString;
+        interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
+        interface->fGenTextures = glGenTextures;
         GR_GL_GET_PROC(GetUniformLocation);
-        defaultInterface->fLineWidth = glLineWidth;
+        interface->fLineWidth = glLineWidth;
         GR_GL_GET_PROC(LinkProgram);
-        defaultInterface->fLoadMatrixf = glLoadMatrixf;
+        interface->fLoadMatrixf = glLoadMatrixf;
         GR_GL_GET_PROC(MapBuffer);
-        defaultInterface->fMatrixMode = glMatrixMode;
-        defaultInterface->fPointSize = glPointSize;
-        defaultInterface->fPixelStorei = glPixelStorei;
-        defaultInterface->fReadBuffer = glReadBuffer;
-        defaultInterface->fReadPixels = glReadPixels;
-        defaultInterface->fScissor = glScissor;
-        defaultInterface->fShadeModel = glShadeModel;
+        interface->fMatrixMode = glMatrixMode;
+        interface->fPointSize = glPointSize;
+        interface->fPixelStorei = glPixelStorei;
+        interface->fReadBuffer = glReadBuffer;
+        interface->fReadPixels = glReadPixels;
+        interface->fScissor = glScissor;
+        interface->fShadeModel = glShadeModel;
         GR_GL_GET_PROC(ShaderSource);
-        defaultInterface->fStencilFunc = glStencilFunc;
+        interface->fStencilFunc = glStencilFunc;
         GR_GL_GET_PROC(StencilFuncSeparate);
-        defaultInterface->fStencilMask = glStencilMask;
+        interface->fStencilMask = glStencilMask;
         GR_GL_GET_PROC(StencilMaskSeparate);
-        defaultInterface->fStencilOp = glStencilOp;
+        interface->fStencilOp = glStencilOp;
         GR_GL_GET_PROC(StencilOpSeparate);
-        defaultInterface->fTexCoordPointer = glTexCoordPointer;
-        defaultInterface->fTexEnvi = glTexEnvi;
+        interface->fTexCoordPointer = glTexCoordPointer;
+        interface->fTexEnvi = glTexEnvi;
         //OSMesa on Mac's glTexImage2D takes a GLenum for internalFormat rather than a GLint.
-        defaultInterface->fTexImage2D = reinterpret_cast<GrGLTexImage2DProc>(glTexImage2D);
-        defaultInterface->fTexParameteri = glTexParameteri;
-        defaultInterface->fTexSubImage2D = glTexSubImage2D;
+        interface->fTexImage2D = reinterpret_cast<GrGLTexImage2DProc>(glTexImage2D);
+        interface->fTexParameteri = glTexParameteri;
+        interface->fTexSubImage2D = glTexSubImage2D;
         GR_GL_GET_PROC(Uniform1f);
         GR_GL_GET_PROC(Uniform1i);
         GR_GL_GET_PROC(Uniform1fv);
@@ -130,8 +130,8 @@ void GrGLInitializeDefaultGLInterface() {
         GR_GL_GET_PROC(UseProgram);
         GR_GL_GET_PROC(VertexAttrib4fv);
         GR_GL_GET_PROC(VertexAttribPointer);
-        defaultInterface->fVertexPointer = glVertexPointer;
-        defaultInterface->fViewport = glViewport;
+        interface->fVertexPointer = glVertexPointer;
+        interface->fViewport = glViewport;
 
         // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
         // GL_ARB_framebuffer_object doesn't use ARB suffix.)
@@ -175,10 +175,13 @@ void GrGLInitializeDefaultGLInterface() {
             }
         } else {
             // we must have FBOs
-            return;
+            delete interface;
+            return NULL;
         }
         GR_GL_GET_PROC(BindFragDataLocationIndexed);
-        defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
-        GrGLSetDefaultGLInterface(defaultInterface)->unref();
+        interface->fBindingsExported = kDesktop_GrGLBinding;
+        return interface;
+    } else {
+        return NULL;
     }
 }
index 3e12ca1b544a18b738424e1ede84759df85ad4fa..fff01ed18cdc05e63aabc6a5649930016b5ce586 100644 (file)
 #include <GL/glext.h>
 #include <GL/glu.h>
 
-#define GR_GL_GET_PROC(F) defaultInterface->f ## F = (GrGL ## F ## Proc) \
+#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) \
         glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F));
-#define GR_GL_GET_PROC_SUFFIX(F, S) defaultInterface->f ## F = (GrGL ## F ## Proc) \
+#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) \
         glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S));
 
-void GrGLInitializeDefaultGLInterface() {
+const GrGLInterface* GrGLDefaultInterface() {
     if (NULL != glXGetCurrentContext()) {
         int major, minor;
         const char* versionString = (const char*) glGetString(GL_VERSION);
@@ -28,87 +28,87 @@ void GrGLInitializeDefaultGLInterface() {
 
         if (major == 1 && minor < 5) {
             // We must have array and element_array buffer objects.
-            return;
+            return NULL;
         }
 
-        GrGLInterface* defaultInterface = new GrGLInterface();
+        GrGLInterface* interface = new GrGLInterface();
 
-        defaultInterface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        defaultInterface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        defaultInterface->fMinRenderTargetWidth = kProbe_GrGLCapability;
+        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
+        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
+        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
 
-        defaultInterface->fActiveTexture = glActiveTexture;
+        interface->fActiveTexture = glActiveTexture;
         GR_GL_GET_PROC(AttachShader);
         GR_GL_GET_PROC(BindAttribLocation);
         GR_GL_GET_PROC(BindBuffer);
-        defaultInterface->fBindTexture = glBindTexture;
-        defaultInterface->fBlendColor = glBlendColor;
-        defaultInterface->fBlendFunc = glBlendFunc;
+        interface->fBindTexture = glBindTexture;
+        interface->fBlendColor = glBlendColor;
+        interface->fBlendFunc = glBlendFunc;
         GR_GL_GET_PROC(BufferData);
         GR_GL_GET_PROC(BufferSubData);
-        defaultInterface->fClear = glClear;
-        defaultInterface->fClearColor = glClearColor;
-        defaultInterface->fClearStencil = glClearStencil;
-        defaultInterface->fClientActiveTexture = glClientActiveTexture;
-        defaultInterface->fColorMask = glColorMask;
-        defaultInterface->fColorPointer = glColorPointer;
-        defaultInterface->fColor4ub = glColor4ub;
+        interface->fClear = glClear;
+        interface->fClearColor = glClearColor;
+        interface->fClearStencil = glClearStencil;
+        interface->fClientActiveTexture = glClientActiveTexture;
+        interface->fColorMask = glColorMask;
+        interface->fColorPointer = glColorPointer;
+        interface->fColor4ub = glColor4ub;
         GR_GL_GET_PROC(CompileShader);
-        defaultInterface->fCompressedTexImage2D = glCompressedTexImage2D;
+        interface->fCompressedTexImage2D = glCompressedTexImage2D;
         GR_GL_GET_PROC(CreateProgram);
         GR_GL_GET_PROC(CreateShader);
-        defaultInterface->fCullFace = glCullFace;
+        interface->fCullFace = glCullFace;
         GR_GL_GET_PROC(DeleteBuffers);
         GR_GL_GET_PROC(DeleteProgram);
         GR_GL_GET_PROC(DeleteShader);
-        defaultInterface->fDeleteTextures = glDeleteTextures;
-        defaultInterface->fDepthMask = glDepthMask;
-        defaultInterface->fDisable = glDisable;
-        defaultInterface->fDisableClientState = glDisableClientState;
+        interface->fDeleteTextures = glDeleteTextures;
+        interface->fDepthMask = glDepthMask;
+        interface->fDisable = glDisable;
+        interface->fDisableClientState = glDisableClientState;
         GR_GL_GET_PROC(DisableVertexAttribArray);
-        defaultInterface->fDrawArrays = glDrawArrays;
-        defaultInterface->fDrawBuffer = glDrawBuffer;
+        interface->fDrawArrays = glDrawArrays;
+        interface->fDrawBuffer = glDrawBuffer;
         GR_GL_GET_PROC(DrawBuffers);
-        defaultInterface->fDrawElements = glDrawElements;
-        defaultInterface->fEnable = glEnable;
-        defaultInterface->fEnableClientState = glEnableClientState;
+        interface->fDrawElements = glDrawElements;
+        interface->fEnable = glEnable;
+        interface->fEnableClientState = glEnableClientState;
         GR_GL_GET_PROC(EnableVertexAttribArray);
-        defaultInterface->fFrontFace = glFrontFace;
+        interface->fFrontFace = glFrontFace;
         GR_GL_GET_PROC(GenBuffers);
         GR_GL_GET_PROC(GetBufferParameteriv);
-        defaultInterface->fGetError = glGetError;
-        defaultInterface->fGetIntegerv = glGetIntegerv;
+        interface->fGetError = glGetError;
+        interface->fGetIntegerv = glGetIntegerv;
         GR_GL_GET_PROC(GetProgramInfoLog);
         GR_GL_GET_PROC(GetProgramiv);
         GR_GL_GET_PROC(GetShaderInfoLog);
         GR_GL_GET_PROC(GetShaderiv);
-        defaultInterface->fGetString = glGetString;
-        defaultInterface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
-        defaultInterface->fGenTextures = glGenTextures;
+        interface->fGetString = glGetString;
+        interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
+        interface->fGenTextures = glGenTextures;
         GR_GL_GET_PROC(GetUniformLocation);
-        defaultInterface->fLineWidth = glLineWidth;
+        interface->fLineWidth = glLineWidth;
         GR_GL_GET_PROC(LinkProgram);
-        defaultInterface->fLoadMatrixf = glLoadMatrixf;
+        interface->fLoadMatrixf = glLoadMatrixf;
         GR_GL_GET_PROC(MapBuffer);
-        defaultInterface->fMatrixMode = glMatrixMode;
-        defaultInterface->fPointSize = glPointSize;
-        defaultInterface->fPixelStorei = glPixelStorei;
-        defaultInterface->fReadBuffer = glReadBuffer;
-        defaultInterface->fReadPixels = glReadPixels;
-        defaultInterface->fScissor = glScissor;
-        defaultInterface->fShadeModel = glShadeModel;
+        interface->fMatrixMode = glMatrixMode;
+        interface->fPointSize = glPointSize;
+        interface->fPixelStorei = glPixelStorei;
+        interface->fReadBuffer = glReadBuffer;
+        interface->fReadPixels = glReadPixels;
+        interface->fScissor = glScissor;
+        interface->fShadeModel = glShadeModel;
         GR_GL_GET_PROC(ShaderSource);
-        defaultInterface->fStencilFunc = glStencilFunc;
+        interface->fStencilFunc = glStencilFunc;
         GR_GL_GET_PROC(StencilFuncSeparate);
-        defaultInterface->fStencilMask = glStencilMask;
+        interface->fStencilMask = glStencilMask;
         GR_GL_GET_PROC(StencilMaskSeparate);
-        defaultInterface->fStencilOp = glStencilOp;
+        interface->fStencilOp = glStencilOp;
         GR_GL_GET_PROC(StencilOpSeparate);
-        defaultInterface->fTexCoordPointer = glTexCoordPointer;
-        defaultInterface->fTexEnvi = glTexEnvi;
-        defaultInterface->fTexImage2D = glTexImage2D;
-        defaultInterface->fTexParameteri = glTexParameteri;
-        defaultInterface->fTexSubImage2D = glTexSubImage2D;
+        interface->fTexCoordPointer = glTexCoordPointer;
+        interface->fTexEnvi = glTexEnvi;
+        interface->fTexImage2D = glTexImage2D;
+        interface->fTexParameteri = glTexParameteri;
+        interface->fTexSubImage2D = glTexSubImage2D;
         GR_GL_GET_PROC(Uniform1f);
         GR_GL_GET_PROC(Uniform1i);
         GR_GL_GET_PROC(Uniform1fv);
@@ -132,8 +132,8 @@ void GrGLInitializeDefaultGLInterface() {
         GR_GL_GET_PROC(UseProgram);
         GR_GL_GET_PROC(VertexAttrib4fv);
         GR_GL_GET_PROC(VertexAttribPointer);
-        defaultInterface->fVertexPointer = glVertexPointer;
-        defaultInterface->fViewport = glViewport;
+        interface->fVertexPointer = glVertexPointer;
+        interface->fViewport = glViewport;
         GR_GL_GET_PROC(BindFragDataLocationIndexed);
 
         // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
@@ -178,10 +178,13 @@ void GrGLInitializeDefaultGLInterface() {
             }
         } else {
             // we must have FBOs
-            return;
+            delete interface;
+            return NULL;
         }
-        defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
+        interface->fBindingsExported = kDesktop_GrGLBinding;
 
-        GrGLSetDefaultGLInterface(defaultInterface)->unref();
+        return interface;
+    } else {
+        return NULL;
     }
 }
index e5c7369ccb5a0ba75e2ba8393f0b0bffd47a26f5..89986e6c5dc780b53d34edd243dc26665714ed3f 100644 (file)
  * Otherwise, a springboard would be needed that hides the calling convention.
  */
 
-#define GR_GL_GET_PROC(F) defaultInterface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F);
-#define GR_GL_GET_PROC_SUFFIX(F, S) defaultInterface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F #S);
-
-void GrGLInitializeDefaultGLInterface() {
+#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F);
+#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F #S);
 
+const GrGLInterface* GrGLDefaultInterface() {
     // wglGetProcAddress requires a context.
+    // GL Function pointers retrieved in one context may not be valid in another
+    // context. For that reason we create a new GrGLInterface each time we're 
+    // called.
     if (NULL != wglGetCurrentContext()) {
         int major, minor;
         const char* versionString = (const char*) glGetString(GL_VERSION);
@@ -32,58 +34,58 @@ void GrGLInitializeDefaultGLInterface() {
 
         if (major == 1 && minor < 5) {
             // We must have array and element_array buffer objects.
-            return;
+            return NULL;
         }
-        GrGLInterface* defaultInterface = new GrGLInterface();
+        GrGLInterface* interface = new GrGLInterface();
 
-        defaultInterface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        defaultInterface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        defaultInterface->fMinRenderTargetWidth = kProbe_GrGLCapability;
+        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
+        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
+        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
 
         // Functions that are part of GL 1.1 will return NULL in
         // wglGetProcAddress
-        defaultInterface->fBlendFunc = glBlendFunc;
-        defaultInterface->fClear = glClear;
-        defaultInterface->fClearColor = glClearColor;
-        defaultInterface->fClearStencil = glClearStencil;
-        defaultInterface->fColor4ub = glColor4ub;
-        defaultInterface->fColorMask = glColorMask;
-        defaultInterface->fColorPointer = glColorPointer;
-        defaultInterface->fCullFace = glCullFace;
-        defaultInterface->fDeleteTextures = glDeleteTextures;
-        defaultInterface->fDepthMask = glDepthMask;
-        defaultInterface->fDisable = glDisable;
-        defaultInterface->fDisableClientState = glDisableClientState;
-        defaultInterface->fDrawArrays = glDrawArrays;
-        defaultInterface->fDrawElements = glDrawElements;
-        defaultInterface->fDrawBuffer = glDrawBuffer;
-        defaultInterface->fEnable = glEnable;
-        defaultInterface->fEnableClientState = glEnableClientState;
-        defaultInterface->fFrontFace = glFrontFace;
-        defaultInterface->fGenTextures = glGenTextures;
-        defaultInterface->fGetError = glGetError;
-        defaultInterface->fGetIntegerv = glGetIntegerv;
-        defaultInterface->fGetString = glGetString;
-        defaultInterface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
-        defaultInterface->fLineWidth = glLineWidth;
-        defaultInterface->fLoadMatrixf = glLoadMatrixf;
-        defaultInterface->fMatrixMode = glMatrixMode;
-        defaultInterface->fPixelStorei = glPixelStorei;
-        defaultInterface->fPointSize = glPointSize;
-        defaultInterface->fReadBuffer = glReadBuffer;
-        defaultInterface->fReadPixels = glReadPixels;
-        defaultInterface->fScissor = glScissor;
-        defaultInterface->fShadeModel = glShadeModel;
-        defaultInterface->fStencilFunc = glStencilFunc;
-        defaultInterface->fStencilMask = glStencilMask;
-        defaultInterface->fStencilOp = glStencilOp;
-        defaultInterface->fTexImage2D = glTexImage2D;
-        defaultInterface->fTexParameteri = glTexParameteri;
-        defaultInterface->fTexCoordPointer = glTexCoordPointer;
-        defaultInterface->fTexEnvi = glTexEnvi;
-        defaultInterface->fTexSubImage2D = glTexSubImage2D;
-        defaultInterface->fViewport = glViewport;
-        defaultInterface->fVertexPointer = glVertexPointer;
+        interface->fBlendFunc = glBlendFunc;
+        interface->fClear = glClear;
+        interface->fClearColor = glClearColor;
+        interface->fClearStencil = glClearStencil;
+        interface->fColor4ub = glColor4ub;
+        interface->fColorMask = glColorMask;
+        interface->fColorPointer = glColorPointer;
+        interface->fCullFace = glCullFace;
+        interface->fDeleteTextures = glDeleteTextures;
+        interface->fDepthMask = glDepthMask;
+        interface->fDisable = glDisable;
+        interface->fDisableClientState = glDisableClientState;
+        interface->fDrawArrays = glDrawArrays;
+        interface->fDrawElements = glDrawElements;
+        interface->fDrawBuffer = glDrawBuffer;
+        interface->fEnable = glEnable;
+        interface->fEnableClientState = glEnableClientState;
+        interface->fFrontFace = glFrontFace;
+        interface->fGenTextures = glGenTextures;
+        interface->fGetError = glGetError;
+        interface->fGetIntegerv = glGetIntegerv;
+        interface->fGetString = glGetString;
+        interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
+        interface->fLineWidth = glLineWidth;
+        interface->fLoadMatrixf = glLoadMatrixf;
+        interface->fMatrixMode = glMatrixMode;
+        interface->fPixelStorei = glPixelStorei;
+        interface->fPointSize = glPointSize;
+        interface->fReadBuffer = glReadBuffer;
+        interface->fReadPixels = glReadPixels;
+        interface->fScissor = glScissor;
+        interface->fShadeModel = glShadeModel;
+        interface->fStencilFunc = glStencilFunc;
+        interface->fStencilMask = glStencilMask;
+        interface->fStencilOp = glStencilOp;
+        interface->fTexImage2D = glTexImage2D;
+        interface->fTexParameteri = glTexParameteri;
+        interface->fTexCoordPointer = glTexCoordPointer;
+        interface->fTexEnvi = glTexEnvi;
+        interface->fTexSubImage2D = glTexSubImage2D;
+        interface->fViewport = glViewport;
+        interface->fVertexPointer = glVertexPointer;
 
         GR_GL_GET_PROC(ActiveTexture);
         GR_GL_GET_PROC(AttachShader);
@@ -178,13 +180,16 @@ void GrGLInitializeDefaultGLInterface() {
             }
         } else {
             // we must have FBOs
-            return;
+            delete interface;
+            return NULL;
         }
         GR_GL_GET_PROC(MapBuffer);
         GR_GL_GET_PROC(UnmapBuffer);
 
-        defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
+        interface->fBindingsExported = kDesktop_GrGLBinding;
 
-        GrGLSetDefaultGLInterface(defaultInterface)->unref();
+        return interface;
+    } else {
+        return NULL;
     }
 }
index 7dbec175c11ec0f8fc34510ffbd4937d0c0eb01d..bed54596b3cd7ae5f48746623ad4e48104e35e06 100644 (file)
@@ -81,11 +81,13 @@ public:
     DefaultDeviceManager() {
         fGrRenderTarget = NULL;
         fGrContext = NULL;
+        fGL = NULL;
     }
 
     virtual ~DefaultDeviceManager() {
         SkSafeUnref(fGrRenderTarget);
         SkSafeUnref(fGrContext);
+        SkSafeUnref(fGL);
     }
 
     virtual void init(SampleWindow* win) {
@@ -93,7 +95,10 @@ public:
         if (NULL == fGrContext) {
             fGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine, NULL);
         }
-        if (NULL == fGrContext) {
+        if (NULL == fGL) {
+            fGL = GrGLDefaultInterface();
+        }
+        if (NULL == fGrContext || NULL == fGL) {
             SkDebugf("Failed to setup 3D");
             win->detachGL();
         }
@@ -153,12 +158,10 @@ public:
             desc.fWidth = SkScalarRound(win->width());
             desc.fHeight = SkScalarRound(win->height());
             desc.fConfig = kRGBA_8888_GrPixelConfig;
-            const GrGLInterface* gl = GrGLGetDefaultGLInterface();
-            GrAssert(NULL != gl);
-            GR_GL_GetIntegerv(gl, GR_GL_STENCIL_BITS, &desc.fStencilBits);
-            GR_GL_GetIntegerv(gl, GR_GL_SAMPLES, &desc.fSampleCnt);
+            GR_GL_GetIntegerv(fGL, GR_GL_STENCIL_BITS, &desc.fStencilBits);
+            GR_GL_GetIntegerv(fGL, GR_GL_SAMPLES, &desc.fSampleCnt);
             GrGLint buffer;
-            GR_GL_GetIntegerv(gl, GR_GL_FRAMEBUFFER_BINDING, &buffer);
+            GR_GL_GetIntegerv(fGL, GR_GL_FRAMEBUFFER_BINDING, &buffer);
             desc.fPlatformRenderTarget = buffer;
 
             SkSafeUnref(fGrRenderTarget);
@@ -172,6 +175,7 @@ public:
     }
 private:
     GrContext* fGrContext;
+    const GrGLInterface* fGL;
     GrRenderTarget* fGrRenderTarget;
 };
 
@@ -1032,19 +1036,19 @@ void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
         canvas->translate(-cx, -cy);
     }
     if (fPerspAnim) {
-        fPerspAnimTime += SampleCode::GetAnimSecondsDelta();\r
-\r
-        static const SkScalar gAnimPeriod = 10 * SK_Scalar1;\r
-        static const SkScalar gAnimMag = SK_Scalar1 / 1000;\r
-        SkScalar t = SkScalarMod(fPerspAnimTime, gAnimPeriod);\r
-        if (SkScalarFloorToInt(SkScalarDiv(fPerspAnimTime, gAnimPeriod)) & 0x1) {\r
-            t = gAnimPeriod - t;\r
-        }\r
-        t = 2 * t - gAnimPeriod;\r
-        t = SkScalarMul(SkScalarDiv(t, gAnimPeriod), gAnimMag);\r
-        SkMatrix m;\r
-        m.reset();\r
-        m.setPerspY(t);\r
+        fPerspAnimTime += SampleCode::GetAnimSecondsDelta();
+
+        static const SkScalar gAnimPeriod = 10 * SK_Scalar1;
+        static const SkScalar gAnimMag = SK_Scalar1 / 1000;
+        SkScalar t = SkScalarMod(fPerspAnimTime, gAnimPeriod);
+        if (SkScalarFloorToInt(SkScalarDiv(fPerspAnimTime, gAnimPeriod)) & 0x1) {
+            t = gAnimPeriod - t;
+        }
+        t = 2 * t - gAnimPeriod;
+        t = SkScalarMul(SkScalarDiv(t, gAnimPeriod), gAnimMag);
+        SkMatrix m;
+        m.reset();
+        m.setPerspY(t);
         canvas->concat(m);
     }