Remove dependence on platform GL headers. Remove code that attempts to infer GL function pointers on various platforms. Instead add platform-specific implementations for Windows and Mac. (GLX coming)
Review URL: http://codereview.appspot.com/4354048/
git-svn-id: http://skia.googlecode.com/svn/trunk@1045 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGLInterface.cpp b/gpu/src/GrGLInterface.cpp
index 8be0f2b..5dfc03c 100644
--- a/gpu/src/GrGLInterface.cpp
+++ b/gpu/src/GrGLInterface.cpp
@@ -15,58 +15,13 @@
*/
-#include "GrGLInterface.h"
#include "GrTypes.h"
+#include "GrGLInterface.h"
+#include "GrGLDefines.h"
-#include "GrGLPlatformIncludes.h"
#include <stdio.h>
-#if defined(GR_GL_PLATFORM_HEADER_SUPPORT)
- #include GR_GL_PLATFORM_HEADER_SUPPORT
-#endif
-
-#if defined(GR_GL_PLATFORM_HEADER)
- #include GR_GL_PLATFORM_HEADER
-#endif
-
-#if defined(GR_GL_PLATFORM_HEADER_EXT)
- #include GR_GL_PLATFORM_HEADER_EXT
-#endif
-
-#if defined(GR_GL_PLATFORM_HEADER2)
- #include GR_GL_PLATFORM_HEADER2
-#endif
-
-#if defined(GR_GL_PLATFORM_HEADER_EXT2)
- #include GR_GL_PLATFORM_HEADER_EXT2
-#endif
-
-#if defined(GR_GL_PROC_ADDRESS_HEADER)
- #include GR_GL_PROC_ADDRESS_HEADER
-#endif
-
-#if !defined(GR_GL_PROC_ADDRESS)
- #error "Must define GR_GL_PROC_ADDRESS"
-#endif
-
-#define GR_GL_GET_PROC(PROC_NAME) \
- glBindings->f##PROC_NAME = \
- reinterpret_cast<GrGLInterface::GrGL##PROC_NAME##Proc>( \
- GR_GL_PROC_ADDRESS(gl##PROC_NAME)); \
- GrAssert(NULL != glBindings->f##PROC_NAME && \
- "Missing GL binding: " #PROC_NAME);
-
-#define GR_GL_GET_PROC_SUFFIX(PROC_NAME, SUFFIX) \
- glBindings->f##PROC_NAME = \
- reinterpret_cast<GrGLInterface::GrGL##PROC_NAME##Proc>( \
- GR_GL_PROC_ADDRESS(gl##PROC_NAME##SUFFIX)); \
- GrAssert(NULL != glBindings->f##PROC_NAME && \
- "Missing GL binding: " #PROC_NAME);
-
-#define GR_GL_GET_PROC_SYMBOL(PROC_NAME) \
- glBindings->f##PROC_NAME = reinterpret_cast<GrGLInterface::GrGL##PROC_NAME##Proc>(gl##PROC_NAME);
-
-namespace {
+GrGLInterface* gGLInterface = NULL;
void gl_version_from_string(int* major, int* minor,
const char* versionString) {
@@ -117,246 +72,6 @@
return false;
}
-GrGLInterface* gGLInterface = NULL;
-
-void InitializeGLInterfaceExtensions(GrGLInterface* glBindings) {
- int major, minor;
- const char* versionString = reinterpret_cast<const char*>(
- glBindings->fGetString(GL_VERSION));
- const char* extensionString = reinterpret_cast<const char*>(
- glBindings->fGetString(GL_EXTENSIONS));
- gl_version_from_string(&major, &minor, versionString);
-
- bool fboFound = false;
-#if GR_SUPPORT_GLDESKTOP
- if (major >= 3 || has_gl_extension_from_string("GL_ARB_framebuffer_object",
- extensionString)) {
- // GL_ARB_framebuffer_object doesn't use ARB suffix.
- GR_GL_GET_PROC(GenFramebuffers);
- GR_GL_GET_PROC(BindFramebuffer);
- GR_GL_GET_PROC(FramebufferTexture2D);
- GR_GL_GET_PROC(CheckFramebufferStatus);
- GR_GL_GET_PROC(DeleteFramebuffers);
- GR_GL_GET_PROC(RenderbufferStorage);
- GR_GL_GET_PROC(GenRenderbuffers);
- GR_GL_GET_PROC(DeleteRenderbuffers);
- GR_GL_GET_PROC(FramebufferRenderbuffer);
- GR_GL_GET_PROC(BindRenderbuffer);
- GR_GL_GET_PROC(RenderbufferStorageMultisample);
- GR_GL_GET_PROC(BlitFramebuffer);
- fboFound = true;
- }
-
- #if GL_EXT_framebuffer_object
- if (!fboFound &&
- has_gl_extension_from_string("GL_EXT_framebuffer_object",
- extensionString)) {
- GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
- GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
- GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
- GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
- GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
- GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
- GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
- GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
- GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
- GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
- fboFound = true;
-
- if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample",
- extensionString)) {
- GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
- }
- if (has_gl_extension_from_string("GL_EXT_framebuffer_blit",
- extensionString)) {
- GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
- }
- }
- #endif
-
- // we assume we have at least GL 1.5 or higher (VBOs introduced in 1.5)
- GrAssert((major == 1 && minor >= 5) || major >=2);
- GR_GL_GET_PROC(MapBuffer);
- GR_GL_GET_PROC(UnmapBuffer);
-#else // !GR_SUPPORT_GLDESKTOP
- #if GR_SUPPORT_GLES2
- if (!fboFound && major >= 2) {// ES 2.0 supports FBO
- GR_GL_GET_PROC(GenFramebuffers);
- GR_GL_GET_PROC(BindFramebuffer);
- GR_GL_GET_PROC(FramebufferTexture2D);
- GR_GL_GET_PROC(CheckFramebufferStatus);
- GR_GL_GET_PROC(DeleteFramebuffers);
- GR_GL_GET_PROC(RenderbufferStorage);
- GR_GL_GET_PROC(GenRenderbuffers);
- GR_GL_GET_PROC(DeleteRenderbuffers);
- GR_GL_GET_PROC(FramebufferRenderbuffer);
- GR_GL_GET_PROC(BindRenderbuffer);
- fboFound = true;
- }
- #endif
-
- #if GL_OES_framebuffer_object
- if (!fboFound &&
- has_gl_extension_from_string("GL_OES_framebuffer_object",
- extensionString)) {
- GR_GL_GET_PROC_SUFFIX(GenFramebuffers, OES);
- GR_GL_GET_PROC_SUFFIX(BindFramebuffer, OES);
- GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, OES);
- GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, OES);
- GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, OES);
- GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, OES);
- GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, OES);
- GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, OES);
- GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, OES);
- GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, OES);
- fboFound = true;
- }
- #endif
- bool msaaFound = false;
- // Chrome advertises the equivalent of GL_EXT_framebuffer_blit plus
- // GL_EXT_framebuffer_multisample as GL_CHROMIUM_framebuffer_multisample
- // The EXT suffixes are used on the functions, however.
- #if GL_EXT_framebuffer_multisample
- if (!msaaFound &&
- has_gl_extension_from_string("GL_CHROMIUM_framebuffer_multisample",
- extensionString)) {
- GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
- GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
- msaaFound = true;
- }
- #endif
- #if GL_APPLE_framebuffer_multisample
- if (!msaaFound &&
- has_gl_extension_from_string("GL_APPLE_framebuffer_multisample",
- extensionString)) {
- GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, APPLE);
- GR_GL_GET_PROC_SUFFIX(ResolveMultisampleFramebuffer, APPLE);
- msaaFound = true;
- }
- #endif
-
- #if GL_OES_mapbuffer
- if (has_gl_extension_from_string("GL_OES_mapbuffer", extensionString)) {
- GR_GL_GET_PROC_SUFFIX(MapBuffer, OES);
- GR_GL_GET_PROC_SUFFIX(UnmapBuffer, OES);
- }
- #endif
-#endif // !GR_SUPPORT_GLDESKTOP
-
- if (!fboFound) {
- // we require some form of FBO
- GrAssert(!"No FBOs supported?");
- }
-}
-
-void GrGLInitializeGLInterface(GrGLInterface* glBindings) {
- Gr_bzero(glBindings, sizeof(GrGLInterface));
-
- // Indicate the type of the exported GL functions based on macros
- // pulled in from the platform includes.
-#if GR_SUPPORT_GLDESKTOP
- glBindings->fBindingsExported = kDesktop_GrGLBinding;
-#endif
-
-#if GR_SUPPORT_GLES1 && !GR_SUPPORT_GLES2
- glBindings->fBindingsExported = kES1_GrGLBinding;
-#endif
-
-#if GR_SUPPORT_GLES2
- glBindings->fBindingsExported = kES2_GrGLBinding;
-#endif
-
-#if GR_SUPPORT_GLDESKTOP || GR_SUPPORT_GLES1
- // These entry points only exist on desktop GL implementations.
- GR_GL_GET_PROC_SYMBOL(Color4ub);
- GR_GL_GET_PROC_SYMBOL(ColorPointer);
- GR_GL_GET_PROC_SYMBOL(DisableClientState);
- GR_GL_GET_PROC_SYMBOL(EnableClientState);
- GR_GL_GET_PROC_SYMBOL(LoadMatrixf);
- GR_GL_GET_PROC_SYMBOL(MatrixMode);
- GR_GL_GET_PROC_SYMBOL(PointSize);
- GR_GL_GET_PROC_SYMBOL(ShadeModel);
- GR_GL_GET_PROC_SYMBOL(TexCoordPointer);
- GR_GL_GET_PROC_SYMBOL(TexEnvi);
- GR_GL_GET_PROC_SYMBOL(VertexPointer);
- GR_GL_GET_PROC(ClientActiveTexture);
-#endif
-
- // The following gl entry points are part of GL 1.1, and will always be
- // exported as symbols.
- // Note that on windows, the wglGetProcAddress call will fail to retrieve
- // these entry points.
- GR_GL_GET_PROC_SYMBOL(BlendFunc);
- GR_GL_GET_PROC_SYMBOL(Clear);
- GR_GL_GET_PROC_SYMBOL(ClearColor);
- GR_GL_GET_PROC_SYMBOL(ClearStencil);
- GR_GL_GET_PROC_SYMBOL(ColorMask);
- GR_GL_GET_PROC_SYMBOL(CullFace);
- GR_GL_GET_PROC_SYMBOL(DeleteTextures);
- GR_GL_GET_PROC_SYMBOL(DepthMask);
- GR_GL_GET_PROC_SYMBOL(Disable);
- GR_GL_GET_PROC_SYMBOL(DrawArrays);
- GR_GL_GET_PROC_SYMBOL(DrawElements);
- GR_GL_GET_PROC_SYMBOL(Enable);
- GR_GL_GET_PROC_SYMBOL(FrontFace);
- GR_GL_GET_PROC_SYMBOL(GenTextures);
- GR_GL_GET_PROC_SYMBOL(GetError);
- GR_GL_GET_PROC_SYMBOL(GetIntegerv);
- GR_GL_GET_PROC_SYMBOL(GetString);
- GR_GL_GET_PROC_SYMBOL(LineWidth);
- GR_GL_GET_PROC_SYMBOL(PixelStorei);
- GR_GL_GET_PROC_SYMBOL(ReadPixels);
- GR_GL_GET_PROC_SYMBOL(Scissor);
- GR_GL_GET_PROC_SYMBOL(StencilFunc);
- GR_GL_GET_PROC_SYMBOL(StencilMask);
- GR_GL_GET_PROC_SYMBOL(StencilOp);
- GR_GL_GET_PROC_SYMBOL(TexImage2D);
- GR_GL_GET_PROC_SYMBOL(TexParameteri);
- GR_GL_GET_PROC_SYMBOL(TexSubImage2D);
- GR_GL_GET_PROC_SYMBOL(Viewport);
-
- // Capture the remaining entry points as gl extensions.
- GR_GL_GET_PROC(ActiveTexture);
- GR_GL_GET_PROC(AttachShader);
- GR_GL_GET_PROC(BindAttribLocation);
- GR_GL_GET_PROC(BindBuffer);
- GR_GL_GET_PROC(BindTexture);
- GR_GL_GET_PROC(BlendColor);
- GR_GL_GET_PROC(BufferData);
- GR_GL_GET_PROC(BufferSubData);
- GR_GL_GET_PROC(CompileShader);
- GR_GL_GET_PROC(CompressedTexImage2D);
- GR_GL_GET_PROC(CreateProgram);
- GR_GL_GET_PROC(CreateShader);
- GR_GL_GET_PROC(DeleteBuffers);
- GR_GL_GET_PROC(DeleteProgram);
- GR_GL_GET_PROC(DeleteShader);
- GR_GL_GET_PROC(DisableVertexAttribArray);
- GR_GL_GET_PROC(EnableVertexAttribArray);
- GR_GL_GET_PROC(GenBuffers);
- GR_GL_GET_PROC(GetBufferParameteriv);
- GR_GL_GET_PROC(GetProgramInfoLog);
- GR_GL_GET_PROC(GetProgramiv);
- GR_GL_GET_PROC(GetShaderInfoLog);
- GR_GL_GET_PROC(GetShaderiv);
- GR_GL_GET_PROC(GetUniformLocation);
- GR_GL_GET_PROC(LinkProgram);
- GR_GL_GET_PROC(ShaderSource);
- GR_GL_GET_PROC(StencilFuncSeparate);
- GR_GL_GET_PROC(StencilMaskSeparate);
- GR_GL_GET_PROC(StencilOpSeparate);
- GR_GL_GET_PROC(Uniform1fv);
- GR_GL_GET_PROC(Uniform1i);
- GR_GL_GET_PROC(Uniform4fv);
- GR_GL_GET_PROC(UniformMatrix3fv);
- GR_GL_GET_PROC(UseProgram);
- GR_GL_GET_PROC(VertexAttrib4fv);
- GR_GL_GET_PROC(VertexAttribPointer);
-
- InitializeGLInterfaceExtensions(glBindings);
-}
-
-} // unnamed namespace
GR_API void GrGLSetGLInterface(GrGLInterface* gl_interface) {
gGLInterface = gl_interface;
@@ -366,26 +81,15 @@
return gGLInterface;
}
-void GrGLSetDefaultGLInterface() {
- static GrGLInterface gDefaultInterface;
- static bool gDefaultInitialized = false;
- GrAssert(!gDefaultInitialized);
-
- if (!gDefaultInitialized) {
- GrGLInitializeGLInterface(&gDefaultInterface);
- GrGLSetGLInterface(&gDefaultInterface);
- }
-}
-
bool has_gl_extension(const char* ext) {
const char* glstr = reinterpret_cast<const char*>(
- GrGLGetGLInterface()->fGetString(GL_EXTENSIONS));
+ GrGLGetGLInterface()->fGetString(GR_GL_EXTENSIONS));
return has_gl_extension_from_string(ext, glstr);
}
void gl_version(int* major, int* minor) {
const char* v = reinterpret_cast<const char*>(
- GrGLGetGLInterface()->fGetString(GL_VERSION));
+ GrGLGetGLInterface()->fGetString(GR_GL_VERSION));
gl_version_from_string(major, minor, v);
}