blob: f43e88e3f096272e5b84175422098edfc9231190 [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.comc312bf92011-03-21 21:10:33 +0000102 #define GR_GL_32BPP_COLOR_FORMAT GR_GL_BGRA
103 #else
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.com63100f92011-01-18 21:32:14 +0000109
reed@google.comac10a2d2010-12-22 21:39:39 +0000110extern void GrGLCheckErr(const char* location, const char* call);
111
112static inline void GrGLClearErr() {
twiz@google.com0f31ca72011-03-18 17:38:11 +0000113 while (GR_GL_NO_ERROR != GrGLGetGLInterface()->fGetError()) {}
reed@google.comac10a2d2010-12-22 21:39:39 +0000114}
115
bsalomon@google.com3723a482011-02-17 21:47:25 +0000116#if GR_GL_CHECK_ERROR
117 extern bool gCheckErrorGL;
118 #define GR_GL_CHECK_ERROR_IMPL(X) if (gCheckErrorGL) GrGLCheckErr(GR_FILE_AND_LINE_STR, #X)
reed@google.comac10a2d2010-12-22 21:39:39 +0000119#else
bsalomon@google.com3723a482011-02-17 21:47:25 +0000120 #define GR_GL_CHECK_ERROR_IMPL(X)
reed@google.comac10a2d2010-12-22 21:39:39 +0000121#endif
reed@google.comac10a2d2010-12-22 21:39:39 +0000122
123#if GR_GL_LOG_CALLS
bsalomon@google.com3723a482011-02-17 21:47:25 +0000124 extern bool gLogCallsGL;
125 #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 +0000126#else
bsalomon@google.com3723a482011-02-17 21:47:25 +0000127 #define GR_GL_LOG_CALLS_IMPL(X)
reed@google.comac10a2d2010-12-22 21:39:39 +0000128#endif
129
twiz@google.com59a190b2011-03-14 21:23:01 +0000130#define GR_GL(X) GrGLGetGLInterface()->f##X;; GR_GL_LOG_CALLS_IMPL(X); GR_GL_CHECK_ERROR_IMPL(X);
131#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 +0000132
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000133#define GR_GL_SUPPORT_DESKTOP (kDesktop_GrGLBinding == GrGLGetGLInterface()->fBindingsExported)
134#define GR_GL_SUPPORT_ES1 (kES1_GrGLBinding == GrGLGetGLInterface()->fBindingsExported)
135#define GR_GL_SUPPORT_ES2 (kES2_GrGLBinding == GrGLGetGLInterface()->fBindingsExported)
136#define GR_GL_SUPPORT_ES (GR_GL_SUPPORT_ES1 || GR_GL_SUPPORT_ES2)
137
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000138////////////////////////////////////////////////////////////////////////////////
139
140/**
141 * GrGL_RestoreResetRowLength() will reset GL_UNPACK_ROW_LENGTH to 0. We write
142 * this wrapper, since GL_UNPACK_ROW_LENGTH is not available on all GL versions
143 */
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000144static inline void GrGL_RestoreResetRowLength() {
145 if (GR_GL_SUPPORT_DESKTOP) {
twiz@google.com0f31ca72011-03-18 17:38:11 +0000146 GR_GL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000147 }
twiz@google.comb65e0cb2011-03-18 20:41:44 +0000148}
bsalomon@google.com8895a7a2011-02-18 16:09:55 +0000149
150////////////////////////////////////////////////////////////////////////////////
151
152/**
153 * Some drivers want the var-int arg to be zero-initialized on input.
154 */
155#define GR_GL_INIT_ZERO 0
156#define GR_GL_GetIntegerv(e, p) \
157 do { \
158 *(p) = GR_GL_INIT_ZERO; \
159 GR_GL(GetIntegerv(e, p)); \
160 } while (0)
161
162////////////////////////////////////////////////////////////////////////////////
163
reed@google.com27a1e772011-03-08 15:34:06 +0000164#endif