* 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
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;
*/
-void GrGLInitializeDefaultGLInterface() {
+const GrGLInterface* GrGLDefaultInterface() {
+ return NULL;
}
}
#endif
-static SkAutoTUnref<const GrGLInterface> gDefaultGLInterface;
-
void gl_version_from_string(int* major, int* minor,
const char* versionString) {
if (NULL == versionString) {
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));
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
#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();
}
#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();
+}
#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();
}
#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);
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);
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.)
}
} 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;
}
}
#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);
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);
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
}
} 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;
}
}
* 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);
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);
}
} 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;
}
}
DefaultDeviceManager() {
fGrRenderTarget = NULL;
fGrContext = NULL;
+ fGL = NULL;
}
virtual ~DefaultDeviceManager() {
SkSafeUnref(fGrRenderTarget);
SkSafeUnref(fGrContext);
+ SkSafeUnref(fGL);
}
virtual void init(SampleWindow* win) {
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();
}
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);
}
private:
GrContext* fGrContext;
+ const GrGLInterface* fGL;
GrRenderTarget* fGrRenderTarget;
};
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);
}