# OpenGL ES

Mesa implements OpenGL ES 1.1 and OpenGL ES 2.0. More informations about OpenGL ES can be found at http://www.khronos.org/opengles/.

OpenGL ES depends on a working EGL implementation. Please refer to Mesa EGL for more information about EGL.

## Build the Libraries

1. Run `configure` with `--enable-gles1 --enable-gles2` and enable the Gallium driver for your hardware.
2. Build and install Mesa as usual.

Alternatively, if XCB-DRI2 is installed on the system, one can use `egl_dri2` EGL driver with OpenGL|ES-enabled DRI drivers

1. Run `configure` with `--enable-gles1 --enable-gles2`.
2. Build and install Mesa as usual.

Both methods will install libGLESv1_CM, libGLESv2, libEGL, and one or more EGL drivers for your hardware.

## Run the Demos

There are some demos in `progs/egl/`. You can use them to test your build. For example,

      $ cd progs/egl/eglut
      $ make
      $ cd ../opengles1
      $ make
      $ ./torus_x11

## Developers

### Internal Libraries

Library Name | Used By | Enabled | OpenGL | OpenGL ES 1.x | OpenGL ES 2.x
`libmesa.a` | Classic DRI drivers | y | y | --enable-gles1 | --enable-gles2
`libmesagallium.a` | Gallium EGL and DRI drivers | y | y | --enable-gles1 | --enable-gles2

### Dispatch Table

OpenGL ES has an additional indirection when dispatching fucntions

      Mesa:       glFoo() --> _mesa_Foo()
      OpenGL ES:  glFoo() --> _es_Foo() --> _mesa_Foo()

The indirection serves several purposes

- When a function is in Mesa and the type matches, it checks the arguments and calls the Mesa function.
- When a function is in Mesa but the type mismatches, it checks and converts the arguments before calling the Mesa function.
- When a function is not available in Mesa, or accepts arguments that are not available in OpenGL, it provides its own implementation.

Other than the last case, OpenGL ES uses `APIspec.xml` to generate functions to check and/or converts the arguments.