1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef UI_GL_GL_BINDINGS_H_
6 #define UI_GL_GL_BINDINGS_H_
8 // Includes the platform independent and platform dependent GL headers.
9 // Only include this in cc files. It pulls in system headers, including
10 // the X11 headers on linux, which define all kinds of macros that are
11 // liable to cause conflicts.
16 #include <EGL/eglext.h>
18 #include "base/logging.h"
19 #include "base/threading/thread_local.h"
20 #include "build/build_config.h"
21 #include "ui/gl/gl_export.h"
23 // The standard OpenGL native extension headers are also included.
25 #include <GL/wglext.h>
26 #elif defined(OS_MACOSX)
27 #include <OpenGL/OpenGL.h>
28 #elif defined(USE_X11)
30 #include <GL/glxext.h>
32 // Undefine some macros defined by X headers. This is why this file should only
33 // be included in .cc files.
40 // GLES2 defines not part of Desktop GL
41 // Shader Precision-Specified Types
42 #define GL_LOW_FLOAT 0x8DF0
43 #define GL_MEDIUM_FLOAT 0x8DF1
44 #define GL_HIGH_FLOAT 0x8DF2
45 #define GL_LOW_INT 0x8DF3
46 #define GL_MEDIUM_INT 0x8DF4
47 #define GL_HIGH_INT 0x8DF5
48 #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
49 #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
50 #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
51 #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
52 #define GL_MAX_VARYING_VECTORS 0x8DFC
53 #define GL_SHADER_BINARY_FORMATS 0x8DF8
54 #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
55 #define GL_SHADER_COMPILER 0x8DFA
56 #define GL_RGB565 0x8D62
57 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B
58 #define GL_RGB8_OES 0x8051
59 #define GL_RGBA8_OES 0x8058
60 #define GL_HALF_FLOAT_OES 0x8D61
62 // GL_OES_EGL_image_external
63 #define GL_TEXTURE_EXTERNAL_OES 0x8D65
64 #define GL_SAMPLER_EXTERNAL_OES 0x8D66
65 #define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67
66 #define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68
68 // GL_ANGLE_translated_shader_source
69 #define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
72 #define GL_UNPACK_FLIP_Y_CHROMIUM 0x9240
74 #define GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM 0x9241
75 #define GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM 0x9242
76 #define GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM 0x9243
77 #define GL_BIND_GENERATES_RESOURCE_CHROMIUM 0x9244
79 // GL_CHROMIUM_gpu_memory_manager
80 #define GL_TEXTURE_POOL_CHROMIUM 0x6000
81 #define GL_TEXTURE_POOL_MANAGED_CHROMIUM 0x6001
82 #define GL_TEXTURE_POOL_UNMANAGED_CHROMIUM 0x6002
84 // GL_ANGLE_pack_reverse_row_order
85 #define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4
87 // GL_ANGLE_texture_usage
88 #define GL_TEXTURE_USAGE_ANGLE 0x93A2
89 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3
91 // GL_EXT_texture_storage
92 #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F
93 #define GL_ALPHA8_EXT 0x803C
94 #define GL_LUMINANCE8_EXT 0x8040
95 #define GL_LUMINANCE8_ALPHA8_EXT 0x8045
96 #define GL_RGBA32F_EXT 0x8814
97 #define GL_RGB32F_EXT 0x8815
98 #define GL_ALPHA32F_EXT 0x8816
99 #define GL_LUMINANCE32F_EXT 0x8818
100 #define GL_LUMINANCE_ALPHA32F_EXT 0x8819
101 #define GL_RGBA16F_EXT 0x881A
102 #define GL_RGB16F_EXT 0x881B
103 #define GL_ALPHA16F_EXT 0x881C
104 #define GL_LUMINANCE16F_EXT 0x881E
105 #define GL_LUMINANCE_ALPHA16F_EXT 0x881F
106 #define GL_BGRA8_EXT 0x93A1
108 // GL_ANGLE_instanced_arrays
109 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE
111 // GL_EXT_occlusion_query_boolean
112 #define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F
113 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A
114 #define GL_CURRENT_QUERY_EXT 0x8865
115 #define GL_QUERY_RESULT_EXT 0x8866
116 #define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867
118 // GL_CHROMIUM_command_buffer_query
119 #define GL_COMMANDS_ISSUED_CHROMIUM 0x84F2
121 /* GL_CHROMIUM_get_error_query */
122 #define GL_GET_ERROR_QUERY_CHROMIUM 0x84F3
124 /* GL_CHROMIUM_command_buffer_latency_query */
125 #define GL_LATENCY_QUERY_CHROMIUM 0x84F4
127 /* GL_CHROMIUM_async_pixel_transfers */
128 #define GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM 0x84F5
129 #define GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM 0x84F6
131 // GL_CHROMIUM_sync_query
132 #define GL_COMMANDS_COMPLETED_CHROMIUM 0x84F7
135 #define GL_IMAGE_ROWBYTES_CHROMIUM 0x78F0
136 #define GL_IMAGE_MAP_CHROMIUM 0x78F1
137 #define GL_IMAGE_SCANOUT_CHROMIUM 0x78F2
139 // GL_CHROMIUM_schedule_overlay_plane
140 #define GL_OVERLAY_TRANSFORM_NONE_CHROMIUM 0x9245
141 #define GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM 0x9246
142 #define GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM 0x9247
143 #define GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM 0x9248
144 #define GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM 0x9249
145 #define GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM 0x924A
148 #define GL_SAMPLER_3D_OES 0x8B5F
151 #define GL_DEPTH_COMPONENT24_OES 0x81A6
154 #define GL_DEPTH_COMPONENT32_OES 0x81A7
156 // GL_OES_packed_depth_stencil
157 #ifndef GL_DEPTH24_STENCIL8_OES
158 #define GL_DEPTH24_STENCIL8_OES 0x88F0
161 #ifndef GL_DEPTH24_STENCIL8
162 #define GL_DEPTH24_STENCIL8 0x88F0
165 // GL_OES_compressed_ETC1_RGB8_texture
166 #define GL_ETC1_RGB8_OES 0x8D64
168 // GL_AMD_compressed_ATC_texture
169 #define GL_ATC_RGB_AMD 0x8C92
170 #define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93
171 #define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE
173 // GL_IMG_texture_compression_pvrtc
174 #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
175 #define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
176 #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
177 #define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
179 // GL_OES_vertex_array_object
180 #define GL_VERTEX_ARRAY_BINDING_OES 0x85B5
182 // GL_CHROMIUM_pixel_transfer_buffer_object
183 #define GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM 0x78EC
184 #define GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM 0x78ED
185 #define GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM 0x78EE
186 #define GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM 0x78EF
188 /* GL_EXT_discard_framebuffer */
189 #ifndef GL_EXT_discard_framebuffer
190 #define GL_COLOR_EXT 0x1800
191 #define GL_DEPTH_EXT 0x1801
192 #define GL_STENCIL_EXT 0x1802
195 // GL_ARB_get_program_binary
196 #define PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
197 // GL_OES_get_program_binary
198 #define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
199 #define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE
200 #define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF
202 #ifndef GL_EXT_multisampled_render_to_texture
203 #define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
204 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
205 #define GL_MAX_SAMPLES_EXT 0x8D57
206 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C
209 #ifndef GL_IMG_multisampled_render_to_texture
210 #define GL_RENDERBUFFER_SAMPLES_IMG 0x9133
211 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134
212 #define GL_MAX_SAMPLES_IMG 0x9135
213 #define GL_TEXTURE_SAMPLES_IMG 0x9136
216 #define GL_GLEXT_PROTOTYPES 1
219 #define GL_BINDING_CALL WINAPI
221 #define GL_BINDING_CALL
224 #define GL_SERVICE_LOG(args) DLOG(INFO) << args;
226 #define GL_SERVICE_LOG_CODE_BLOCK(code)
228 #define GL_SERVICE_LOG_CODE_BLOCK(code) code
231 // Forward declare OSMesa types.
232 typedef struct osmesa_context
*OSMesaContext
;
233 typedef void (*OSMESAproc
)();
235 // Forward declare EGL types.
236 typedef uint64 EGLuint64CHROMIUM
;
238 #include "gl_bindings_autogen_gl.h"
239 #include "gl_bindings_autogen_osmesa.h"
242 #include "gl_bindings_autogen_egl.h"
243 #include "gl_bindings_autogen_wgl.h"
244 #elif defined(USE_X11)
245 #include "gl_bindings_autogen_egl.h"
246 #include "gl_bindings_autogen_glx.h"
247 #elif defined(USE_OZONE)
248 #include "gl_bindings_autogen_egl.h"
249 #elif defined(OS_ANDROID)
250 #include "gl_bindings_autogen_egl.h"
255 struct GL_EXPORT DriverGL
{
256 void InitializeStaticBindings();
257 void InitializeCustomDynamicBindings(GLContext
* context
);
258 void InitializeDebugBindings();
259 void InitializeNullDrawBindings();
260 // TODO(danakj): Remove this when all test suites are using null-draw.
261 bool HasInitializedNullDrawBindings();
262 bool SetNullDrawBindingsEnabled(bool enabled
);
263 void ClearBindings();
269 bool null_draw_bindings_enabled
;
272 void InitializeDynamicBindings(GLContext
* context
);
275 struct GL_EXPORT DriverOSMESA
{
276 void InitializeStaticBindings();
277 void InitializeDynamicBindings(GLContext
* context
);
278 void InitializeDebugBindings();
279 void ClearBindings();
282 ProcsOSMESA debug_fn
;
283 ExtensionsOSMESA ext
;
287 struct GL_EXPORT DriverWGL
{
288 void InitializeStaticBindings();
289 void InitializeDynamicBindings(GLContext
* context
);
290 void InitializeDebugBindings();
291 void ClearBindings();
299 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || defined(USE_OZONE)
300 struct GL_EXPORT DriverEGL
{
301 void InitializeStaticBindings();
302 void InitializeDynamicBindings(GLContext
* context
);
303 void InitializeDebugBindings();
304 void ClearBindings();
313 struct GL_EXPORT DriverGLX
{
314 void InitializeStaticBindings();
315 void InitializeDynamicBindings(GLContext
* context
);
316 void InitializeDebugBindings();
317 void ClearBindings();
325 // This #define is here to support autogenerated code.
326 #define g_current_gl_context g_current_gl_context_tls->Get()
327 GL_EXPORT
extern base::ThreadLocalPointer
<GLApi
>* g_current_gl_context_tls
;
329 GL_EXPORT
extern OSMESAApi
* g_current_osmesa_context
;
330 GL_EXPORT
extern DriverGL g_driver_gl
;
331 GL_EXPORT
extern DriverOSMESA g_driver_osmesa
;
335 GL_EXPORT
extern EGLApi
* g_current_egl_context
;
336 GL_EXPORT
extern WGLApi
* g_current_wgl_context
;
337 GL_EXPORT
extern DriverEGL g_driver_egl
;
338 GL_EXPORT
extern DriverWGL g_driver_wgl
;
340 #elif defined(USE_X11)
342 GL_EXPORT
extern EGLApi
* g_current_egl_context
;
343 GL_EXPORT
extern GLXApi
* g_current_glx_context
;
344 GL_EXPORT
extern DriverEGL g_driver_egl
;
345 GL_EXPORT
extern DriverGLX g_driver_glx
;
347 #elif defined(USE_OZONE)
349 GL_EXPORT
extern EGLApi
* g_current_egl_context
;
350 GL_EXPORT
extern DriverEGL g_driver_egl
;
352 #elif defined(OS_ANDROID)
354 GL_EXPORT
extern EGLApi
* g_current_egl_context
;
355 GL_EXPORT
extern DriverEGL g_driver_egl
;
361 #endif // UI_GL_GL_BINDINGS_H_