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 // 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. 12 13 #include <GL/gl.h> 14 #include <GL/glext.h> 15 #include <EGL/egl.h> 16 #include <EGL/eglext.h> 17 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" 22 23 // The standard OpenGL native extension headers are also included. 24 #if defined(OS_WIN) 25 #include <GL/wglext.h> 26 #elif defined(OS_MACOSX) 27 #include <OpenGL/OpenGL.h> 28 #elif defined(USE_X11) 29 #include <GL/glx.h> 30 #include <GL/glxext.h> 31 32 // Undefine some macros defined by X headers. This is why this file should only 33 // be included in .cc files. 34 #undef Bool 35 #undef None 36 #undef Status 37 #endif 38 39 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 61 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 67 68 // GL_ANGLE_translated_shader_source 69 #define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 70 71 // GL_CHROMIUM_flipy 72 #define GL_UNPACK_FLIP_Y_CHROMIUM 0x9240 73 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 78 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 83 84 // GL_ANGLE_pack_reverse_row_order 85 #define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 86 87 // GL_ANGLE_texture_usage 88 #define GL_TEXTURE_USAGE_ANGLE 0x93A2 89 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 90 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 107 108 // GL_ANGLE_instanced_arrays 109 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE 110 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 117 118 // GL_CHROMIUM_command_buffer_query 119 #define GL_COMMANDS_ISSUED_CHROMIUM 0x84F2 120 121 /* GL_CHROMIUM_get_error_query */ 122 #define GL_GET_ERROR_QUERY_CHROMIUM 0x84F3 123 124 /* GL_CHROMIUM_command_buffer_latency_query */ 125 #define GL_LATENCY_QUERY_CHROMIUM 0x84F4 126 127 /* GL_CHROMIUM_async_pixel_transfers */ 128 #define GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM 0x84F5 129 #define GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM 0x84F6 130 131 // GL_CHROMIUM_sync_query 132 #define GL_COMMANDS_COMPLETED_CHROMIUM 0x84F7 133 134 // GL_CHROMIUM_image 135 #define GL_IMAGE_ROWBYTES_CHROMIUM 0x78F0 136 #define GL_IMAGE_MAP_CHROMIUM 0x78F1 137 #define GL_IMAGE_SCANOUT_CHROMIUM 0x78F2 138 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 146 147 // GL_OES_texure_3D 148 #define GL_SAMPLER_3D_OES 0x8B5F 149 150 // GL_OES_depth24 151 #define GL_DEPTH_COMPONENT24_OES 0x81A6 152 153 // GL_OES_depth32 154 #define GL_DEPTH_COMPONENT32_OES 0x81A7 155 156 // GL_OES_packed_depth_stencil 157 #ifndef GL_DEPTH24_STENCIL8_OES 158 #define GL_DEPTH24_STENCIL8_OES 0x88F0 159 #endif 160 161 #ifndef GL_DEPTH24_STENCIL8 162 #define GL_DEPTH24_STENCIL8 0x88F0 163 #endif 164 165 // GL_OES_compressed_ETC1_RGB8_texture 166 #define GL_ETC1_RGB8_OES 0x8D64 167 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 172 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 178 179 // GL_OES_vertex_array_object 180 #define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 181 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 187 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 193 #endif 194 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 201 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 207 #endif 208 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 214 #endif 215 216 #ifndef GL_CHROMIUM_path_rendering 217 // These match the corresponding values in NV_path_rendering 218 // extension, eg tokens with CHROMIUM replaced with NV. 219 #define GL_PATH_MODELVIEW_MATRIX_CHROMIUM 0x0BA6 220 #define GL_PATH_PROJECTION_MATRIX_CHROMIUM 0x0BA7 221 #define GL_PATH_MODELVIEW_CHROMIUM 0x1700 222 #define GL_PATH_PROJECTION_CHROMIUM 0x1701 223 #endif 224 225 #ifndef GL_EXT_disjoint_timer_query 226 #define GL_EXT_disjoint_timer_query 1 227 #define GL_QUERY_COUNTER_BITS_EXT 0x8864 228 #define GL_TIME_ELAPSED_EXT 0x88BF 229 #define GL_TIMESTAMP_EXT 0x8E28 230 #define GL_GPU_DISJOINT_EXT 0x8FBB 231 #endif 232 233 #define GL_GLEXT_PROTOTYPES 1 234 235 #if defined(OS_WIN) 236 #define GL_BINDING_CALL WINAPI 237 #else 238 #define GL_BINDING_CALL 239 #endif 240 241 #define GL_SERVICE_LOG(args) DLOG(INFO) << args; 242 #if defined(NDEBUG) 243 #define GL_SERVICE_LOG_CODE_BLOCK(code) 244 #else 245 #define GL_SERVICE_LOG_CODE_BLOCK(code) code 246 #endif 247 248 // Forward declare OSMesa types. 249 typedef struct osmesa_context *OSMesaContext; 250 typedef void (*OSMESAproc)(); 251 252 // Forward declare EGL types. 253 typedef uint64 EGLuint64CHROMIUM; 254 255 #include "gl_bindings_autogen_gl.h" 256 #include "gl_bindings_autogen_osmesa.h" 257 258 #if defined(OS_WIN) 259 #include "gl_bindings_autogen_egl.h" 260 #include "gl_bindings_autogen_wgl.h" 261 #elif defined(USE_X11) 262 #include "gl_bindings_autogen_egl.h" 263 #include "gl_bindings_autogen_glx.h" 264 #elif defined(USE_OZONE) 265 #include "gl_bindings_autogen_egl.h" 266 #elif defined(OS_ANDROID) 267 #include "gl_bindings_autogen_egl.h" 268 #endif 269 270 namespace gfx { 271 272 struct GL_EXPORT DriverGL { 273 void InitializeStaticBindings(); 274 void InitializeCustomDynamicBindings(GLContext* context); 275 void InitializeDebugBindings(); 276 void InitializeNullDrawBindings(); 277 // TODO(danakj): Remove this when all test suites are using null-draw. 278 bool HasInitializedNullDrawBindings(); 279 bool SetNullDrawBindingsEnabled(bool enabled); 280 void ClearBindings(); 281 282 ProcsGL fn; 283 ProcsGL orig_fn; 284 ProcsGL debug_fn; 285 ExtensionsGL ext; 286 bool null_draw_bindings_enabled; 287 288 private: 289 void InitializeDynamicBindings(GLContext* context); 290 }; 291 292 struct GL_EXPORT DriverOSMESA { 293 void InitializeStaticBindings(); 294 void InitializeDynamicBindings(GLContext* context); 295 void InitializeDebugBindings(); 296 void ClearBindings(); 297 298 ProcsOSMESA fn; 299 ProcsOSMESA debug_fn; 300 ExtensionsOSMESA ext; 301 }; 302 303 #if defined(OS_WIN) 304 struct GL_EXPORT DriverWGL { 305 void InitializeStaticBindings(); 306 void InitializeDynamicBindings(GLContext* context); 307 void InitializeDebugBindings(); 308 void ClearBindings(); 309 310 ProcsWGL fn; 311 ProcsWGL debug_fn; 312 ExtensionsWGL ext; 313 }; 314 #endif 315 316 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || defined(USE_OZONE) 317 struct GL_EXPORT DriverEGL { 318 void InitializeStaticBindings(); 319 void InitializeDynamicBindings(GLContext* context); 320 void InitializeDebugBindings(); 321 void ClearBindings(); 322 323 ProcsEGL fn; 324 ProcsEGL debug_fn; 325 ExtensionsEGL ext; 326 }; 327 #endif 328 329 #if defined(USE_X11) 330 struct GL_EXPORT DriverGLX { 331 void InitializeStaticBindings(); 332 void InitializeDynamicBindings(GLContext* context); 333 void InitializeDebugBindings(); 334 void ClearBindings(); 335 336 ProcsGLX fn; 337 ProcsGLX debug_fn; 338 ExtensionsGLX ext; 339 }; 340 #endif 341 342 // This #define is here to support autogenerated code. 343 #define g_current_gl_context g_current_gl_context_tls->Get() 344 GL_EXPORT extern base::ThreadLocalPointer<GLApi>* g_current_gl_context_tls; 345 346 GL_EXPORT extern OSMESAApi* g_current_osmesa_context; 347 GL_EXPORT extern DriverGL g_driver_gl; 348 GL_EXPORT extern DriverOSMESA g_driver_osmesa; 349 350 #if defined(OS_WIN) 351 352 GL_EXPORT extern EGLApi* g_current_egl_context; 353 GL_EXPORT extern WGLApi* g_current_wgl_context; 354 GL_EXPORT extern DriverEGL g_driver_egl; 355 GL_EXPORT extern DriverWGL g_driver_wgl; 356 357 #elif defined(USE_X11) 358 359 GL_EXPORT extern EGLApi* g_current_egl_context; 360 GL_EXPORT extern GLXApi* g_current_glx_context; 361 GL_EXPORT extern DriverEGL g_driver_egl; 362 GL_EXPORT extern DriverGLX g_driver_glx; 363 364 #elif defined(USE_OZONE) 365 366 GL_EXPORT extern EGLApi* g_current_egl_context; 367 GL_EXPORT extern DriverEGL g_driver_egl; 368 369 #elif defined(OS_ANDROID) 370 371 GL_EXPORT extern EGLApi* g_current_egl_context; 372 GL_EXPORT extern DriverEGL g_driver_egl; 373 374 #endif 375 376 } // namespace gfx 377 378 #endif // UI_GL_GL_BINDINGS_H_ 379