blob: f012ccf24f390d20c9fecb65fffc837d66a33bfd [file] [log] [blame]
bsalomon@google.comf987d1b2011-04-04 17:13:52 +00001/*
2 Copyright 2011 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17#include "GrGLInterface.h"
18
19#include <Windows.h>
20#include <GL/GL.h>
21
22/*
23 * Windows makes the GL funcs all be __stdcall instead of __cdecl :(
24 * This implementation will only work if GR_GL_FUNCTION_TYPE is __stdcall.
25 * Otherwise, a springboard would be needed that hides the calling convention.
26 */
27
bsalomon@google.combf2a4692011-05-04 12:35:39 +000028#define GR_GL_GET_PROC(F) gDefaultInterface.f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F);
29#define GR_GL_GET_PROC_SUFFIX(F, S) gDefaultInterface.f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F #S);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000030
31void GrGLSetDefaultGLInterface() {
32 static GrGLInterface gDefaultInterface;
33 static bool gDefaultInterfaceInit;
34 if (!gDefaultInterfaceInit) {
tomhudson@google.com747bf292011-06-14 18:16:52 +000035
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000036 // wglGetProcAddress requires a context.
37 if (NULL != wglGetCurrentContext()) {
38 int major, minor;
39 const char* versionString = (const char*) glGetString(GL_VERSION);
40 const char* extString = (const char*) glGetString(GL_EXTENSIONS);
41 gl_version_from_string(&major, &minor, versionString);
42
43 if (major == 1 && minor < 5) {
44 // We must have array and element_array buffer objects.
45 return;
46 }
47
tomhudson@google.come67bd3f2011-06-16 14:08:04 +000048 gDefaultInterface.fNPOTRenderTargetSupport = kProbe_GrGLCapability;
49 gDefaultInterface.fMinRenderTargetHeight = kProbe_GrGLCapability;
50 gDefaultInterface.fMinRenderTargetWidth = kProbe_GrGLCapability;
tomhudson@google.com747bf292011-06-14 18:16:52 +000051
52 // Functions that are part of GL 1.1 will return NULL in
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000053 // wglGetProcAddress
54 gDefaultInterface.fBlendFunc = glBlendFunc;
55 gDefaultInterface.fClear = glClear;
56 gDefaultInterface.fClearColor = glClearColor;
57 gDefaultInterface.fClearStencil = glClearStencil;
58 gDefaultInterface.fColor4ub = glColor4ub;
59 gDefaultInterface.fColorMask = glColorMask;
60 gDefaultInterface.fColorPointer = glColorPointer;
61 gDefaultInterface.fCullFace = glCullFace;
62 gDefaultInterface.fDeleteTextures = glDeleteTextures;
63 gDefaultInterface.fDepthMask = glDepthMask;
64 gDefaultInterface.fDisable = glDisable;
65 gDefaultInterface.fDisableClientState = glDisableClientState;
66 gDefaultInterface.fDrawArrays = glDrawArrays;
67 gDefaultInterface.fDrawElements = glDrawElements;
68 gDefaultInterface.fEnable = glEnable;
69 gDefaultInterface.fEnableClientState = glEnableClientState;
70 gDefaultInterface.fFrontFace = glFrontFace;
71 gDefaultInterface.fGenTextures = glGenTextures;
72 gDefaultInterface.fGetError = glGetError;
73 gDefaultInterface.fGetIntegerv = glGetIntegerv;
74 gDefaultInterface.fGetString = glGetString;
bsalomon@google.comcee661a2011-07-26 12:32:36 +000075 gDefaultInterface.fGetTexLevelParameteriv = glGetTexLevelParameteriv;
bsalomon@google.comf987d1b2011-04-04 17:13:52 +000076 gDefaultInterface.fLineWidth = glLineWidth;
77 gDefaultInterface.fLoadMatrixf = glLoadMatrixf;
78 gDefaultInterface.fMatrixMode = glMatrixMode;
79 gDefaultInterface.fPixelStorei = glPixelStorei;
80 gDefaultInterface.fPointSize = glPointSize;
81 gDefaultInterface.fReadPixels = glReadPixels;
82 gDefaultInterface.fScissor = glScissor;
83 gDefaultInterface.fShadeModel = glShadeModel;
84 gDefaultInterface.fStencilFunc = glStencilFunc;
85 gDefaultInterface.fStencilMask = glStencilMask;
86 gDefaultInterface.fStencilOp = glStencilOp;
87 gDefaultInterface.fTexImage2D = glTexImage2D;
88 gDefaultInterface.fTexParameteri = glTexParameteri;
89 gDefaultInterface.fTexCoordPointer = glTexCoordPointer;
90 gDefaultInterface.fTexEnvi = glTexEnvi;
91 gDefaultInterface.fTexSubImage2D = glTexSubImage2D;
92 gDefaultInterface.fViewport = glViewport;
93 gDefaultInterface.fVertexPointer = glVertexPointer;
94
95 GR_GL_GET_PROC(ActiveTexture);
96 GR_GL_GET_PROC(AttachShader);
97 GR_GL_GET_PROC(BindAttribLocation);
98 GR_GL_GET_PROC(BindBuffer);
99 GR_GL_GET_PROC(BindTexture);
100 GR_GL_GET_PROC(BlendColor);
101 GR_GL_GET_PROC(BufferData);
102 GR_GL_GET_PROC(BufferSubData);
103 GR_GL_GET_PROC(ClientActiveTexture);
104 GR_GL_GET_PROC(CompileShader);
105 GR_GL_GET_PROC(CompressedTexImage2D);
106 GR_GL_GET_PROC(CreateProgram);
107 GR_GL_GET_PROC(CreateShader);
108 GR_GL_GET_PROC(DeleteBuffers);
109 GR_GL_GET_PROC(DeleteProgram);
110 GR_GL_GET_PROC(DeleteShader);
111 GR_GL_GET_PROC(DisableVertexAttribArray);
112 GR_GL_GET_PROC(EnableVertexAttribArray);
113 GR_GL_GET_PROC(GenBuffers);
114 GR_GL_GET_PROC(GetBufferParameteriv);
115 GR_GL_GET_PROC(GetProgramInfoLog);
116 GR_GL_GET_PROC(GetProgramiv);
117 GR_GL_GET_PROC(GetShaderInfoLog);
118 GR_GL_GET_PROC(GetShaderiv);
119 GR_GL_GET_PROC(GetUniformLocation);
120 GR_GL_GET_PROC(LinkProgram);
121 GR_GL_GET_PROC(ShaderSource);
122 GR_GL_GET_PROC(StencilFuncSeparate);
123 GR_GL_GET_PROC(StencilMaskSeparate);
124 GR_GL_GET_PROC(StencilOpSeparate);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000125 GR_GL_GET_PROC(Uniform1f);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000126 GR_GL_GET_PROC(Uniform1i);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000127 GR_GL_GET_PROC(Uniform1fv);
128 GR_GL_GET_PROC(Uniform1iv);
129 GR_GL_GET_PROC(Uniform2f);
130 GR_GL_GET_PROC(Uniform2i);
131 GR_GL_GET_PROC(Uniform2fv);
132 GR_GL_GET_PROC(Uniform2iv);
133 GR_GL_GET_PROC(Uniform3f);
134 GR_GL_GET_PROC(Uniform3i);
135 GR_GL_GET_PROC(Uniform3fv);
136 GR_GL_GET_PROC(Uniform3iv);
137 GR_GL_GET_PROC(Uniform4f);
138 GR_GL_GET_PROC(Uniform4i);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000139 GR_GL_GET_PROC(Uniform4fv);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000140 GR_GL_GET_PROC(Uniform4iv);
141 GR_GL_GET_PROC(UniformMatrix2fv);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000142 GR_GL_GET_PROC(UniformMatrix3fv);
bsalomon@google.combf2a4692011-05-04 12:35:39 +0000143 GR_GL_GET_PROC(UniformMatrix4fv);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000144 GR_GL_GET_PROC(UseProgram);
145 GR_GL_GET_PROC(VertexAttrib4fv);
146 GR_GL_GET_PROC(VertexAttribPointer);
bsalomon@google.com271cffc2011-05-20 14:13:56 +0000147 GR_GL_GET_PROC(BindFragDataLocationIndexed);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000148
149 // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since
150 // GL_ARB_framebuffer_object doesn't use ARB suffix.)
bsalomon@google.com13a950a2011-04-12 14:16:21 +0000151 if (major >= 3 || has_gl_extension_from_string("GL_ARB_framebuffer_object", extString)) {
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000152 GR_GL_GET_PROC(GenFramebuffers);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000153 GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv);
154 GR_GL_GET_PROC(GetRenderbufferParameteriv);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000155 GR_GL_GET_PROC(BindFramebuffer);
156 GR_GL_GET_PROC(FramebufferTexture2D);
157 GR_GL_GET_PROC(CheckFramebufferStatus);
158 GR_GL_GET_PROC(DeleteFramebuffers);
159 GR_GL_GET_PROC(RenderbufferStorage);
160 GR_GL_GET_PROC(GenRenderbuffers);
161 GR_GL_GET_PROC(DeleteRenderbuffers);
162 GR_GL_GET_PROC(FramebufferRenderbuffer);
163 GR_GL_GET_PROC(BindRenderbuffer);
164 GR_GL_GET_PROC(RenderbufferStorageMultisample);
165 GR_GL_GET_PROC(BlitFramebuffer);
bsalomon@google.com13a950a2011-04-12 14:16:21 +0000166 } else if (has_gl_extension_from_string("GL_EXT_framebuffer_object", extString)) {
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000167 GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT);
bsalomon@google.comcee661a2011-07-26 12:32:36 +0000168 GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT);
169 GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT);
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000170 GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT);
171 GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT);
172 GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT);
173 GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT);
174 GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT);
175 GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT);
176 GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT);
177 GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT);
178 GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT);
bsalomon@google.com13a950a2011-04-12 14:16:21 +0000179 if (has_gl_extension_from_string("GL_EXT_framebuffer_multisample", extString)) {
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000180 GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT);
181 }
bsalomon@google.com13a950a2011-04-12 14:16:21 +0000182 if (has_gl_extension_from_string("GL_EXT_framebuffer_blit", extString)) {
bsalomon@google.comf987d1b2011-04-04 17:13:52 +0000183 GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT);
184 }
185 } else {
186 // we must have FBOs
187 return;
188 }
189 GR_GL_GET_PROC(MapBuffer);
190 GR_GL_GET_PROC(UnmapBuffer);
191
192 gDefaultInterface.fBindingsExported = kDesktop_GrGLBinding;
193
194 gDefaultInterfaceInit = true;
195 }
196 }
197 if (gDefaultInterfaceInit) {
198 GrGLSetGLInterface(&gDefaultInterface);
199 }
200}