blob: c2fdc0dcceee8585018c3d17b45db60b4ba17831 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
2 Copyright 2010 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
18#ifndef GrGLConfig_DEFINED
19#define GrGLConfig_DEFINED
20
21#include "GrTypes.h"
22
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000023#if !defined(GR_GL_CUSTOM_SETUP)
24 #define GR_GL_CUSTOM_SETUP 0
25#endif
26/**
27 * We need to pull in the right GL headers and determine whether we are
28 * compiling for ES1, ES2, or desktop GL. (We allow ES1 and ES2 to both be
29 * supported in the same build but not ESx and desktop). We also need to know
30 * the platform-specific way to get extension function pointers (e.g.
31 * eglGetProcAddress). The port specifies this info explicitly or we will infer
32 * it from the GR_*_BUILD flag.
33 *
34 * To specify GL setup directly define GR_GL_CUSTOM_SETUP to 1 and define:
35 * GR_SUPPORT_GLDESKTOP or (GR_SUPPORT_GLES1 and/or GR_SUPPORT_GLES2) to 1
36 *
37 * if GR_SUPPORT_GLDESKTOP is 1 then provide:
38 * 1. The name of your GL header in GR_INCLUDE_GLDESKTOP
39 * 2. If necessary, the name of a file that includes extension
40 * definitions in GR_INCLUDE_GLDESKTOPext.
41 * if GR_SUPPORT_GLES1 is 1 then provide:
42 * 1. The name of your GL header in GR_INCLUDE_GLES1
43 * 2. If necessary, the name of a file that includes extension
44 * definitions in GR_INCLUDE_GLES1ext.
45 * if GR_SUPPORT_GLES2 is 1 then provide:
46 * 1. The name of your GL header in GR_INCLUDE_GLES2
47 * 2. If necessary, the name of a file that includes extension
48 * definitions in GR_INCLUDE_GLES2ext.
49 *
50 * Optionally, define GR_GL_FUNC to any qualifier needed on GL function
51 * pointer declarations (e.g. __stdcall).
52 *
53 * Define GR_GL_PROC_ADDRESS to take a gl function and produce a
54 * function pointer. Two examples:
55 * 1. Your platform doesn't require a proc address function, just take
56 * the address of the function:
57 * #define GR_GL_PROC_ADDRESS(X) &X
58 * 2. Your platform uses eglGetProcAddress:
59 * #define GR_GL_PROC_ADDRESS eglGetProcAddress(#X)
60 *
61 * Optionally define GR_GL_PROC_ADDRESS_HEADER to include any additional
62 * header necessary to use GR_GL_PROC_ADDRESS (e.g. <EGL/egl.h>)
63 *
64 * Alternatively, define GR_GL_CUSTOM_SETUP_HEADER (and not GR_GL_CUSTOM_SETUP)
65 * to a header that can be included. This file should:
66 * 1. Define the approprate GR_SUPPORT_GL* macro(s) to 1
67 * 2. Includes all necessary GL headers.
68 * 3. Optionally define GR_GL_FUNC.
69 * 4. Define GR_GL_PROC_ADDRESS.
70 * 5. Optionally define GR_GL_PROC_ADDRESS_HEADER
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000071 *
bsalomon@google.com1c13c962011-02-14 16:51:21 +000072 *------------------------------------------------------------------------------
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000073 *
74 * The following are optional defines that can be enabled as command line macros
75 * defines, in a IDE project, in a GrUserConfig.h file, or in a GL custom setup
76 * file (if one is in use). They don't require GR_GL_CUSTOM_SETUP or
77 * GR_GL_CUSTOM_SETUP_HEADER to be enabled:
78 *
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000079 * GR_GL_LOG_CALLS if 1 GrPrintf every GL call (for debugging purposes) when the
80 * global gPrintGL is true (it is initially true).
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000081 */
82
83#if GR_GL_CUSTOM_SETUP
84
85 #ifdef GR_SUPPORT_GLES1
86 #include GR_INCLUDE_GLES1
87 #if defined(GR_INCLUDE_GLES1ext)
88 #include GR_INCLUDE_GLES1ext
89 #endif
reed@google.comac10a2d2010-12-22 21:39:39 +000090 #endif
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000091
92 #ifdef GR_SUPPORT_GLES2
93 #include GR_INCLUDE_GLES2
94 #if defined(GR_INCLUDE_GLES2ext)
95 #include GR_INCLUDE_GLES2ext
96 #endif
reed@google.comac10a2d2010-12-22 21:39:39 +000097 #endif
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000098
99 #ifdef GR_SUPPORT_GLDESKTOP
100 #include GR_INCLUDE_GLDESKTOP
101 #if defined(GR_INCLUDE_GLDESKTOPext)
102 #include GR_INCLUDE_GLDESKTOPext
103 #endif
reed@google.comac10a2d2010-12-22 21:39:39 +0000104 #endif
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000105
106#elif defined(GR_GL_CUSTOM_SETUP_HEADER)
107
108 #include GR_GL_CUSTOM_SETUP_HEADER
109
reed@google.comac10a2d2010-12-22 21:39:39 +0000110#else
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +0000111 #undef GR_GL_FUNC
112 #undef GR_GL_PROC_ADDRESS
113 #undef GR_GL_PROC_ADDRESS_HEADER
reed@google.comac10a2d2010-12-22 21:39:39 +0000114
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000115 #if GR_WIN32_BUILD
116 #define GR_SUPPORT_GLDESKTOP 1
117 // glew has to be included before gl
118 #include <GL/glew.h>
119 #include <GL/gl.h>
120 // remove stupid windows defines
121 #undef near
122 #undef far
123 #define GR_GL_FUNC __stdcall
124 #define GR_GL_PROC_ADDRESS(X) wglGetProcAddress(#X)
125 #define GR_GL_PROC_ADDRESS_HEADER <windows.h>
126 #elif GR_MAC_BUILD
127 #define GR_SUPPORT_GLDESKTOP 1
128 #include <OpenGL/gl.h>
129 #include <OpenGL/glext.h>
130 #define GR_GL_PROC_ADDRESS(X) &X
131 #elif GR_IOS_BUILD
132 #define GR_SUPPORT_GLES1 1
133 #include <OpenGLES/ES1/gl.h>
134 #include <OpenGLES/ES1/glext.h>
135 #define GR_SUPPORT_GLES2 1
136 #include <OpenGLES/ES2/gl.h>
137 #include <OpenGLES/ES2/glext.h>
138 #define GR_GL_PROC_ADDRESS(X) &X
139 #elif GR_ANDROID_BUILD
140 #ifndef GL_GLEXT_PROTOTYPES
141 #define GL_GLEXT_PROTOTYPES
142 #endif
143 #define GR_SUPPORT_GLES2 1
144 #include <GLES2/gl2.h>
145 #include <GLES2/gl2ext.h>
146 #define GR_GL_PROC_ADDRESS(X) eglGetProcAddress(#X)
147 #define GR_GL_PROC_ADDRESS_HEADER <EGL/egl.h>
148 #elif GR_QNX_BUILD
149 #ifndef GL_GLEXT_PROTOTYPES
150 #define GL_GLEXT_PROTOTYPES
151 #endif
152 #define GR_SUPPORT_GLES2 1
153 // This is needed by the QNX GLES2 headers
154 #define GL_API_EXT
155 #include <GLES2/gl2.h>
156 #include <GLES2/gl2ext.h>
157 #define GR_GL_PROC_ADDRESS(X) eglGetProcAddress(#X)
158 #define GR_GL_PROC_ADDRESS_HEADER <EGL/egl.h>
159 #elif GR_LINUX_BUILD
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +0000160 #ifndef GL_GLEXT_PROTOTYPES
161 #define GL_GLEXT_PROTOTYPES
reed@google.com9341bb62011-01-26 17:11:51 +0000162 #endif
reed@google.come42e8452011-01-26 17:20:51 +0000163 #define GL_EXT_framebuffer_blit 0
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000164 #include <GL/gl.h>
165 #include <GL/glext.h>
reed@google.com9341bb62011-01-26 17:11:51 +0000166 #define GR_GL_PROC_ADDRESS(X) &X
reed@google.come42e8452011-01-26 17:20:51 +0000167 #define GR_SUPPORT_GLDESKTOP 1
reed@google.comac10a2d2010-12-22 21:39:39 +0000168 #else
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000169 #error "unsupported GR_???_BUILD"
reed@google.comac10a2d2010-12-22 21:39:39 +0000170 #endif
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000171
reed@google.comac10a2d2010-12-22 21:39:39 +0000172#endif
173
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000174#if !defined(GR_SUPPORT_GLDESKTOP)
175 #define GR_SUPPORT_GLDESKTOP 0
176#endif
177#if !defined(GR_SUPPORT_GLES1)
178 #define GR_SUPPORT_GLES1 0
179#endif
180#if !defined(GR_SUPPORT_GLES2)
181 #define GR_SUPPORT_GLES2 0
reed@google.comac10a2d2010-12-22 21:39:39 +0000182#endif
183
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000184#define GR_SUPPORT_GLES ((GR_SUPPORT_GLES1) || (GR_SUPPORT_GLES2))
bsalomon@google.com8531c1c2011-01-13 19:52:45 +0000185
reed@google.combf858b72011-01-19 19:04:04 +0000186#if !GR_SUPPORT_GLES && !GR_SUPPORT_GLDESKTOP
187 #error "Either desktop or ES GL must be supported"
188#elif GR_SUPPORT_GLES && GR_SUPPORT_GLDESKTOP
189 #error "Cannot support both desktop and ES GL"
reed@google.comac10a2d2010-12-22 21:39:39 +0000190#endif
191
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000192#if !defined(GR_GL_FUNC)
193 #define GR_GL_FUNC
reed@google.comac10a2d2010-12-22 21:39:39 +0000194#endif
195
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000196#if !defined(GR_GL_PROC_ADDRESS)
197 #error "Must define GR_GL_PROC_ADDRESS"
reed@google.comac10a2d2010-12-22 21:39:39 +0000198#endif
199
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +0000200#if !defined(GR_GL_LOG_CALLS)
201 #define GR_GL_LOG_CALLS 0
202#endif
203
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000204////////////////////////////////////////////////////////////////////////////////
reed@google.comac10a2d2010-12-22 21:39:39 +0000205
reed@google.comac10a2d2010-12-22 21:39:39 +0000206#if GR_SCALAR_IS_FIXED
207 #define GrGLType GL_FIXED
208#elif GR_SCALAR_IS_FLOAT
209 #define GrGLType GL_FLOAT
210#else
211 #error "unknown GR_SCALAR type"
212#endif
213
214#if GR_TEXT_SCALAR_IS_USHORT
215 #define GrGLTextType GL_UNSIGNED_SHORT
216 #define GR_GL_TEXT_TEXTURE_NORMALIZED 1
217#elif GR_TEXT_SCALAR_IS_FLOAT
218 #define GrGLTextType GL_FLOAT
219 #define GR_GL_TEXT_TEXTURE_NORMALIZED 0
220#elif GR_TEXT_SCALAR_IS_FIXED
221 #define GrGLTextType GL_FIXED
222 #define GR_GL_TEXT_TEXTURE_NORMALIZED 0
reed@google.com63100f92011-01-18 21:32:14 +0000223#else
reed@google.comac10a2d2010-12-22 21:39:39 +0000224 #error "unknown GR_TEXT_SCALAR type"
225#endif
226
bsalomon@google.com2fbc7fa2011-01-05 16:34:41 +0000227// Pick a pixel config for 32bit bitmaps. Our default is GL_RGBA (expect on
228// Windows where we match GDI's order).
229#ifndef GR_GL_32BPP_COLOR_FORMAT
230 #if GR_WIN32_BUILD
bsalomon@google.comed3a0682011-01-18 16:54:04 +0000231 #define GR_GL_32BPP_COLOR_FORMAT GR_BGRA //use GR prefix because this
232 #else //may be an extension.
bsalomon@google.com2fbc7fa2011-01-05 16:34:41 +0000233 #define GR_GL_32BPP_COLOR_FORMAT GL_RGBA
234 #endif
reed@google.comac10a2d2010-12-22 21:39:39 +0000235#endif
236
237////////////////////////////////////////////////////////////////////////////////
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000238// Setup for opengl ES/desktop extensions
239// We make a struct of function pointers so that each GL context
reed@google.com63100f92011-01-18 21:32:14 +0000240// can have it's own struct. (Some environments may have different proc
reed@google.comac10a2d2010-12-22 21:39:39 +0000241// addresses for different contexts).
242
243extern "C" {
244struct GrGLExts {
245// FBO
246 GLvoid (GR_GL_FUNC *GenFramebuffers)(GLsizei n, GLuint *framebuffers);
247 GLvoid (GR_GL_FUNC *BindFramebuffer)(GLenum target, GLuint framebuffer);
248 GLvoid (GR_GL_FUNC *FramebufferTexture2D)(GLenum target, GLenum attachment,
reed@google.com63100f92011-01-18 21:32:14 +0000249 GLenum textarget, GLuint texture,
reed@google.comac10a2d2010-12-22 21:39:39 +0000250 GLint level);
251 GLenum (GR_GL_FUNC *CheckFramebufferStatus)(GLenum target);
reed@google.com63100f92011-01-18 21:32:14 +0000252 GLvoid (GR_GL_FUNC *DeleteFramebuffers)(GLsizei n, const
reed@google.comac10a2d2010-12-22 21:39:39 +0000253 GLuint *framebuffers);
reed@google.com63100f92011-01-18 21:32:14 +0000254 GLvoid (GR_GL_FUNC *RenderbufferStorage)(GLenum target,
reed@google.comac10a2d2010-12-22 21:39:39 +0000255 GLenum internalformat,
256 GLsizei width, GLsizei height);
257 GLvoid (GR_GL_FUNC *GenRenderbuffers)(GLsizei n, GLuint *renderbuffers);
reed@google.com63100f92011-01-18 21:32:14 +0000258 GLvoid (GR_GL_FUNC *DeleteRenderbuffers)(GLsizei n,
reed@google.comac10a2d2010-12-22 21:39:39 +0000259 const GLuint *renderbuffers);
reed@google.com63100f92011-01-18 21:32:14 +0000260 GLvoid (GR_GL_FUNC *FramebufferRenderbuffer)(GLenum target,
reed@google.comac10a2d2010-12-22 21:39:39 +0000261 GLenum attachment,
reed@google.com63100f92011-01-18 21:32:14 +0000262 GLenum renderbuffertarget,
reed@google.comac10a2d2010-12-22 21:39:39 +0000263 GLuint renderbuffer);
264 GLvoid (GR_GL_FUNC *BindRenderbuffer)(GLenum target, GLuint renderbuffer);
265
266// Multisampling
267 // same prototype for ARB_FBO, EXT_FBO, GL 3.0, & Apple ES extension
reed@google.com63100f92011-01-18 21:32:14 +0000268 GLvoid (GR_GL_FUNC *RenderbufferStorageMultisample)(GLenum target,
reed@google.comac10a2d2010-12-22 21:39:39 +0000269 GLsizei samples,
270 GLenum internalformat,
reed@google.com63100f92011-01-18 21:32:14 +0000271 GLsizei width,
reed@google.comac10a2d2010-12-22 21:39:39 +0000272 GLsizei height);
273 // desktop: ext_fbo_blit, arb_fbo, gl 3.0
reed@google.com63100f92011-01-18 21:32:14 +0000274 GLvoid (GR_GL_FUNC *BlitFramebuffer)(GLint srcX0, GLint srcY0,
reed@google.comac10a2d2010-12-22 21:39:39 +0000275 GLint srcX1, GLint srcY1,
reed@google.com63100f92011-01-18 21:32:14 +0000276 GLint dstX0, GLint dstY0,
reed@google.comac10a2d2010-12-22 21:39:39 +0000277 GLint dstX1, GLint dstY1,
278 GLbitfield mask, GLenum filter);
279 // apple's es extension
280 GLvoid (GR_GL_FUNC *ResolveMultisampleFramebuffer)();
281
282 // IMG'e es extension
reed@google.com63100f92011-01-18 21:32:14 +0000283 GLvoid (GR_GL_FUNC *FramebufferTexture2DMultisample)(GLenum target,
reed@google.comac10a2d2010-12-22 21:39:39 +0000284 GLenum attachment,
reed@google.com63100f92011-01-18 21:32:14 +0000285 GLenum textarget,
286 GLuint texture,
287 GLint level,
reed@google.comac10a2d2010-12-22 21:39:39 +0000288 GLsizei samples);
289
290// Buffer mapping (extension in ES).
291 GLvoid* (GR_GL_FUNC *MapBuffer)(GLenum target, GLenum access);
292 GLboolean (GR_GL_FUNC *UnmapBuffer)(GLenum target);
293};
294}
295
bsalomon@google.comed3a0682011-01-18 16:54:04 +0000296// BGRA format
297
298#define GR_BGRA 0x80E1
299
bsalomon@google.com3f3ffd62011-01-18 17:14:52 +0000300// FBO / stencil formats
reed@google.comac10a2d2010-12-22 21:39:39 +0000301#define GR_FRAMEBUFFER 0x8D40
302#define GR_FRAMEBUFFER_COMPLETE 0x8CD5
303#define GR_COLOR_ATTACHMENT0 0x8CE0
reed@google.com63100f92011-01-18 21:32:14 +0000304#define GR_FRAMEBUFFER_BINDING 0x8CA6
reed@google.comac10a2d2010-12-22 21:39:39 +0000305#define GR_RENDERBUFFER 0x8D41
306#define GR_STENCIL_ATTACHMENT 0x8D20
bsalomon@google.com3f3ffd62011-01-18 17:14:52 +0000307#define GR_STENCIL_INDEX4 0x8D47
reed@google.comac10a2d2010-12-22 21:39:39 +0000308#define GR_STENCIL_INDEX8 0x8D48
309#define GR_STENCIL_INDEX16 0x8D49
bsalomon@google.com3f3ffd62011-01-18 17:14:52 +0000310#define GR_DEPTH24_STENCIL8 0x88F0
reed@google.comac10a2d2010-12-22 21:39:39 +0000311#define GR_MAX_RENDERBUFFER_SIZE 0x84E8
312#define GR_DEPTH_STENCIL_ATTACHMENT 0x821A
reed@google.comac10a2d2010-12-22 21:39:39 +0000313#define GR_DEPTH_STENCIL 0x84F9
314#define GR_RGBA8 0x8058
315#define GR_RGB565 0x8D62
316
317
318// Multisampling
319
320// IMG MAX_SAMPLES uses a different value than desktop, Apple ES extension.
321#define GR_MAX_SAMPLES 0x8D57
322#define GR_MAX_SAMPLES_IMG 0x9135
323#define GR_READ_FRAMEBUFFER 0x8CA8
324#define GR_DRAW_FRAMEBUFFER 0x8CA9
325
326// Buffer mapping
327#define GR_WRITE_ONLY 0x88B9
328#define GR_BUFFER_MAPPED 0x88BC
329
330// Palette texture
331#define GR_PALETTE8_RGBA8 0x8B91
332
333extern void GrGLInitExtensions(GrGLExts* exts);
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +0000334
reed@google.comac10a2d2010-12-22 21:39:39 +0000335////////////////////////////////////////////////////////////////////////////////
reed@google.com63100f92011-01-18 21:32:14 +0000336
reed@google.comac10a2d2010-12-22 21:39:39 +0000337extern void GrGLCheckErr(const char* location, const char* call);
338
339static inline void GrGLClearErr() {
reed@google.com63100f92011-01-18 21:32:14 +0000340 while (GL_NO_ERROR != glGetError()) {}
reed@google.comac10a2d2010-12-22 21:39:39 +0000341}
342
343// GR_FORCE_GLCHECKERR can be defined by GrUserConfig.h
344#if defined(GR_FORCE_GLCHECKERR)
345 #define GR_LOCAL_CALL_CHECKERR GR_FORCE_GLCHECKERR
346#else
347 #define GR_LOCAL_CALL_CHECKERR GR_DEBUG
348#endif
349static inline void GrDebugGLCheckErr(const char* location, const char* call) {
350#if GR_LOCAL_CALL_CHECKERR
351 GrGLCheckErr(location, call);
352#endif
353}
354#undef GR_LOCAL_CALL_CHECKERR
355
356#if GR_GL_LOG_CALLS
357 extern bool gPrintGL;
358 #define GR_GL(X) gl ## X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X); if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
359 #define GR_GL_NO_ERR(X) GrGLClearErr(); gl ## X; if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
360 #define GR_GLEXT(exts, X) exts. X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X); if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
361 #define GR_GLEXT_NO_ERR(exts, X) GrGLClearErr(); exts. X; if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
362#else
363 #define GR_GL(X) gl ## X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X)
364 #define GR_GL_NO_ERR(X) GrGLClearErr(); gl ## X
365 #define GR_GLEXT(exts, X) exts. X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X)
366 #define GR_GLEXT_NO_ERR(exts, X) GrGLClearErr(); exts. X
367#endif
368
369#endif