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 
     78 // GL_CHROMIUM_gpu_memory_manager
     79 #define GL_TEXTURE_POOL_CHROMIUM                         0x6000
     80 #define GL_TEXTURE_POOL_MANAGED_CHROMIUM                 0x6001
     81 #define GL_TEXTURE_POOL_UNMANAGED_CHROMIUM               0x6002
     82 
     83 // GL_ANGLE_pack_reverse_row_order
     84 #define GL_PACK_REVERSE_ROW_ORDER_ANGLE                  0x93A4
     85 
     86 // GL_ANGLE_texture_usage
     87 #define GL_TEXTURE_USAGE_ANGLE                           0x93A2
     88 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE                  0x93A3
     89 
     90 // GL_EXT_texture_storage
     91 #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT                  0x912F
     92 #define GL_ALPHA8_EXT                                    0x803C
     93 #define GL_LUMINANCE8_EXT                                0x8040
     94 #define GL_LUMINANCE8_ALPHA8_EXT                         0x8045
     95 #define GL_RGBA32F_EXT                                   0x8814
     96 #define GL_RGB32F_EXT                                    0x8815
     97 #define GL_ALPHA32F_EXT                                  0x8816
     98 #define GL_LUMINANCE32F_EXT                              0x8818
     99 #define GL_LUMINANCE_ALPHA32F_EXT                        0x8819
    100 #define GL_RGBA16F_EXT                                   0x881A
    101 #define GL_RGB16F_EXT                                    0x881B
    102 #define GL_ALPHA16F_EXT                                  0x881C
    103 #define GL_LUMINANCE16F_EXT                              0x881E
    104 #define GL_LUMINANCE_ALPHA16F_EXT                        0x881F
    105 #define GL_BGRA8_EXT                                     0x93A1
    106 
    107 // GL_ANGLE_instanced_arrays
    108 #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE             0x88FE
    109 
    110 // GL_EXT_occlusion_query_boolean
    111 #define GL_ANY_SAMPLES_PASSED_EXT                        0x8C2F
    112 #define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT           0x8D6A
    113 #define GL_CURRENT_QUERY_EXT                             0x8865
    114 #define GL_QUERY_RESULT_EXT                              0x8866
    115 #define GL_QUERY_RESULT_AVAILABLE_EXT                    0x8867
    116 
    117 // GL_CHROMIUM_command_buffer_query
    118 #define GL_COMMANDS_ISSUED_CHROMIUM                      0x84F2
    119 
    120 /* GL_CHROMIUM_get_error_query */
    121 #define GL_GET_ERROR_QUERY_CHROMIUM                      0x84F3
    122 
    123 /* GL_CHROMIUM_command_buffer_latency_query */
    124 #define GL_LATENCY_QUERY_CHROMIUM                        0x84F4
    125 
    126 /* GL_CHROMIUM_async_pixel_transfers */
    127 #define GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM      0x84F5
    128 #define GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM          0x84F6
    129 
    130 // GL_OES_texure_3D
    131 #define GL_SAMPLER_3D_OES                                0x8B5F
    132 
    133 // GL_OES_depth24
    134 #define GL_DEPTH_COMPONENT24_OES                         0x81A6
    135 
    136 // GL_OES_depth32
    137 #define GL_DEPTH_COMPONENT32_OES                         0x81A7
    138 
    139 // GL_OES_packed_depth_stencil
    140 #ifndef GL_DEPTH24_STENCIL8_OES
    141 #define GL_DEPTH24_STENCIL8_OES                          0x88F0
    142 #endif
    143 
    144 #ifndef GL_DEPTH24_STENCIL8
    145 #define GL_DEPTH24_STENCIL8                              0x88F0
    146 #endif
    147 
    148 // GL_OES_compressed_ETC1_RGB8_texture
    149 #define GL_ETC1_RGB8_OES                                 0x8D64
    150 
    151 // GL_OES_vertex_array_object
    152 #define GL_VERTEX_ARRAY_BINDING_OES                      0x85B5
    153 
    154 // GL_CHROMIUM_pixel_transfer_buffer_object
    155 #define GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM         0x78EC
    156 #define GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM           0x78ED
    157 #define GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM   0x78EE
    158 #define GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM 0x78EF
    159 
    160 /* GL_EXT_discard_framebuffer */
    161 #ifndef GL_EXT_discard_framebuffer
    162 #define GL_COLOR_EXT                                     0x1800
    163 #define GL_DEPTH_EXT                                     0x1801
    164 #define GL_STENCIL_EXT                                   0x1802
    165 #endif
    166 
    167 // GL_ARB_get_program_binary
    168 #define PROGRAM_BINARY_RETRIEVABLE_HINT                  0x8257
    169 // GL_OES_get_program_binary
    170 #define GL_PROGRAM_BINARY_LENGTH_OES                     0x8741
    171 #define GL_NUM_PROGRAM_BINARY_FORMATS_OES                0x87FE
    172 #define GL_PROGRAM_BINARY_FORMATS_OES                    0x87FF
    173 
    174 #ifndef GL_EXT_multisampled_render_to_texture
    175 #define GL_RENDERBUFFER_SAMPLES_EXT                      0x8CAB
    176 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT        0x8D56
    177 #define GL_MAX_SAMPLES_EXT                               0x8D57
    178 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT    0x8D6C
    179 #endif
    180 
    181 #ifndef GL_IMG_multisampled_render_to_texture
    182 #define GL_RENDERBUFFER_SAMPLES_IMG                      0x9133
    183 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG        0x9134
    184 #define GL_MAX_SAMPLES_IMG                               0x9135
    185 #define GL_TEXTURE_SAMPLES_IMG                           0x9136
    186 #endif
    187 
    188 #define GL_GLEXT_PROTOTYPES 1
    189 
    190 #if defined(OS_WIN)
    191 #define GL_BINDING_CALL WINAPI
    192 #else
    193 #define GL_BINDING_CALL
    194 #endif
    195 
    196 #define GL_SERVICE_LOG(args) DLOG(INFO) << args;
    197 #if defined(NDEBUG)
    198   #define GL_SERVICE_LOG_CODE_BLOCK(code)
    199 #else
    200   #define GL_SERVICE_LOG_CODE_BLOCK(code) code
    201 #endif
    202 
    203 // Forward declare OSMesa types.
    204 typedef struct osmesa_context *OSMesaContext;
    205 typedef void (*OSMESAproc)();
    206 
    207 // Forward declare EGL types.
    208 typedef uint64 EGLuint64CHROMIUM;
    209 
    210 #include "gl_bindings_autogen_gl.h"
    211 #include "gl_bindings_autogen_osmesa.h"
    212 
    213 #if defined(OS_WIN)
    214 #include "gl_bindings_autogen_egl.h"
    215 #include "gl_bindings_autogen_wgl.h"
    216 #elif defined(USE_X11)
    217 #include "gl_bindings_autogen_egl.h"
    218 #include "gl_bindings_autogen_glx.h"
    219 #elif defined(USE_OZONE)
    220 #include "gl_bindings_autogen_egl.h"
    221 #elif defined(OS_ANDROID)
    222 #include "gl_bindings_autogen_egl.h"
    223 #endif
    224 
    225 namespace gfx {
    226 
    227 struct GL_EXPORT DriverGL {
    228   void Initialize();
    229   void InitializeExtensions(GLContext* context);
    230   void InitializeDebugBindings();
    231   void ClearBindings();
    232   void UpdateDebugExtensionBindings();
    233 
    234   ProcsGL fn;
    235   ProcsGL orig_fn;
    236   ProcsGL debug_fn;
    237   ExtensionsGL ext;
    238 
    239  private:
    240   void InitializeBindings();
    241   void InitializeExtensionBindings(GLContext* context);
    242 };
    243 
    244 struct GL_EXPORT DriverOSMESA {
    245   void InitializeBindings();
    246   void InitializeExtensionBindings(GLContext* context);
    247   void InitializeDebugBindings();
    248   void ClearBindings();
    249   void UpdateDebugExtensionBindings();
    250 
    251   ProcsOSMESA fn;
    252   ProcsOSMESA debug_fn;
    253   ExtensionsOSMESA ext;
    254 };
    255 
    256 #if defined(OS_WIN)
    257 struct GL_EXPORT DriverWGL {
    258   void InitializeBindings();
    259   void InitializeExtensionBindings(GLContext* context);
    260   void InitializeDebugBindings();
    261   void ClearBindings();
    262   void UpdateDebugExtensionBindings();
    263 
    264   ProcsWGL fn;
    265   ProcsWGL debug_fn;
    266   ExtensionsWGL ext;
    267 };
    268 #endif
    269 
    270 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || defined(USE_OZONE)
    271 struct GL_EXPORT DriverEGL {
    272   void InitializeBindings();
    273   void InitializeExtensionBindings(GLContext* context);
    274   void InitializeDebugBindings();
    275   void ClearBindings();
    276   void UpdateDebugExtensionBindings();
    277 
    278   ProcsEGL fn;
    279   ProcsEGL debug_fn;
    280   ExtensionsEGL ext;
    281 };
    282 #endif
    283 
    284 #if defined(USE_X11)
    285 struct GL_EXPORT DriverGLX {
    286   void InitializeBindings();
    287   void InitializeExtensionBindings(GLContext* context);
    288   void InitializeDebugBindings();
    289   void ClearBindings();
    290   void UpdateDebugExtensionBindings();
    291 
    292   ProcsGLX fn;
    293   ProcsGLX debug_fn;
    294   ExtensionsGLX ext;
    295 };
    296 #endif
    297 
    298 // This #define is here to support autogenerated code.
    299 #define g_current_gl_context g_current_gl_context_tls->Get()
    300 GL_EXPORT extern base::ThreadLocalPointer<GLApi>* g_current_gl_context_tls;
    301 
    302 GL_EXPORT extern OSMESAApi* g_current_osmesa_context;
    303 GL_EXPORT extern DriverGL g_driver_gl;
    304 GL_EXPORT extern DriverOSMESA g_driver_osmesa;
    305 
    306 #if defined(OS_WIN)
    307 
    308 GL_EXPORT extern EGLApi* g_current_egl_context;
    309 GL_EXPORT extern WGLApi* g_current_wgl_context;
    310 GL_EXPORT extern DriverEGL g_driver_egl;
    311 GL_EXPORT extern DriverWGL g_driver_wgl;
    312 
    313 #elif defined(USE_X11)
    314 
    315 GL_EXPORT extern EGLApi* g_current_egl_context;
    316 GL_EXPORT extern GLXApi* g_current_glx_context;
    317 GL_EXPORT extern DriverEGL g_driver_egl;
    318 GL_EXPORT extern DriverGLX g_driver_glx;
    319 
    320 #elif defined(USE_OZONE)
    321 
    322 GL_EXPORT extern EGLApi* g_current_egl_context;
    323 GL_EXPORT extern DriverEGL g_driver_egl;
    324 
    325 #elif defined(OS_ANDROID)
    326 
    327 GL_EXPORT extern EGLApi* g_current_egl_context;
    328 GL_EXPORT extern DriverEGL g_driver_egl;
    329 
    330 #endif
    331 
    332 // Find an entry point to the mock GL implementation.
    333 void* GL_BINDING_CALL GetMockGLProcAddress(const char* name);
    334 
    335 }  // namespace gfx
    336 
    337 #endif  // UI_GL_GL_BINDINGS_H_
    338