blob: 8599b6301ddf1d2509e5bf3deb8aa0fee347bf45 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
twiz@google.com59a190b2011-03-14 21:23:01 +00002 Copyright 2011 Google Inc.
reed@google.comac10a2d2010-12-22 21:39:39 +00003
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"
twiz@google.com59a190b2011-03-14 21:23:01 +000022#include "GrGLInterface.h"
twiz@google.com0f31ca72011-03-18 17:38:11 +000023#include "GrGLDefines.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000024
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000025/**
twiz@google.comb65e0cb2011-03-18 20:41:44 +000026 * The following macros are used to staticlly configure the default
27 * GrGLInterface, but should not be used outside of the GrGLInterface
28 * scaffolding. Undefine here to prevent accidental use.
29 */
30#undef GR_SUPPORT_GLDESKTOP
31#undef GR_SUPPORT_GLES1
32#undef GR_SUPPORT_GLES2
33#undef GR_SUPPORT_GLES
34
35/**
bsalomon@google.com3723a482011-02-17 21:47:25 +000036 * The following are optional defines that can be enabled at the compiler
37 * command line, in a IDE project, in a GrUserConfig.h file, or in a GL custom
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000038 * file (if one is in use). They don't require GR_GL_CUSTOM_SETUP or
bsalomon@google.com3723a482011-02-17 21:47:25 +000039 * setup GR_GL_CUSTOM_SETUP_HEADER to be enabled:
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000040 *
bsalomon@google.com3723a482011-02-17 21:47:25 +000041 * GR_GL_LOG_CALLS: if 1 Gr can print every GL call using GrPrintf. Defaults to
reed@google.com27a1e772011-03-08 15:34:06 +000042 * 0. Logging can be enabled and disabled at runtime using a debugger via to
bsalomon@google.com3723a482011-02-17 21:47:25 +000043 * global gLogCallsGL. The initial value of gLogCallsGL is controlled by
44 * GR_GL_LOG_CALLS_START.
45 *
46 * GR_GL_LOG_CALLS_START: controls the initial value of gLogCallsGL when
47 * GR_GL_LOG_CALLS is 1. Defaults to 0.
48 *
49 * GR_GL_CHECK_ERROR: if enabled Gr can do a glGetError() after every GL call.
reed@google.com27a1e772011-03-08 15:34:06 +000050 * Defaults to 1 if GR_DEBUG is set, otherwise 0. When GR_GL_CHECK_ERROR is 1
bsalomon@google.com3723a482011-02-17 21:47:25 +000051 * this can be toggled in a debugger using the gCheckErrorGL global. The initial
52 * value of gCheckErrorGL is controlled by by GR_GL_CHECK_ERROR_START.
53 *
54 * GR_GL_CHECK_ERROR_START: controls the initial value of gCheckErrorGL
55 * when GR_GL_CHECK_ERROR is 1. Defaults to 1.
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000056 */
57
reed@google.comac10a2d2010-12-22 21:39:39 +000058
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000059#if !defined(GR_GL_LOG_CALLS)
bsalomon@google.com3723a482011-02-17 21:47:25 +000060 #define GR_GL_LOG_CALLS 0
61#endif
62
63#if !defined(GR_GL_LOG_CALLS_START)
64 #define GR_GL_LOG_CALLS_START 0
65#endif
66
reed@google.com27a1e772011-03-08 15:34:06 +000067#if !defined(GR_GL_CHECK_ERROR)
bsalomon@google.com3723a482011-02-17 21:47:25 +000068 #define GR_GL_CHECK_ERROR GR_DEBUG
69#endif
70
71#if !defined(GR_GL_CHECK_ERROR_START)
72 #define GR_GL_CHECK_ERROR_START 1
bsalomon@google.com7acdb8e2011-02-11 14:07:02 +000073#endif
74
bsalomon@google.com42ab7ea2011-01-19 17:19:40 +000075////////////////////////////////////////////////////////////////////////////////
reed@google.comac10a2d2010-12-22 21:39:39 +000076
reed@google.comac10a2d2010-12-22 21:39:39 +000077#if GR_SCALAR_IS_FIXED
78 #define GrGLType GL_FIXED
79#elif GR_SCALAR_IS_FLOAT
twiz@google.com0f31ca72011-03-18 17:38:11 +000080 #define GrGLType GR_GL_FLOAT
reed@google.comac10a2d2010-12-22 21:39:39 +000081#else
82 #error "unknown GR_SCALAR type"
83#endif
84
85#if GR_TEXT_SCALAR_IS_USHORT
twiz@google.com0f31ca72011-03-18 17:38:11 +000086 #define GrGLTextType GR_GL_UNSIGNED_SHORT
reed@google.comac10a2d2010-12-22 21:39:39 +000087 #define GR_GL_TEXT_TEXTURE_NORMALIZED 1
88#elif GR_TEXT_SCALAR_IS_FLOAT
twiz@google.com0f31ca72011-03-18 17:38:11 +000089 #define GrGLTextType GR_GL_FLOAT
reed@google.comac10a2d2010-12-22 21:39:39 +000090 #define GR_GL_TEXT_TEXTURE_NORMALIZED 0
91#elif GR_TEXT_SCALAR_IS_FIXED
twiz@google.com0f31ca72011-03-18 17:38:11 +000092 #define GrGLTextType GR_GL_FIXED
reed@google.comac10a2d2010-12-22 21:39:39 +000093 #define GR_GL_TEXT_TEXTURE_NORMALIZED 0
reed@google.com63100f92011-01-18 21:32:14 +000094#else
reed@google.comac10a2d2010-12-22 21:39:39 +000095 #error "unknown GR_TEXT_SCALAR type"
96#endif
97
twiz@google.com59a190b2011-03-14 21:23:01 +000098// Pick a pixel config for 32bit bitmaps. Our default is GL_RGBA (except on
bsalomon@google.com2fbc7fa2011-01-05 16:34:41 +000099// Windows where we match GDI's order).
100#ifndef GR_GL_32BPP_COLOR_FORMAT
101 #if GR_WIN32_BUILD
bsalomon@google.comed3a0682011-01-18 16:54:04 +0000102 #define GR_GL_32BPP_COLOR_FORMAT GR_BGRA //use GR prefix because this
103 #else //may be an extension.
twiz@google.com0f31ca72011-03-18 17:38:11 +0000104 #define GR_GL_32BPP_COLOR_FORMAT GR_GL_RGBA
bsalomon@google.com2fbc7fa2011-01-05 16:34:41 +0000105 #endif
reed@google.comac10a2d2010-12-22 21:39:39 +0000106#endif
107
reed@google.comac10a2d2010-12-22 21:39:39 +0000108
reed@google.comac10a2d2010-12-22 21:39:39 +0000109
bsalomon@google.comed3a0682011-01-18 16:54:04 +0000110// BGRA format
bsalomon@google.comed3a0682011-01-18 16:54:04 +0000111#define GR_BGRA 0x80E1
112
bsalomon@google.com3f3ffd62011-01-18 17:14:52 +0000113// FBO / stencil formats
reed@google.comac10a2d2010-12-22 21:39:39 +0000114#define GR_FRAMEBUFFER 0x8D40
115#define GR_FRAMEBUFFER_COMPLETE 0x8CD5
116#define GR_COLOR_ATTACHMENT0 0x8CE0
reed@google.com63100f92011-01-18 21:32:14 +0000117#define GR_FRAMEBUFFER_BINDING 0x8CA6
reed@google.comac10a2d2010-12-22 21:39:39 +0000118#define GR_RENDERBUFFER 0x8D41
119#define GR_STENCIL_ATTACHMENT 0x8D20
bsalomon@google.com3f3ffd62011-01-18 17:14:52 +0000120#define GR_STENCIL_INDEX4 0x8D47
reed@google.comac10a2d2010-12-22 21:39:39 +0000121#define GR_STENCIL_INDEX8 0x8D48
122#define GR_STENCIL_INDEX16 0x8D49
bsalomon@google.com3f3ffd62011-01-18 17:14:52 +0000123#define GR_DEPTH24_STENCIL8 0x88F0
reed@google.comac10a2d2010-12-22 21:39:39 +0000124#define GR_MAX_RENDERBUFFER_SIZE 0x84E8
125#define GR_DEPTH_STENCIL_ATTACHMENT 0x821A
reed@google.comac10a2d2010-12-22 21:39:39 +0000126#define GR_DEPTH_STENCIL 0x84F9
127#define GR_RGBA8 0x8058
128#define GR_RGB565 0x8D62
129
130
131// Multisampling
132
133// IMG MAX_SAMPLES uses a different value than desktop, Apple ES extension.
134#define GR_MAX_SAMPLES 0x8D57
135#define GR_MAX_SAMPLES_IMG 0x9135
136#define GR_READ_FRAMEBUFFER 0x8CA8
137#define GR_DRAW_FRAMEBUFFER 0x8CA9
138
139// Buffer mapping
140#define GR_WRITE_ONLY 0x88B9
141#define GR_BUFFER_MAPPED 0x88BC
142
143// Palette texture
144#define GR_PALETTE8_RGBA8 0x8B91
145
reed@google.comac10a2d2010-12-22 21:39:39 +0000146////////////////////////////////////////////////////////////////////////////////
reed@google.com63100f92011-01-18 21:32:14 +0000147
reed@google.comac10a2d2010-12-22 21:39:39 +0000148extern void GrGLCheckErr(const char* location, const char* call);
149
150static inline void GrGLClearErr() {
twiz@google.com0f31ca72011-03-18 17:38:11 +0000151 while (GR_GL_NO_ERROR != GrGLGetGLInterface()->fGetError()) {}
reed@google.comac10a2d2010-12-22 21:39:39 +0000152}
153
bsalomon@google.com3723a482011-02-17 21:47:25 +0000154#if GR_GL_CHECK_ERROR
155 extern bool gCheckErrorGL;
156 #define GR_GL_CHECK_ERROR_IMPL(X) if (gCheckErrorGL) GrGLCheckErr(GR_FILE_AND_LINE_STR, #X)
reed@google.comac10a2d2010-12-22 21:39:39 +0000157#else
bsalomon@google.com3723a482011-02-17 21:47:25 +0000158 #define GR_GL_CHECK_ERROR_IMPL(X)
reed@google.comac10a2d2010-12-22 21:39:39 +0000159#endif
reed@google.comac10a2d2010-12-22 21:39:39 +0000160
161#if GR_GL_LOG_CALLS
bsalomon@google.com3723a482011-02-17 21:47:25 +0000162 extern bool gLogCallsGL;
163 #define GR_GL_LOG_CALLS_IMPL(X) if (gLogCallsGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
reed@google.comac10a2d2010-12-22 21:39:39 +0000164#else
bsalomon@google.com3723a482011-02-17 21:47:25 +0000165 #define GR_GL_LOG_CALLS_IMPL(X)
reed@google.comac10a2d2010-12-22 21:39:39 +0000166#endif
167
twiz@google.com59a190b2011-03-14 21:23:01 +0000168#define GR_GL(X) GrGLGetGLInterface()->f##X;; GR_GL_LOG_CALLS_IMPL(X); GR_GL_CHECK_ERROR_IMPL(X);
169#define GR_GL_NO_ERR(X) GrGLGetGLInterface()->f##X;; GR_GL_LOG_CALLS_IMPL(X); GR_GL_CHECK_ERROR_IMPL(X);
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000170
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000171#define GR_GL_SUPPORT_DESKTOP (kDesktop_GrGLBinding == GrGLGetGLInterface()->fBindingsExported)
172#define GR_GL_SUPPORT_ES1 (kES1_GrGLBinding == GrGLGetGLInterface()->fBindingsExported)
173#define GR_GL_SUPPORT_ES2 (kES2_GrGLBinding == GrGLGetGLInterface()->fBindingsExported)
174#define GR_GL_SUPPORT_ES (GR_GL_SUPPORT_ES1 || GR_GL_SUPPORT_ES2)
175
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000176////////////////////////////////////////////////////////////////////////////////
177
178/**
179 * GrGL_RestoreResetRowLength() will reset GL_UNPACK_ROW_LENGTH to 0. We write
180 * this wrapper, since GL_UNPACK_ROW_LENGTH is not available on all GL versions
181 */
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000182static inline void GrGL_RestoreResetRowLength() {
183 if (GR_GL_SUPPORT_DESKTOP) {
twiz@google.com0f31ca72011-03-18 17:38:11 +0000184 GR_GL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000185 }
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000186}
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000187
188////////////////////////////////////////////////////////////////////////////////
189
190/**
191 * Some drivers want the var-int arg to be zero-initialized on input.
192 */
193#define GR_GL_INIT_ZERO 0
194#define GR_GL_GetIntegerv(e, p) \
195 do { \
196 *(p) = GR_GL_INIT_ZERO; \
197 GR_GL(GetIntegerv(e, p)); \
198 } while (0)
199
200////////////////////////////////////////////////////////////////////////////////
201
reed@google.com27a1e772011-03-08 15:34:06 +0000202#endif