Home | History | Annotate | Download | only in gl
      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