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.
4 
5 #ifndef UI_GL_GL_BINDINGS_H_
6 #define UI_GL_GL_BINDINGS_H_
7 
8 #include "build/build_config.h"
9 
10 // Includes the platform independent and platform dependent GL headers.
11 
12 // GL headers may include inttypes.h and so we need to ensure that
13 // __STDC_FORMAT_MACROS is defined in order for //base/format_macros.h to
14 // function correctly. See comment and #error message in //base/format_macros.h
15 // for details.
16 #if defined(OS_POSIX) && !defined(__STDC_FORMAT_MACROS)
17 #define __STDC_FORMAT_MACROS
18 #endif
19 #if defined(USE_GLX)
20 // Must be included before GL headers or they might pollute the global
21 // namespace with X11 macros indirectly.
22 #include "ui/gfx/x/x11.h"
23 
24 // GL headers expect Bool and Status this to be defined but we avoid
25 // defining them since they clash with too much code. Instead we have
26 // to add them temporarily here and undef them again below.
27 #define Bool int
28 #define Status int
29 #endif  // USE_GLX
30 
31 #include <GL/gl.h>
32 #include <GL/glext.h>
33 #include <EGL/egl.h>
34 #include <EGL/eglext.h>
35 #include <stdint.h>
36 
37 #include <string>
38 
39 #include "base/logging.h"
40 #include "base/threading/thread_local.h"
41 #include "build/build_config.h"
42 #include "ui/gfx/extension_set.h"
43 #include "ui/gl/gl_export.h"
44 
45 // The standard OpenGL native extension headers are also included.
46 #if defined(OS_WIN)
47 #include <GL/wglext.h>
48 #elif defined(OS_MACOSX)
49 #include <OpenGL/OpenGL.h>
50 #elif defined(USE_GLX)
51 #include <GL/glx.h>
52 #include <GL/glxext.h>
53 
54 // Done with these temporary macros now
55 #undef Bool
56 #undef Status
57 #endif
58 
59 // GLES2 defines not part of Desktop GL
60 // Shader Precision-Specified Types
61 #define GL_LOW_FLOAT                                     0x8DF0
62 #define GL_MEDIUM_FLOAT                                  0x8DF1
63 #define GL_HIGH_FLOAT                                    0x8DF2
64 #define GL_LOW_INT                                       0x8DF3
65 #define GL_MEDIUM_INT                                    0x8DF4
66 #define GL_HIGH_INT                                      0x8DF5
67 #define GL_IMPLEMENTATION_COLOR_READ_TYPE                0x8B9A
68 #define GL_IMPLEMENTATION_COLOR_READ_FORMAT              0x8B9B
69 #define GL_MAX_FRAGMENT_UNIFORM_VECTORS                  0x8DFD
70 #define GL_MAX_VERTEX_UNIFORM_VECTORS                    0x8DFB
71 #define GL_MAX_VARYING_VECTORS                           0x8DFC
72 #define GL_SHADER_BINARY_FORMATS                         0x8DF8
73 #define GL_NUM_SHADER_BINARY_FORMATS                     0x8DF9
74 #define GL_SHADER_COMPILER                               0x8DFA
75 #define GL_RGB565                                        0x8D62
76 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES           0x8B8B
77 #define GL_RGB8_OES                                      0x8051
78 #define GL_RGBA8_OES                                     0x8058
79 #define GL_HALF_FLOAT_OES                                0x8D61
80 
81 // GL_OES_EGL_image_external
82 #define GL_TEXTURE_EXTERNAL_OES                          0x8D65
83 #define GL_SAMPLER_EXTERNAL_OES                          0x8D66
84 #define GL_TEXTURE_BINDING_EXTERNAL_OES                  0x8D67
85 #define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES              0x8D68
86 
87 // GL_ANGLE_texture_rectangle
88 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE 0x84F8
89 #define GL_TEXTURE_RECTANGLE_ANGLE 0x84F5
90 #define GL_TEXTURE_BINDING_RECTANGLE_ANGLE 0x84F6
91 #define GL_SAMPLER_2D_RECT_ANGLE 0x8B63
92 
93 // GL_ANGLE_translated_shader_source
94 #define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE         0x93A0
95 
96 #define GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM         0x9243
97 #define GL_BIND_GENERATES_RESOURCE_CHROMIUM              0x9244
98 
99 // GL_ANGLE_texture_usage
100 #define GL_TEXTURE_USAGE_ANGLE                           0x93A2
101 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE                  0x93A3
102 
103 // GL_EXT_texture_storage
104 #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT                  0x912F
105 #define GL_ALPHA8_EXT                                    0x803C
106 #define GL_LUMINANCE8_EXT                                0x8040
107 #define GL_LUMINANCE8_ALPHA8_EXT                         0x8045
108 #define GL_RGB10_A2_EXT                                  0x8059
109 #define GL_RGBA32F_EXT                                   0x8814
110 #define GL_RGB32F_EXT                                    0x8815
111 #define GL_ALPHA32F_EXT                                  0x8816
112 #define GL_LUMINANCE32F_EXT                              0x8818
113 #define GL_LUMINANCE_ALPHA32F_EXT                        0x8819
114 #define GL_RGBA16F_EXT                                   0x881A
115 #define GL_RGB16F_EXT                                    0x881B
116 #define GL_RG16F_EXT                                     0x822F
117 #define GL_R16F_EXT                                      0x822D
118 #define GL_ALPHA16F_EXT                                  0x881C
119 #define GL_LUMINANCE16F_EXT                              0x881E
120 #define GL_LUMINANCE_ALPHA16F_EXT                        0x881F
121 #define GL_R32F_EXT                                      0x822E
122 #define GL_RG32F_EXT                                     0x8230
123 #define GL_BGRA8_EXT                                     0x93A1
124 
125 // GL_ANGLE_instanced_arrays
126 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE             0x88FE
127 
128 // GL_ANGLE_client_arrays
129 #define GL_CLIENT_ARRAYS_ANGLE 0x93AA
130 
131 // GL_ANGLE_robust_resource_initialization
132 #define GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93AB
133 
134 // GL_ANGLE_request_extension
135 #define GL_REQUESTABLE_EXTENSIONS_ANGLE 0x93A8
136 #define GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE 0x93A9
137 
138 // GL_ANGLE_memory_size
139 #define GL_MEMORY_SIZE_ANGLE 0x93AD
140 
141 // GL_EXT_occlusion_query_boolean
142 #define GL_ANY_SAMPLES_PASSED_EXT                        0x8C2F
143 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT           0x8D6A
144 #define GL_CURRENT_QUERY_EXT                             0x8865
145 #define GL_QUERY_RESULT_EXT                              0x8866
146 #define GL_QUERY_RESULT_AVAILABLE_EXT                    0x8867
147 
148 // GL_ARB_occlusion_query
149 #define GL_SAMPLES_PASSED_ARB                            0x8914
150 
151 // GL_CHROMIUM_command_buffer_query
152 #define GL_COMMANDS_ISSUED_CHROMIUM                      0x6004
153 #define GL_COMMANDS_ISSUED_TIMESTAMP_CHROMIUM            0x6005
154 
155 /* GL_CHROMIUM_get_error_query */
156 #define GL_GET_ERROR_QUERY_CHROMIUM                      0x6003
157 
158 /* GL_CHROMIUM_command_buffer_latency_query */
159 #define GL_LATENCY_QUERY_CHROMIUM                        0x6007
160 
161 /* GL_CHROMIUM_program_completion_query */
162 #define GL_PROGRAM_COMPLETION_QUERY_CHROMIUM 0x6009
163 
164 /* GL_CHROMIUM_async_pixel_transfers */
165 #define GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM           0x6006
166 
167 // GL_CHROMIUM_sync_query
168 #define GL_COMMANDS_COMPLETED_CHROMIUM                   0x84F7
169 
170 // GL_CHROMIUM_ycrcb_420_image
171 #define GL_RGB_YCRCB_420_CHROMIUM                        0x78FA
172 
173 // GL_CHROMIUM_ycbcr_422_image
174 #define GL_RGB_YCBCR_422_CHROMIUM                        0x78FB
175 
176 // GL_CHROMIUM_ycbcr_420v_image
177 #define GL_RGB_YCBCR_420V_CHROMIUM 0x78FC
178 
179 // GL_CHROMIUM_ycbcr_p010_image
180 #define GL_RGB_YCBCR_P010_CHROMIUM 0x78FD
181 
182 // GL_CHROMIUM_schedule_overlay_plane
183 #define GL_OVERLAY_TRANSFORM_NONE_CHROMIUM               0x9245
184 #define GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM    0x9246
185 #define GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM      0x9247
186 #define GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM          0x9248
187 #define GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM         0x9249
188 #define GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM         0x924A
189 
190 // GL_CHROMIUM_subscribe_uniforms
191 #define GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM             0x924B
192 #define GL_MOUSE_POSITION_CHROMIUM                       0x924C
193 
194 // GL_CHROMIUM_texture_filtering_hint
195 #define GL_TEXTURE_FILTERING_HINT_CHROMIUM               0x8AF0
196 
197 // GL_CHROMIUM_texture_storage_image
198 #define GL_SCANOUT_CHROMIUM 0x6000
199 
200 // GL_OES_texure_3D
201 #define GL_SAMPLER_3D_OES                                0x8B5F
202 
203 // GL_OES_depth24
204 #define GL_DEPTH_COMPONENT24_OES                         0x81A6
205 
206 // GL_OES_depth32
207 #define GL_DEPTH_COMPONENT32_OES                         0x81A7
208 
209 // GL_OES_packed_depth_stencil
210 #ifndef GL_DEPTH24_STENCIL8_OES
211 #define GL_DEPTH24_STENCIL8_OES                          0x88F0
212 #endif
213 
214 #ifndef GL_DEPTH24_STENCIL8
215 #define GL_DEPTH24_STENCIL8                              0x88F0
216 #endif
217 
218 // GL_OES_compressed_ETC1_RGB8_texture
219 #define GL_ETC1_RGB8_OES                                 0x8D64
220 
221 // GL_AMD_compressed_ATC_texture
222 #define GL_ATC_RGB_AMD                                   0x8C92
223 #define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD                   0x8C93
224 #define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD               0x87EE
225 
226 // GL_IMG_texture_compression_pvrtc
227 #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG               0x8C00
228 #define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG               0x8C01
229 #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG              0x8C02
230 #define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG              0x8C03
231 
232 // GL_EXT_texture_compression_bptc
233 #define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C
234 #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D
235 #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E
236 #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F
237 
238 // GL_EXT_texture_compression_rgtc
239 #define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB
240 #define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC
241 #define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD
242 #define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
243 
244 // GL_OES_vertex_array_object
245 #define GL_VERTEX_ARRAY_BINDING_OES                      0x85B5
246 
247 // GL_CHROMIUM_pixel_transfer_buffer_object
248 #define GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM         0x78EC
249 #define GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM           0x78ED
250 #define GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM   0x78EE
251 #define GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM 0x78EF
252 
253 /* GL_EXT_discard_framebuffer */
254 #ifndef GL_EXT_discard_framebuffer
255 #define GL_COLOR_EXT                                     0x1800
256 #define GL_DEPTH_EXT                                     0x1801
257 #define GL_STENCIL_EXT                                   0x1802
258 #endif
259 
260 // GL_EXT_sRGB
261 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT     0x8210
262 
263 // GL_ARB_get_program_binary
264 #define PROGRAM_BINARY_RETRIEVABLE_HINT                  0x8257
265 // GL_OES_get_program_binary
266 #define GL_PROGRAM_BINARY_LENGTH_OES                     0x8741
267 #define GL_NUM_PROGRAM_BINARY_FORMATS_OES                0x87FE
268 #define GL_PROGRAM_BINARY_FORMATS_OES                    0x87FF
269 
270 #ifndef GL_EXT_multisampled_render_to_texture
271 #define GL_RENDERBUFFER_SAMPLES_EXT                      0x8CAB
272 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT        0x8D56
273 #define GL_MAX_SAMPLES_EXT                               0x8D57
274 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT    0x8D6C
275 #endif
276 
277 #ifndef GL_IMG_multisampled_render_to_texture
278 #define GL_RENDERBUFFER_SAMPLES_IMG                      0x9133
279 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG        0x9134
280 #define GL_MAX_SAMPLES_IMG                               0x9135
281 #define GL_TEXTURE_SAMPLES_IMG                           0x9136
282 #endif
283 
284 #ifndef GL_CHROMIUM_path_rendering
285 #define GL_CHROMIUM_path_rendering 1
286 // These match the corresponding values in NV_path_rendering
287 // extension, eg tokens with CHROMIUM replaced with NV.
288 #define GL_PATH_MODELVIEW_MATRIX_CHROMIUM 0x0BA6
289 #define GL_PATH_PROJECTION_MATRIX_CHROMIUM 0x0BA7
290 #define GL_PATH_MODELVIEW_CHROMIUM 0x1700
291 #define GL_PATH_PROJECTION_CHROMIUM 0x1701
292 #define GL_FLAT_CHROMIUM 0x1D00
293 #define GL_CLOSE_PATH_CHROMIUM 0x00
294 #define GL_MOVE_TO_CHROMIUM 0x02
295 #define GL_LINE_TO_CHROMIUM 0x04
296 #define GL_QUADRATIC_CURVE_TO_CHROMIUM 0x0A
297 #define GL_CUBIC_CURVE_TO_CHROMIUM 0x0C
298 #define GL_CONIC_CURVE_TO_CHROMIUM 0x1A
299 #define GL_EYE_LINEAR_CHROMIUM 0x2400
300 #define GL_OBJECT_LINEAR_CHROMIUM 0x2401
301 #define GL_CONSTANT_CHROMIUM 0x8576
302 #define GL_PATH_STROKE_WIDTH_CHROMIUM 0x9075
303 #define GL_PATH_END_CAPS_CHROMIUM 0x9076
304 #define GL_PATH_JOIN_STYLE_CHROMIUM 0x9079
305 #define GL_PATH_MITER_LIMIT_CHROMIUM 0x907a
306 #define GL_PATH_STROKE_BOUND_CHROMIUM 0x9086
307 #define GL_COUNT_UP_CHROMIUM 0x9088
308 #define GL_COUNT_DOWN_CHROMIUM 0x9089
309 #define GL_CONVEX_HULL_CHROMIUM 0x908B
310 #define GL_BOUNDING_BOX_CHROMIUM 0x908D
311 #define GL_TRANSLATE_X_CHROMIUM 0x908E
312 #define GL_TRANSLATE_Y_CHROMIUM 0x908F
313 #define GL_TRANSLATE_2D_CHROMIUM 0x9090
314 #define GL_TRANSLATE_3D_CHROMIUM 0x9091
315 #define GL_AFFINE_2D_CHROMIUM 0x9092
316 #define GL_AFFINE_3D_CHROMIUM 0x9094
317 #define GL_TRANSPOSE_AFFINE_2D_CHROMIUM 0x9096
318 #define GL_TRANSPOSE_AFFINE_3D_CHROMIUM 0x9098
319 #define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM 0x909C
320 #define GL_SQUARE_CHROMIUM 0x90a3
321 #define GL_ROUND_CHROMIUM 0x90a4
322 #define GL_BEVEL_CHROMIUM 0x90a6
323 #define GL_MITER_REVERT_CHROMIUM 0x90a7
324 #define GL_PATH_STENCIL_FUNC_CHROMIUM 0x90B7
325 #define GL_PATH_STENCIL_REF_CHROMIUM 0x90B8
326 #define GL_PATH_STENCIL_VALUE_MASK_CHROMIUM 0x90B9
327 #endif
328 
329 #ifndef GL_EXT_multisample_compatibility
330 #define GL_EXT_multisample_compatibility 1
331 #define GL_MULTISAMPLE_EXT 0x809D
332 #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
333 #endif /* GL_EXT_multisample_compatibility */
334 
335 #ifndef GL_CHROMIUM_framebuffer_mixed_samples
336 #define GL_CHROMIUM_framebuffer_mixed_samples 1
337 #define GL_COVERAGE_MODULATION_CHROMIUM 0x9332
338 #endif /* GL_CHROMIUM_framebuffer_mixed_samples */
339 
340 #ifndef GL_KHR_blend_equation_advanced
341 #define GL_KHR_blend_equation_advanced 1
342 #define GL_COLORBURN_KHR                  0x929A
343 #define GL_COLORDODGE_KHR                 0x9299
344 #define GL_DARKEN_KHR                     0x9297
345 #define GL_DIFFERENCE_KHR                 0x929E
346 #define GL_EXCLUSION_KHR                  0x92A0
347 #define GL_HARDLIGHT_KHR                  0x929B
348 #define GL_HSL_COLOR_KHR                  0x92AF
349 #define GL_HSL_HUE_KHR                    0x92AD
350 #define GL_HSL_LUMINOSITY_KHR             0x92B0
351 #define GL_HSL_SATURATION_KHR             0x92AE
352 #define GL_LIGHTEN_KHR                    0x9298
353 #define GL_MULTIPLY_KHR                   0x9294
354 #define GL_OVERLAY_KHR                    0x9296
355 #define GL_SCREEN_KHR                     0x9295
356 #define GL_SOFTLIGHT_KHR                  0x929C
357 #endif /* GL_KHR_blend_equation_advanced */
358 
359 #ifndef GL_KHR_blend_equation_advanced_coherent
360 #define GL_KHR_blend_equation_advanced_coherent 1
361 #define GL_BLEND_ADVANCED_COHERENT_KHR    0x9285
362 #endif /* GL_KHR_blend_equation_advanced_coherent */
363 
364 #ifndef GL_EXT_disjoint_timer_query
365 #define GL_EXT_disjoint_timer_query 1
366 #define GL_QUERY_COUNTER_BITS_EXT         0x8864
367 #define GL_TIME_ELAPSED_EXT               0x88BF
368 #define GL_TIMESTAMP_EXT                  0x8E28
369 #define GL_GPU_DISJOINT_EXT               0x8FBB
370 #endif
371 
372 #ifndef GL_KHR_robustness
373 #define GL_KHR_robustness 1
374 #define GL_CONTEXT_ROBUST_ACCESS_KHR      0x90F3
375 #define GL_LOSE_CONTEXT_ON_RESET_KHR      0x8252
376 #define GL_GUILTY_CONTEXT_RESET_KHR       0x8253
377 #define GL_INNOCENT_CONTEXT_RESET_KHR     0x8254
378 #define GL_UNKNOWN_CONTEXT_RESET_KHR      0x8255
379 #define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256
380 #define GL_NO_RESET_NOTIFICATION_KHR      0x8261
381 #define GL_CONTEXT_LOST_KHR               0x0507
382 #endif /* GL_KHR_robustness */
383 
384 #ifndef GL_EXT_texture_norm16
385 #define GL_EXT_texture_norm16 1
386 #define GL_R16_EXT 0x822A
387 #define GL_RG16_EXT 0x822C
388 #define GL_RGBA16_EXT 0x805B
389 #define GL_RGB16_EXT 0x8054
390 #define GL_R16_SNORM_EXT 0x8F98
391 #define GL_RG16_SNORM_EXT 0x8F99
392 #define GL_RGBA16_SNORM_EXT 0x8F9B
393 #define GL_RGB16_SNORM_EXT 0x8F9A
394 #endif /* GL_EXT_texture_norm16 */
395 
396 #ifndef GL_EXT_texture_rg
397 #define GL_EXT_texture_rg 1
398 #define GL_RED_EXT 0x1903
399 #define GL_RG_EXT 0x8227
400 #define GL_R8_EXT 0x8229
401 #define GL_RG8_EXT 0x822B
402 #endif /* GL_EXT_texture_rg */
403 
404 // This is from NV_path_rendering, but the GL header is not up to date with the
405 // most recent version of the extension. This definition could be removed once
406 // glext.h r27498 or later is imported.
407 #ifndef GL_FRAGMENT_INPUT_NV
408 #define GL_FRAGMENT_INPUT_NV 0x936D
409 #endif
410 
411 #ifndef GL_EXT_blend_func_extended
412 #define GL_EXT_blend_func_extended 1
413 #define GL_SRC_ALPHA_SATURATE_EXT 0x0308
414 #define GL_SRC1_ALPHA_EXT 0x8589  // OpenGL 1.5 token value
415 #define GL_SRC1_COLOR_EXT 0x88F9
416 #define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA
417 #define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB
418 #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC
419 #endif /* GL_EXT_blend_func_extended */
420 
421 #ifndef GL_EXT_window_rectangles
422 #define GL_EXT_window_rectangles 1
423 #define GL_INCLUSIVE_EXT 0x8F10
424 #define GL_EXCLUSIVE_EXT 0x8F11
425 #define GL_WINDOW_RECTANGLE_EXT 0x8F12
426 #define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13
427 #define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14
428 #define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15
429 #endif /* GL_EXT_window_rectangles */
430 
431 #ifndef GL_CHROMIUM_nonblocking_readback
432 #define GL_CHROMIUM_nonblocking_readback 1
433 #define GL_READBACK_SHADOW_COPIES_UPDATED_CHROMIUM 0x84F8
434 #endif /* GL_CHROMIUM_nonblocking_readback */
435 
436 #ifndef GL_MESA_framebuffer_flip_y
437 #define GL_MESA_framebuffer_flip_y 1
438 #define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB
439 #endif /* GL_MESA_framebuffer_flip_y */
440 
441 #ifndef GL_KHR_parallel_shader_compile
442 #define GL_KHR_parallel_shader_compile 1
443 #define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0
444 #define GL_COMPLETION_STATUS_KHR 0x91B1
445 #endif /* GL_KHR_parallel_shader_compile */
446 
447 #ifndef GL_CHROMIUM_shared_image
448 #define GL_CHROMIUM_shared_image 1
449 #define GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM 0x8AF6
450 #define GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM 0x8AF7
451 #endif /* GL_CHROMIUM_shared_image */
452 
453 #ifndef GL_NV_internalformat_sample_query
454 #define GL_MULTISAMPLES_NV 0x9371
455 #define GL_SUPERSAMPLE_SCALE_X_NV 0x9372
456 #define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373
457 #define GL_CONFORMANT_NV 0x9374
458 #endif /* GL_NV_internalformat_sample_query */
459 
460 #define GL_GLEXT_PROTOTYPES 1
461 
462 #if defined(OS_WIN)
463 #define GL_BINDING_CALL WINAPI
464 #else
465 #define GL_BINDING_CALL
466 #endif
467 
468 #if defined(NDEBUG) && !defined(GPU_ENABLE_SERVICE_LOGGING)
469 #define GL_SERVICE_LOG(args) DLOG(INFO) << args;
470 #define GL_SERVICE_LOG_CODE_BLOCK(code)
471 #else
472 #define GL_SERVICE_LOG(args) LOG(INFO) << args;
473 #define GL_SERVICE_LOG_CODE_BLOCK(code) code
474 #endif
475 
476 // OVR_multiview2 constants.
477 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630
478 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632
479 #define GL_MAX_VIEWS_OVR 0x9631
480 #define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633
481 
482 #define GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT 0x8868
483 
484 // Forward declare EGL types.
485 typedef uint64_t EGLuint64CHROMIUM;
486 #ifndef EGL_VERSION_1_5
487 typedef intptr_t EGLAttrib;
488 #endif
489 #ifndef EGL_KHR_stream
490 typedef void *EGLStreamKHR;
491 typedef uint64_t EGLuint64KHR;
492 #endif
493 #ifndef EGL_ANDROID_presentation_time
494 typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;
495 #endif
496 #ifndef EGL_KHR_debug
497 typedef void* EGLObjectKHR;
498 typedef void* EGLLabelKHR;
499 typedef void (APIENTRY *EGLDEBUGPROCKHR)(
500              EGLenum error,
501              const char *command,
502              EGLint messageType,
503              EGLLabelKHR threadLabel,
504              EGLLabelKHR objectLabel,
505              const char* message);
506 #endif
507 
508 #include "gl_bindings_autogen_gl.h"
509 
510 #if defined(USE_EGL)
511 #include "gl_bindings_autogen_egl.h"
512 #endif
513 
514 #if defined(OS_WIN)
515 #include "gl_bindings_autogen_wgl.h"
516 #endif
517 
518 #if defined(USE_GLX)
519 #include "gl_bindings_autogen_glx.h"
520 #endif
521 
522 namespace gl {
523 
524 struct GLVersionInfo;
525 
526 struct GL_EXPORT DriverGL {
527   void InitializeStaticBindings();
528   void InitializeDynamicBindings(const GLVersionInfo* ver,
529                                  const gfx::ExtensionSet& extensions);
530   void ClearBindings();
531 
532   ProcsGL fn;
533   ExtensionsGL ext;
534 
DriverGLDriverGL535   DriverGL() {
536     // InitializeStaticBindings() requires that fn is null-initialized.
537     ClearBindings();
538   }
539 };
540 
541 struct GL_EXPORT CurrentGL {
542   GLApi* Api = nullptr;
543   DriverGL* Driver = nullptr;
544   const GLVersionInfo* Version = nullptr;
545 };
546 
547 #if defined(OS_WIN)
548 struct GL_EXPORT DriverWGL {
549   void InitializeStaticBindings();
550   void InitializeExtensionBindings();
551   void ClearBindings();
552 
553   ProcsWGL fn;
554   ExtensionsWGL ext;
555 
556  private:
557   static std::string GetPlatformExtensions();
558 };
559 #endif
560 
561 #if defined(USE_EGL)
562 struct GL_EXPORT DriverEGL {
563   void InitializeStaticBindings();
564   void InitializeClientExtensionBindings();
565   void InitializeExtensionBindings();
566   void ClearBindings();
567   void UpdateConditionalExtensionBindings();
568 
569   ProcsEGL fn;
570   ExtensionsEGL ext;
571 
572   static std::string GetPlatformExtensions();
573   static std::string GetClientExtensions();
574 };
575 #endif
576 
577 #if defined(USE_GLX)
578 struct GL_EXPORT DriverGLX {
579   void InitializeStaticBindings();
580 #ifdef TOOLKIT_QT
581   void InitializeExtensionBindings(const std::string&);
582 #else
583   void InitializeExtensionBindings();
584 #endif
585 
586   void ClearBindings();
587 
588   ProcsGLX fn;
589   ExtensionsGLX ext;
590 
591 #ifndef TOOLKIT_QT
592  private:
593 #endif
594   static std::string GetPlatformExtensions();
595 };
596 #endif
597 
598 // This #define is here to support autogenerated code.
599 #define g_current_gl_context g_current_gl_context_tls->Get()->Api
600 #define g_current_gl_driver g_current_gl_context_tls->Get()->Driver
601 #define g_current_gl_version g_current_gl_context_tls->Get()->Version
602 GL_EXPORT extern base::ThreadLocalPointer<CurrentGL>* g_current_gl_context_tls;
603 
604 #if defined(USE_EGL)
605 GL_EXPORT extern EGLApi* g_current_egl_context;
606 GL_EXPORT extern DriverEGL g_driver_egl;
607 #endif
608 
609 #if defined(OS_WIN)
610 GL_EXPORT extern WGLApi* g_current_wgl_context;
611 GL_EXPORT extern DriverWGL g_driver_wgl;
612 #endif
613 
614 #if defined(USE_GLX)
615 GL_EXPORT extern GLXApi* g_current_glx_context;
616 GL_EXPORT extern DriverGLX g_driver_glx;
617 #endif
618 
619 }  // namespace gl
620 
621 #endif  // UI_GL_GL_BINDINGS_H_
622