5.1.2. General limitations

This section describes:

Implementation-specific behavior

Where the OpenGL ES 2.0 or OpenGL ES 1.1 specifications permit implementation-specific behavior, the behavior is usually determined by the underlying driver. The behavior of the graphics card drivers can differ from the behavior of Mali drivers and hardware. This includes implementation-dependent limits, for example:

  • texture sizes

  • extensions

  • mipmap level calculation

  • precision of shaders (on OpenGL ES 2.0)

  • framebuffers.

glShaderBinary always fails (OpenGL ES 2.0 only)

Because of the incompatibility between binary formats for different graphics engines, the OpenGL ES emulator provides support for ESSL shader source code only and does not provide support for compiled Mali-200 or Mali-400 MP shader binaries. The call glShaderBinary() has no functionality and always returns the error GL_INVALID_ENUM because no binary formats are supported.

Fixed-point data gives reduced performance

OpenGL 2.0 does not provide support for fixed-point data, but this is required by the OpenGL ES 2.0 specification. The OpenGL ES emulator converts fixed-point data and passes it to OpenGL 2.0. For the OpenGL ES emulator, fixed-point data gives lower performance than floating-point data. This effect is stronger if you use a client-side vertex array rather than a vertex buffer object. The OpenGL ES emulator must convert a client-side vertex array on each draw call, because the client application might modify the data between draw calls.

Shader precision qualifiers are ignored (OpenGL ES 2.0 only)

The lowp, mediump and highp qualifiers in the OpenGL ES 2.0 Shading Language (ESSL) have no equivalents in the OpenGL 2.0 Shading Language (GLSL), and are removed. Because precision of shader variables is implementation dependent in OpenGL 2.0, shader variables might not have the minimum range or precision required by the ESSL specification.

gIGetShaderPrecisionFormat values (OpenGL ES 2.0 only)

glGetShaderPrecisionFormat() returns the same values as the Mali-200 driver, but the actual range and precision depends on the underlying OpenGL 2.0 driver. There is no equivalent query mechanism for the OpenGL 2.0 driver.

glGenerateMipmap performance (OpenGL ES 2.0 only)

glGenerateMipmap() can be slow, because it might require working around a defect in the NVIDIA and ATI drivers.

Compressed texture formats

GL_OES_compressed_ETC1_RGB8_texture is supported, but it is treated internally as RGB8. It is therefore possible to mix this format with uncompressed RGB8 texture data in ways that can cause either an error or an incomplete texture when used with Mali drivers on Mali GPU hardware.

OpenGL GLSL Shader compiler errors reported by the OpenGL ES emulator cannot be easily mapped onto the original source code (OpenGL ES 2.0 only)

Shader compiler error line numbers reported from the underlying OpenGL graphics driver might not match because of the translation of ESSL to GLSL.

Due to translation of shader language from ESSL to GLSL for use by the underlying OpenGL graphics driver and the concatenation of strings input to glShaderSource, error line numbers may not match the original source code.


  • On Windows, ensure the malisc compiler is installed and on the path. The shader code is sent unmodified to malisc, so line numbers are correct. Note that separate strings submitted to glShaderSource are concatenated before sending to malisc.

  • On Linux, there is no workaround.

Multiple threads and multiple contexts

Multiple contexts are supported, but multiple threads are not supported and might lead to unpredictable behavior.

Vertex buffer objects performance (OpenGL ES 1.1 only)

Vertex buffer objects are supported by OpenGL ES Emulator and are implemented in software for OpenGL ES 1.1 applications. Vertex buffer objects therefore follow the behavior specified in the OpenGL ES 1.1 specification rather than the behavior of the underlying OpenGL 2.0 driver. This might affect performance.

Copyright © 2009-2012 ARM. All rights reserved.ARM DUI 0511F