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/win/GrGLDefaultInterface_win.cpp b/gpu/src/win/GrGLDefaultInterface_win.cpp
new file mode 100644
index 0000000..0a2c786
--- /dev/null
+++ b/gpu/src/win/GrGLDefaultInterface_win.cpp
@@ -0,0 +1,178 @@
+/*
+    Copyright 2011 Google Inc.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+ */
+
+#include "GrGLInterface.h"
+
+#include <Windows.h>
+#include <GL/GL.h>
+
+/*
+ * Windows makes the GL funcs all be __stdcall instead of __cdecl :(
+ * This implementation will only work if GR_GL_FUNCTION_TYPE is __stdcall.
+ * Otherwise, a springboard would be needed that hides the calling convention.
+ */
+
+#define GR_GL_GET_PROC(F) gDefaultInterface.f ## F = (GrGLInterface::GrGL ## F ## Proc) wglGetProcAddress("gl" #F);
+#define GR_GL_GET_PROC_SUFFIX(F, S) gDefaultInterface.f ## F = (GrGLInterface::GrGL ## F ## Proc) wglGetProcAddress("gl" #F #S);
+
+void GrGLSetDefaultGLInterface() {
+    static GrGLInterface gDefaultInterface;
+    static bool gDefaultInterfaceInit;
+    if (!gDefaultInterfaceInit) {
+        
+        // wglGetProcAddress requires a context.
+        if (NULL != wglGetCurrentContext()) {
+            int major, minor;
+            const char* versionString = (const char*) glGetString(GL_VERSION);
+            const char* extString = (const char*) glGetString(GL_EXTENSIONS);
+            gl_version_from_string(&major, &minor, versionString);
+
+            if (major == 1 && minor < 5) {
+                // We must have array and element_array buffer objects.
+                return;
+            }
+
+            // Functions that are part of GL 1.1 will return NULL in 
+            // wglGetProcAddress
+            gDefaultInterface.fBlendFunc = glBlendFunc;
+            gDefaultInterface.fClear = glClear;
+            gDefaultInterface.fClearColor = glClearColor;
+            gDefaultInterface.fClearStencil = glClearStencil;
+            gDefaultInterface.fColor4ub = glColor4ub;
+            gDefaultInterface.fColorMask = glColorMask;
+            gDefaultInterface.fColorPointer = glColorPointer;
+            gDefaultInterface.fCullFace = glCullFace;
+            gDefaultInterface.fDeleteTextures = glDeleteTextures;
+            gDefaultInterface.fDepthMask = glDepthMask;
+            gDefaultInterface.fDisable = glDisable;
+            gDefaultInterface.fDisableClientState = glDisableClientState;
+            gDefaultInterface.fDrawArrays = glDrawArrays;
+            gDefaultInterface.fDrawElements = glDrawElements;
+            gDefaultInterface.fEnable = glEnable;
+            gDefaultInterface.fEnableClientState = glEnableClientState;
+            gDefaultInterface.fFrontFace = glFrontFace;
+            gDefaultInterface.fGenTextures = glGenTextures;
+            gDefaultInterface.fGetError = glGetError;
+            gDefaultInterface.fGetIntegerv = glGetIntegerv;
+            gDefaultInterface.fGetString = glGetString;
+            gDefaultInterface.fLineWidth = glLineWidth;
+            gDefaultInterface.fLoadMatrixf = glLoadMatrixf;
+            gDefaultInterface.fMatrixMode = glMatrixMode;
+            gDefaultInterface.fPixelStorei = glPixelStorei;
+            gDefaultInterface.fPointSize = glPointSize;
+            gDefaultInterface.fReadPixels = glReadPixels;
+            gDefaultInterface.fScissor = glScissor;
+            gDefaultInterface.fShadeModel = glShadeModel;
+            gDefaultInterface.fStencilFunc = glStencilFunc;
+            gDefaultInterface.fStencilMask = glStencilMask;
+            gDefaultInterface.fStencilOp = glStencilOp;
+            gDefaultInterface.fTexImage2D = glTexImage2D;
+            gDefaultInterface.fTexParameteri = glTexParameteri;
+            gDefaultInterface.fTexCoordPointer = glTexCoordPointer;
+            gDefaultInterface.fTexEnvi = glTexEnvi;
+            gDefaultInterface.fTexSubImage2D = glTexSubImage2D;
+            gDefaultInterface.fViewport = glViewport;
+            gDefaultInterface.fVertexPointer = glVertexPointer;
+
+            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(ClientActiveTexture);
+            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);
+
+            // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
+            // GL_ARB_framebuffer_object doesn't use ARB suffix.)
+            if (major >= 3 || has_gl_extension("GL_ARB_framebuffer_object")) {
+                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);
+            } else if (has_gl_extension_from_string("GL_EXT_framebuffer_object",
+                                                    extString)) {
+                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);
+                if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample",
+                                                 extString)) {
+                    GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
+                }
+                if (has_gl_extension_from_string("GL_EXT_framebuffer_blit",
+                                                 extString)) {
+                    GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
+                }
+            } else {
+                // we must have FBOs
+                return;
+            }
+            GR_GL_GET_PROC(MapBuffer);
+            GR_GL_GET_PROC(UnmapBuffer);
+
+            gDefaultInterface.fBindingsExported = kDesktop_GrGLBinding;
+
+            gDefaultInterfaceInit = true;
+        }
+    }
+    if (gDefaultInterfaceInit) {
+        GrGLSetGLInterface(&gDefaultInterface);
+    }
+}