Make GrGLInterface a per-GrContext refcounted object rather than a global
Review URL: http://codereview.appspot.com/4901046/
git-svn-id: http://skia.googlecode.com/svn/trunk@2140 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/unix/GrGLDefaultInterface_unix.cpp b/gpu/src/unix/GrGLDefaultInterface_unix.cpp
index 01725b9..3e12ca1 100644
--- a/gpu/src/unix/GrGLDefaultInterface_unix.cpp
+++ b/gpu/src/unix/GrGLDefaultInterface_unix.cpp
@@ -14,15 +14,13 @@
#include <GL/glext.h>
#include <GL/glu.h>
-#define GR_GL_GET_PROC(F) gDefaultInterface.f ## F = (GrGL ## F ## Proc) \
+#define GR_GL_GET_PROC(F) defaultInterface->f ## F = (GrGL ## F ## Proc) \
glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F));
-#define GR_GL_GET_PROC_SUFFIX(F, S) gDefaultInterface.f ## F = (GrGL ## F ## Proc) \
+#define GR_GL_GET_PROC_SUFFIX(F, S) defaultInterface->f ## F = (GrGL ## F ## Proc) \
glXGetProcAddress(reinterpret_cast<const GLubyte*>("gl" #F #S));
-void GrGLSetDefaultGLInterface() {
- static GrGLInterface gDefaultInterface;
- static bool gDefaultInterfaceInit;
- if (!gDefaultInterfaceInit && NULL != glXGetCurrentContext()) {
+void GrGLInitializeDefaultGLInterface() {
+ if (NULL != glXGetCurrentContext()) {
int major, minor;
const char* versionString = (const char*) glGetString(GL_VERSION);
const char* extString = (const char*) glGetString(GL_EXTENSIONS);
@@ -33,82 +31,84 @@
return;
}
- gDefaultInterface.fNPOTRenderTargetSupport = kProbe_GrGLCapability;
- gDefaultInterface.fMinRenderTargetHeight = kProbe_GrGLCapability;
- gDefaultInterface.fMinRenderTargetWidth = kProbe_GrGLCapability;
+ GrGLInterface* defaultInterface = new GrGLInterface();
- gDefaultInterface.fActiveTexture = glActiveTexture;
+ defaultInterface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
+ defaultInterface->fMinRenderTargetHeight = kProbe_GrGLCapability;
+ defaultInterface->fMinRenderTargetWidth = kProbe_GrGLCapability;
+
+ defaultInterface->fActiveTexture = glActiveTexture;
GR_GL_GET_PROC(AttachShader);
GR_GL_GET_PROC(BindAttribLocation);
GR_GL_GET_PROC(BindBuffer);
- gDefaultInterface.fBindTexture = glBindTexture;
- gDefaultInterface.fBlendColor = glBlendColor;
- gDefaultInterface.fBlendFunc = glBlendFunc;
+ defaultInterface->fBindTexture = glBindTexture;
+ defaultInterface->fBlendColor = glBlendColor;
+ defaultInterface->fBlendFunc = glBlendFunc;
GR_GL_GET_PROC(BufferData);
GR_GL_GET_PROC(BufferSubData);
- gDefaultInterface.fClear = glClear;
- gDefaultInterface.fClearColor = glClearColor;
- gDefaultInterface.fClearStencil = glClearStencil;
- gDefaultInterface.fClientActiveTexture = glClientActiveTexture;
- gDefaultInterface.fColorMask = glColorMask;
- gDefaultInterface.fColorPointer = glColorPointer;
- gDefaultInterface.fColor4ub = glColor4ub;
+ defaultInterface->fClear = glClear;
+ defaultInterface->fClearColor = glClearColor;
+ defaultInterface->fClearStencil = glClearStencil;
+ defaultInterface->fClientActiveTexture = glClientActiveTexture;
+ defaultInterface->fColorMask = glColorMask;
+ defaultInterface->fColorPointer = glColorPointer;
+ defaultInterface->fColor4ub = glColor4ub;
GR_GL_GET_PROC(CompileShader);
- gDefaultInterface.fCompressedTexImage2D = glCompressedTexImage2D;
+ defaultInterface->fCompressedTexImage2D = glCompressedTexImage2D;
GR_GL_GET_PROC(CreateProgram);
GR_GL_GET_PROC(CreateShader);
- gDefaultInterface.fCullFace = glCullFace;
+ defaultInterface->fCullFace = glCullFace;
GR_GL_GET_PROC(DeleteBuffers);
GR_GL_GET_PROC(DeleteProgram);
GR_GL_GET_PROC(DeleteShader);
- gDefaultInterface.fDeleteTextures = glDeleteTextures;
- gDefaultInterface.fDepthMask = glDepthMask;
- gDefaultInterface.fDisable = glDisable;
- gDefaultInterface.fDisableClientState = glDisableClientState;
+ defaultInterface->fDeleteTextures = glDeleteTextures;
+ defaultInterface->fDepthMask = glDepthMask;
+ defaultInterface->fDisable = glDisable;
+ defaultInterface->fDisableClientState = glDisableClientState;
GR_GL_GET_PROC(DisableVertexAttribArray);
- gDefaultInterface.fDrawArrays = glDrawArrays;
- gDefaultInterface.fDrawBuffer = glDrawBuffer;
+ defaultInterface->fDrawArrays = glDrawArrays;
+ defaultInterface->fDrawBuffer = glDrawBuffer;
GR_GL_GET_PROC(DrawBuffers);
- gDefaultInterface.fDrawElements = glDrawElements;
- gDefaultInterface.fEnable = glEnable;
- gDefaultInterface.fEnableClientState = glEnableClientState;
+ defaultInterface->fDrawElements = glDrawElements;
+ defaultInterface->fEnable = glEnable;
+ defaultInterface->fEnableClientState = glEnableClientState;
GR_GL_GET_PROC(EnableVertexAttribArray);
- gDefaultInterface.fFrontFace = glFrontFace;
+ defaultInterface->fFrontFace = glFrontFace;
GR_GL_GET_PROC(GenBuffers);
GR_GL_GET_PROC(GetBufferParameteriv);
- gDefaultInterface.fGetError = glGetError;
- gDefaultInterface.fGetIntegerv = glGetIntegerv;
+ defaultInterface->fGetError = glGetError;
+ defaultInterface->fGetIntegerv = glGetIntegerv;
GR_GL_GET_PROC(GetProgramInfoLog);
GR_GL_GET_PROC(GetProgramiv);
GR_GL_GET_PROC(GetShaderInfoLog);
GR_GL_GET_PROC(GetShaderiv);
- gDefaultInterface.fGetString = glGetString;
- gDefaultInterface.fGetTexLevelParameteriv = glGetTexLevelParameteriv;
- gDefaultInterface.fGenTextures = glGenTextures;
+ defaultInterface->fGetString = glGetString;
+ defaultInterface->fGetTexLevelParameteriv = glGetTexLevelParameteriv;
+ defaultInterface->fGenTextures = glGenTextures;
GR_GL_GET_PROC(GetUniformLocation);
- gDefaultInterface.fLineWidth = glLineWidth;
+ defaultInterface->fLineWidth = glLineWidth;
GR_GL_GET_PROC(LinkProgram);
- gDefaultInterface.fLoadMatrixf = glLoadMatrixf;
+ defaultInterface->fLoadMatrixf = glLoadMatrixf;
GR_GL_GET_PROC(MapBuffer);
- gDefaultInterface.fMatrixMode = glMatrixMode;
- gDefaultInterface.fPointSize = glPointSize;
- gDefaultInterface.fPixelStorei = glPixelStorei;
- gDefaultInterface.fReadBuffer = glReadBuffer;
- gDefaultInterface.fReadPixels = glReadPixels;
- gDefaultInterface.fScissor = glScissor;
- gDefaultInterface.fShadeModel = glShadeModel;
+ defaultInterface->fMatrixMode = glMatrixMode;
+ defaultInterface->fPointSize = glPointSize;
+ defaultInterface->fPixelStorei = glPixelStorei;
+ defaultInterface->fReadBuffer = glReadBuffer;
+ defaultInterface->fReadPixels = glReadPixels;
+ defaultInterface->fScissor = glScissor;
+ defaultInterface->fShadeModel = glShadeModel;
GR_GL_GET_PROC(ShaderSource);
- gDefaultInterface.fStencilFunc = glStencilFunc;
+ defaultInterface->fStencilFunc = glStencilFunc;
GR_GL_GET_PROC(StencilFuncSeparate);
- gDefaultInterface.fStencilMask = glStencilMask;
+ defaultInterface->fStencilMask = glStencilMask;
GR_GL_GET_PROC(StencilMaskSeparate);
- gDefaultInterface.fStencilOp = glStencilOp;
+ defaultInterface->fStencilOp = glStencilOp;
GR_GL_GET_PROC(StencilOpSeparate);
- gDefaultInterface.fTexCoordPointer = glTexCoordPointer;
- gDefaultInterface.fTexEnvi = glTexEnvi;
- gDefaultInterface.fTexImage2D = glTexImage2D;
- gDefaultInterface.fTexParameteri = glTexParameteri;
- gDefaultInterface.fTexSubImage2D = glTexSubImage2D;
+ defaultInterface->fTexCoordPointer = glTexCoordPointer;
+ defaultInterface->fTexEnvi = glTexEnvi;
+ defaultInterface->fTexImage2D = glTexImage2D;
+ defaultInterface->fTexParameteri = glTexParameteri;
+ defaultInterface->fTexSubImage2D = glTexSubImage2D;
GR_GL_GET_PROC(Uniform1f);
GR_GL_GET_PROC(Uniform1i);
GR_GL_GET_PROC(Uniform1fv);
@@ -132,8 +132,8 @@
GR_GL_GET_PROC(UseProgram);
GR_GL_GET_PROC(VertexAttrib4fv);
GR_GL_GET_PROC(VertexAttribPointer);
- gDefaultInterface.fVertexPointer = glVertexPointer;
- gDefaultInterface.fViewport = glViewport;
+ defaultInterface->fVertexPointer = glVertexPointer;
+ defaultInterface->fViewport = glViewport;
GR_GL_GET_PROC(BindFragDataLocationIndexed);
// First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
@@ -180,10 +180,8 @@
// we must have FBOs
return;
}
- gDefaultInterface.fBindingsExported = kDesktop_GrGLBinding;
+ defaultInterface->fBindingsExported = kDesktop_GrGLBinding;
- gDefaultInterfaceInit = true;
+ GrGLSetDefaultGLInterface(defaultInterface)->unref();
}
- if (gDefaultInterfaceInit)
- GrGLSetGLInterface(&gDefaultInterface);
}