blob: 2cab89e28d6510f7d073e132eed0c52a32d7dea3 [file] [log] [blame]
Name Strings
Gary King
Jon Leech
Marko Lukat
Tim Renouf
Jon Leech (jon 'at'
Copyright (c) 2006-2013 The Khronos Group Inc. Copyright terms at
This extension, as well as the layered EGL_KHR_lock_surface2, are
obsolete and have been replaced by EGL_KHR_lock_surface3. Khronos
recommends implementers who support this extension and lock_surface2
also implement lock_surface3, and begin transitioning developers to
using that extension. See issue 17 for the reason.
Version 17 approved by the Khronos Board of Promoters on
February 11, 2008.
Version 19, October 15, 2013
EGL Extension #2
Requires EGL 1.0
This extension is written against the wording of the EGL 1.3
This extension allows mapping color buffers of EGL surfaces into the
client address space. This is useful primarily for software
rendering on low-end devices which do not support EGL client
rendering APIs, although it may be implemented efficiently on more
capable devices as well.
There is a newer EGL_KHR_lock_surface2 extension which slightly
modifies and clarifies the semantics of this extension. Vendors
should refer to EGL_KHR_lock_surface2 before deciding to implement
only EGL_KHR_lock_surface.
New Types
New Procedures and Functions
EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
const EGLint *attrib_list);
EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy,
EGLSurface surface);
New Tokens
Returned in the EGL_SURFACE_TYPE bitmask attribute of EGLConfigs:
Accepted as an attribute name in the <attrib_list> argument of
eglChooseConfig, and the <attribute> argument of eglGetConfigAttrib:
Accepted as attribute values for the EGL_MATCH_FORMAT_KHR attribute
of eglChooseConfig:
Accepted as attribute names in the <attrib_list> argument of
Accepted as bit values in the EGL_LOCK_USAGE_HINT_KHR bitmask attribute
of eglLockSurfaceKHR:
Accepted by the <attribute> parameter of eglQuerySurface:
Returns in the *<value> parameter of eglQuerySurface when
<attribute> is EGL_BITMAP_ORIGIN_KHR:
Additions to Chapter 2 of the EGL 1.3 Specification (EGL Operation)
Add to the end of section 2.2.2:
Finally, some surfaces may be <locked>, which allows the
implementation to map buffers of that surface into client memory
for use by software renderers(fn). Locked surfaces cannot be
used for any other purpose. When a locked surface is <unlocked>,
any changes to the mapped buffer(s) are reflected in the actual
graphics or system memory containing the surface.
[fn: on implementations not supporting mapping graphics
memory, or which do not wish to take the stability and
security risks that entail, mapping may be done using
copy-out and copy-in behavior.]
Additions to Chapter 3 of the EGL 1.3 Specification (EGL Functions and Errors)
Add to the description of the EGL_BAD_ACCESS error in section 3.1:
"... or, a surface is locked)."
Add to table 3.2 ("Types of surfaces supported by an EGLConfig")
EGL Token Name Description
-------------------- ------------------------------------
EGL_LOCK_SURFACE_BIT_KHR EGLConfig allows locking surfaces
EGL_OPTIMAL_FORMAT_BIT_KHR This format is considered optimal
(preferred) when locking / mapping /
unlocking is being done.
Change the first paragraph under "Other EGLConfig Attribute
Descriptions" on p. 16:
"EGL_SURFACE_TYPE is a mask indicating both the surface types
that can be created by the corresponding EGLConfig (the config
is said to <support> those surface types), and the optional
behaviors such surfaces may allow. The valid bit settings are
shown in Table 3.2."
Add a new paragraph following the second paragraph of the same
a surface created from the EGLConfig may be locked, mapped into
client memory, and unlocked. Locking is described in section
3.5.6. If EGL_OPTIMAL_FORMAT_BIT_KHR is set in
EGL_SURFACE_TYPE_KHR, then the surface is considered optimal (by
the implementation) from a performance standpoint when buffer
mapping is being done.
Replace the second paragraph of section 3.3 "EGL Versioning":
"The EGL_CLIENT_APIS string describes which client rendering APIs
are supported. It is zero-terminated and contains a
space-separated list of API names, which may include
``OpenGL_ES'' if OpenGL ES is supported, and ``OpenVG'' if
OpenVG is supported. If no client APIs are supported, then the
empty string is returned."
Insert a new paragraph and table in section 3.4.1 "Querying
Configurations", following the description of
"If EGL_MATCH_FORMAT_KHR is specified in <attrib_list>, it must
be followed by one of the attribute values EGL_DONT_CARE,
EGL_NONE, or one of the format tokens in table
When EGL_MATCH_FORMAT_KHR has the value EGL_NONE, only configs
which cannot be locked or mapped will match. Such configs must
When EGL_MATCH_FORMAT_KHR has the value EGL_DONT_CARE, it is
When EGL_MATCH_FORMAT_KHR has one of the values in table
[locksurf.format], only EGLConfigs describing surfaces whose
color buffers have the specified format, when mapped with
eglLockSurface, will match this attribute. In this case, the
EGL_<component>_SIZE attributes of resulting configs must agree
with the specific component sizes specified by the format."
Specific Format Name Description
-------------------- -----------
EGL_FORMAT_RGB_565_EXACT_KHR RGB565 fields in order from MSB to LSB within a 16-bit integer
EGL_FORMAT_RGB_565_KHR RGB565 fields in implementation-chosen order within a 16-bit integer
EGL_FORMAT_RGBA_8888_EXACT_KHR RGBA8888 fields in B, G, R, A byte order in memory
EGL_FORMAT_RGBA_8888_KHR RGBA8888 fields in implementation-chosen order within a 32-bit integer
Table [locksurf.format]: Specific formats for mapped pixels.
Add to table 3.4 ("Default values and match critera for EGLConfig
attributes") on page 22:
Attribute Default Selection Sort Sort
Criteria Order Priority
-------------------- ------------- --------- ----- --------
Add EGL_MATCH_FORMAT_KHR to the last paragraph in section 3.4.1 on
p. 23, describing attributes not used for sorting EGLConfigs.
Add a new section following the current section 3.5.5:
"3.5.6 Locking and Mapping Rendering Surfaces
A rendering surface may be <locked> by calling
EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy,
EGLSurface surface,
const EGLint *attrib_list);
While a surface is locked, only two operations can be performed
on it. First, the color buffer of the surface may be <mapped>,
giving a pointer into client memory corresponding to the memory
of the mapped buffer, and attributes describing mapped buffers
may be queried. Second, the surface may be unlocked. Any
attempts to use a locked surface in other EGL APIs will fail and
generate an EGL_BAD_ACCESS error.
<attrib_list> specifies additional parameters affecting the locking
operation. The list has the same structure as described for
eglChooseConfig. Attributes that may be defined are shown in table
[locksurf.attr], together with their default values if not specified
in <attrib_list>, and possible values which may be specified for
them in <attrib_list>.
Attribute Name Type Default Value Possible Values
----------------------- ------- ------------- -------------------------
Table [locksurf.attr]: eglLockSurfaceKHR attribute names,
default values, and possible values.
On failure, the surface is unaffected and eglLockSurfaceKHR
returns EGL_FALSE. An EGL_BAD_ACCESS error is generated if any
of these condition, are true:
* <surface> was created with an EGLConfig whose
EGL_SURFACE_TYPE attribute does not contain
* <surface> is already locked.
* Any client API is current to <surface>.
An EGL_BAD_ATTRIBUTE error is generated if an attribute or
attribute value not described in table [locksurf.attr] is
Mapping Buffers of a Locked Surface
The color buffer of a locked surface can be <mapped> by calling
eglQuerySurface (see section 3.5.7) with <attribute>
EGL_BITMAP_POINTER_KHR(fn). The query returns a pointer to a
buffer in client memory corresponding to the color buffer of
<surface>. In the case of a back-buffered surface, color buffer
refers to the back buffer
[fn: "mapped" only means that the pointer returned is
intended to *correspond* to graphics memory. Implementation
are not required to return an actual pointer into graphics
memory, and often will not.]
The contents of the mapped buffer are initially undefined(fn)
unless the EGL_MAP_PRESERVE_PIXELS_KHR attribute of
eglLockSurfaceKHR is set to EGL_TRUE, in which case the contents
of the buffer are taken from the contents of <surface>'s color
buffer. The default value of EGL_MAP_PRESERVE_PIXELS_KHR is
[fn: In order to avoid pipeline stalls and readback delays on
accelerated implementations, we do not mandate that the
current contents of a color buffer appear when it's mapped
to client memory, unless the EGL_MAP_PRESERVE_PIXELS_KHR
flag is set. Applications using mapped buffers which are not
preserved must write to every pixel of the buffer before
unlocking the surface. This constraint is considered
acceptable for the intended usage scenario (full-frame
software renderers).]
The EGL_LOCK_USAGE_HINT_KHR attribute of eglLockSurfaceKHR is a
bitmask describing the intended use of the mapped buffer. If the
mask contains EGL_READ_SURFACE_BIT_KHR, data will be read from
the mapped buffer. If the mask contains
EGL_WRITE_SURFACE_BIT_KHR, data will be written to the mapped
buffer. Implementations must support both reading and writing to
a mapped buffer regardless of the value of
EGL_LOCK_USAGE_HINT_KHR, but performance may be better if the
hint is consistent with the actual usage of the buffer. The
default value of EGL_LOCK_USAGE_HINT_KHR hints that both reads
and writes to the mapped buffer will be done.
Other attributes of the mapped buffer describe the format of
pixels it contains, including its pitch (EGL_BITMAP_PITCH_KHR),
origin, pixel size, and the bit width and location of each color
component within a pixel. These attributes may be queried using
eglQuerySurface, and are described in more detail in section
of a locked surface may change following successive calls to
eglLockSurfaceKHR(fn), so they must be queried each time a
buffer is mapped. Other attributes of a mapped buffer are
invariant and need be queried only once following surface
[fn: The pointer and pitch of a mapped buffer may change due
to display mode changes, for example.]
Mapping will not suceed if client memory to map the surface into
cannot be allocated. In this case, querying eglQuerySurface with
<attribute> EGL_BITMAP_POINTER_KHR will fail and generate an EGL
Unlocking Surfaces
A rendering surface may be <unlocked> by calling
EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy,
EGLSurface surface);
Any mapped buffers of <surface> become unmapped following
eglUnlockSurfaceKHR. Any changes made to mapped buffers of
<surface> which it was locked are reflected in the surface after
[fn: This language enables implementations to either map
video memory, or copy from a separate buffer in client
If <surface> was created with an EGLConfig whose
then the surface is considered optimal (by the implementation)
from a performance standpoint when buffer mapping is being
[fn: This often means that the format of all mapped buffers
corresponds directly to the format of those buffers in
<surface>, so no format conversions are required during
unmapping. This results in a high-performance software
rendering path. But "optimal format" is really just a hint
from EGL that this config is preferred, whatever the actual
On failure, eglUnlockSurfaceKHR returns EGL_FALSE. An
EGL_BAD_ACCESS error is generated if any of these conditions are
* <surface> is already unlocked.
* A display mode change occurred while the surface was locked,
and the implementation was unable to reflect mapped buffer
state(fn). In this case, <surface> will still be unlocked.
However, the contents of the previously mapped buffers of
<surface> become undefined, rather than reflecting changes
made in the mapped buffers in client memory.
[fn: Usually this may only occur with window surfaces which
have been mapped. EGL does not have an event mechanism to
indicate display mode changes. If such a mechanism exists
(using native platform events or the OpenKODE event system),
applications should respond to mode changes by regenerating
all visible window content, including re-doing any software
rendering overlapping the mode change.]"
Add to table 3.5 ("Queryable surface attributes and types")
Attribute Type Description
--------- ---- -----------
EGL_BITMAP_POINTER_KHR pointer Address of a mapped color buffer (MCB).
EGL_BITMAP_PITCH_KHR integer Number of bytes between the start of
adjacent rows in an MCB.
EGL_BITMAP_ORIGIN_KHR enum Bitmap origin & direction
EGL_BITMAP_PIXEL_x_OFFSET_KHR integer Bit location of each color buffer
component within a pixel in an MCB.
Add to the description of eglQuerySurface properties in section
3.5.6 (renumbered to 3.5.7) on page 33:
"Properties of a bitmap surface which may be queried include:
* EGL_BITMAP_POINTER_KHR, which maps the color buffer of a
locked surface and returns the address in client memory of
the mapped buffer.
* EGL_BITMAP_PITCH_KHR, which returns the number of bytes
between successive rows of a mapped buffer.
* EGL_BITMAP_ORIGIN_KHR, which describes the way in which a
mapped color buffer is displayed on the screen. Possible
indicating that the first pixel of the mapped buffer
corresponds to the lower left or upper left of a visible
window, respectively.
* EGL_BITMAP_PIXEL_<x>_OFFSET_KHR, which describes the bit
location of the least significant bit of each color
component of a pixel within a mapped buffer. <x> is one of
The offset for a color component should be treated as the
number of bits to left shift the component value to place it
within a 16- (for RGB565 formats) or 32-bit (for RGBA8888
formats) integer containing the pixel(fn). If a color
component does not exist in the mapped buffer, then the bit
offset of that component is zero.
In addition to these attributes, the number of bits for each
color component of a pixel within a mapped buffer is obtained by
querying the EGL_<x>_SIZE attribute of the EGLConfig used to
create the surface, where <x> is <x> is one of RED, GREEN, BLUE,
ALPHA, or LUMINANCE. The size of a pixel in the mapped buffer,
in bytes, can be determined by querying the EGL_BUFFER_SIZE
attribute of the EGLConfig, rounding up to the nearest multiple
of 8, and converting from bits to bytes.
allowed when <surface> is mapped (see section 3.5.6). Querying
either of these attributes for the first time after calling
eglLockSurfaceKHR causes the color buffer of the locked surface
to be mapped. Querying them again before unlocking the surface
will return the same values as the first time. However, after
calling eglUnlockSurfaceKHR, these properties become undefined.
After a second call to eglLockSurfaceKHR, these properties may
again be queried, but their values may have changed.
Other properties of the mapped color buffer of a surface are
invariant, and need be queried only once following surface
creation. If <surface> was created with an EGLConfig whose
EGL_SURFACE_TYPE attribute does not contain
EGL_BITMAP_PIXEL_<x>_OFFSET_KHR return undefined values."
Add to the description of eglQuerySurface errors in the last
paragraph of section 3.5.6 (renumbered to 3.5.7) on page 34:
"... If <attribute> is either EGL_BITMAP_POINTER_KHR or
EGL_BITMAP_PITCH_KHR, and either <surface> is not locked using
eglLockSurfaceKHR, or <surface> is locked but mapping fails,
then an EGL_BAD_ACCESS error is generated."
1) What is the rationale for this extension?
Software renderers on low-end implementations need an efficient way
to draw pixel data to the screen. High-end implementations must
support the same interface for compatibility, while not compromising
the accelerability of OpenGL ES and OpenVG client APIs using
dedicated graphics hardware and memory.
Using lock/unlock semantics enables low-end implementations to
expose pointers directly into display memory (as extremely dangerous
as that may be), while high-end implementations may choose to create
backing store in client memory when mapping a buffer, and copy it to
graphics memory when the surface is unlocked. Making the initial
contents of a mapped buffer undefined means that no readbacks from
graphics memory are required, avoiding pipeline stalls.
This extension is not intended to support mixed-mode (client API and
software) rendering. Since mapped buffer contents are undefined,
unless the buffer is explicitly preserved (which may be unacceptably
expensive on many implementations), applications doing software
rendering must touch every pixel of mapped buffers at least once
before unlocking the surface.
2) Do we need to know if locked surfaces are "fast" or "native"?
RESOLVED: Yes. This is indicated with the EGL_OPTIMAL_FORMAT_BIT_KHR
of EGL_SURFACE_TYPE. However, note that there is no way to guarantee
what "fast" or "no format conversions" really means; this is little
more than an implementation hint.
3) Should we be able to map buffers other than the color buffer?
RESOLVED: Not initially. However, the <attrib_list> parameter of
eglLockSurfaceKHR supports this in the future. There is no <buffer>
attribute to eglQuerySurface, so such a layered extension would have
to either create a new naming convention (such as
extended query eglQuerySurfaceBuffer() which takes a <buffer>
parameter. It would also be tricky to support interleaved depth /
stencil formats. But the attribute list offers some future-proofing
at low cost.
4) What properties of mapped buffers can be queried?
RESOLVED: A pointer to the buffer and its pitch, both of which may
change in successive lock/unlock cycles. These may be queried only
while the underlying surface is locked, and are undefined after
unlocking. The first query following locking is the point at which
actual buffer mapping must occur.
RESOLVED: Additionally, the pixel size, origin, and color component
bitfield size and offset for each component, which are invariant
and may be queried at any time.
5) How are mode changes indicated? What happens to the mapped
buffer during a mode change?
RESOLVED: UnlockSurfaceKHR fails and raises an error if a mode
change occurred while the surface was locked (although the surface
still ends up in the unlocked state - this is necessary since
there's no way to clear the error!). If a mode change occurs while a
buffer is mapped, the implementation must still allow the
application to access mapped buffer memory, even though the contents
of the mapped buffer may not be reflected in the changed window
after unmapping.
Note: There's no convenient way to indicate mode changes while
a surface is unlocked, despite that being useful to tell apps they
have to redraw. The problem is that we don't have an event system,
and the power management functionality is overkill since the only
resources which are likely to be damaged by a mode change are
visible window contents. Fortunately, this problem is beyond the
scope of this extension.
6) Does locking a surface imply mapping its buffers?
RESOLVED: No. Locking simply places the surface in that state and
prevents it from being made current / swapped / etc. Buffers are
mapped only when their pointers or pitch are queried using
An interesting side effect of this resolution is that calling
eglLockSurfaceKHR immediately followed by eglUnlockSurfaceKHR DOES
NOT CHANGE THE CONTENTS OF BUFFERS, since none of them were mapped.
Likewise locking a surface, querying a buffer pointer or pitch, and
then unlocking it without changing the mapped buffer contents causes
the surface contents of the mapper buffer(s) to become undefined.
At the Atlanta F2F, there was a suggestion that eglLockSurfaceKHR
should immediately map the color buffer and return a pointer to it,
on the basis that this would make it harder for applications to
mistakenly use an old buffer pointer from a previous mapping cycle.
At the same time, people working on more powerful GPUs wanted the
lock operation to be lightweight. These are not consistent goals and
we have thus far chosen to separate the lightweight locking, and
more expensive mapping operations.
7) Can buffer contents be preserved in mapping?
RESOLVED: Yes. The default behavior is to discard / leave undefined
the mapped buffer contents, but the EGL_MAP_PRESERVE_PIXELS_KHR flag
may be specified to eglLockSurfaceKHR.
8) Should usage hints be provided during mapping?
RESOLVED: Yes, they may be provided in the EGL_LOCK_USAGE_HINT_KHR
bitmask attribute to eglLockSurfaceKHR. Implementations are required
to behave correctly no matter the value of the flag vs. the
operations actually performed, so the hint may be ignored.
9) Should we be able to lock subrectangles of a surface?
RESOLVED: No. However, the attribute list parameter of
eglLockSurfaceKHR allows a layered extension to implement this
behavior by specifying an origin and size to map within the buffer.
10) Should the BITMAP_PIXEL_<component>_OFFSET attributes belong to the
surface, or the config?
RESOLVED: Part of the surface. Configs supporting a specific format
are matched with config attribute EGL_MATCH_FORMAT_KHR, which
supports specific bit-exact formats such as
11) Can the pixel size in a mapped buffer be derived from the
EGL_BUFFER_SIZE attribute of the config used to create it?
RESOLVED: Yes. In principle, hardware using padding bytes in its
framebuffer storage could be a problem, and a separate
BITMAP_PIXEL_SIZE surface attribute would be needed. However, we
don't think implementations are likely to waste graphics memory and
bandwidth in this fashion.
12) How are color component locations within a pixel described?
RESOLVED: Each R, G, B, and A component has a queryable bit offset
within an integer. The size of the integer depends on the total size
of the pixel; for the 565 formats, the pixel is a 16-bit integer.
For the 8888 formats, the pixel is a 32-bit integer.
We cannot describe component locations with byte locations, since
the 565 formats have components straddling byte boundaries. However,
this means that offsets for the RGBA8888_EXACT format are different
between little- and big-endian CPUs, since the desired format is B,
G, R, A components laid out as bytes in increasing memory order.
13) Can mapped buffer contents be affected by other EGL operations?
RESOLVED: No. A locked surface only allows two operations:
unlocking, and mapping. No other EGL operations can take place while
the surface is locked (if this were not the case, then
eglSwapBuffers might destroy the contents of a mapped buffer).
It is possible that operations outside the scope of EGL could affect
a mapped color buffer. For example, if a surface's color buffer were
made up of an EGLImage, one of the EGL client APIs could draw to
that image while it was mapped. Responsibility for avoiding this
situation is in the hands of the client.
14) Can EGL_MATCH_FORMAT_KHR be queried for a config?
RESOLVED: Yes. Unlockable configs return EGL_NONE for this
15) Is a goal of this extension to support "mixed-mode" rendering (both
software and EGL client API rendering to the same surface)?
RESOLVED: No. An implementation *can* choose to export configs
supporting creation of lockable surfaces which also support
rendering by OpenGL ES, OpenVG, or other client APIs (when the
surface is not locked). But there is nothing in the extension
requiring this, and the motivation for the extension is simply to
support software rendering.
16) Can mapping a locked surface fail?
RESOLVED: Yes, if memory can't be allocated in the client. This is
indicated by queries of EGL_BITMAP_POINTER_KHR and
EGL_BITMAP_PITCH_KHR failing and generating an EGL_BAD_ACCESS error.
17) Why has this extension been obsoleted and replaced by
RESOLVED: Starting with the December 4, 2013 release of EGL 1.4, EGLint
is defined to be the same size as the native platform "int" type. Handle
and pointer attribute values *cannot* be represented in attribute lists
on platforms where sizeof(handle/pointer) > sizeof(int). Existing
extensions which assume this functionality are being replaced with new
extensions specifying new entry points to work around this issue. See
the latest EGL 1.4 Specification for more details.
Revision History
Version 19, 2013/10/15 - Add issue 17 explaining that the bitmap pointer
cannot be safely queried using this extension on 64-bit platforms,
and suggest EGL_KHR_lock_surface3 instead. Change formal parameter
names from 'display' to 'dpy' to match other EGL APIs.
Version 18, 2010/03/23 - Added introductory remark referring to the
EGL_KHR_lock_surface2 extension. Clarified that it is the back
buffer of a back-buffered surface that is mapped.
Version 17, 2008/10/08 - Updated status (approved as part of
OpenKODE 1.0).
Version 16, 2008/01/24 - Add issue 16 noting that mapping can fail,
and a corresponding new error condition for eglQuerySurface.
Clean up the issues list.
Version 15, 2008/01/09 - Add issue 15 noting that supporting
mixed-mode rendering is not a goal or requirement of the
Version 14, 2007/11/07 - change ARGB_8888_EXACT back to
RGBA_8888_EXACT, since the offsets are now dependent on the
endianness of the CPU. Add issue 12 describing this, and clarify
that offsets are within a 16- or 32-bit integer depending on the
format. Added issue 13 clarifying that locked buffer contents
are not affected by eglSwapBuffers, because eglSwapBuffers
cannot be issued on a mapped surface. Allow querying
EGL_MATCH_FORMAT_KHR for a config, and added related issue 14.
Version 13, 2007/05/10 - change RGBA_8888_EXACT to ARGB_8888_EXACT
to match hardware layout.
Version 12, 2007/04/06 - clarify that when EGL_MATCH_FORMAT_KHR is
EGL_DONT_CARE, it does not affect component size of selected
Version 11, 2007/04/05 - add missing KHR suffix to some tokens.
Version 10, 2007/04/05 - assign enumerant values. Add OpenKODE 1.0
Provisional disclaimer.
Version 9, 2007/03/26 - add format tokens to "New Tokens"
section. Correct description of RGBA format tokens.
Version 8, 2007/03/26 - add issue 11 noting theoretical possibility
of EGL_BUFFER_SIZE not directly corresponding to the mapped
pixel size. Add EGL_MATCH_FORMAT_KHR attribute to
eglChooseConfig, and 565 / 8888 formats for it.
Version 7, 2007/03/25 - note in issue 5 that access to a mapped
buffer must continue to work even after a mode change. Add KHR
suffix to new functions and tokens. Remove BITMAP_PIXEL_<x>_BITS
and BITMAP_PIXEL_SIZE tokens, which duplicate information in the
EGLConfig. Add issue 10 asking whether bitmap pixel offset
attributes belong to the config, or to the surface.
Version 6, 2007/02/26 - allow EGL_CLIENT_APIS string to be empty in
implementations supporting only this extension.
Version 5, 2007/02/05 - update contributor list. Changed bit offset
queries to return LSB offset, rather than MSB offset.
Version 4, 2007/02/02 - correct extension name. Change
Replace buffer_mask parameter of eglLockSurfaceKHR with an
attribute list. Add the EGL_MAP_PRESERVE_PIXELS_KHR and
EGL_LOCK_USAGE_HINT_KHR attributes per request from Gary. Add issues
7, 8, and 9 describing these attributes and how to support
locking subrects in a layered extension, by extending the
attribute list.
Version 3, 2007/02/01 - the implementation once again controls the
mapped buffer memory. There is no longer a separate bitmap
surface type; any type surface may potentially be mapped, using
lock/unlock semantics.
Version 2, 2006/12/22 - simplify by only supporting drawing from
client memory to EGL surface color buffers. Specify use of
OpenGL DrawPixels terminology. Change name of the extension to
EGL_KHR_draw_pixels, since there is no longer any "bitmap
surface" involved.
Version 1, 2006/12/14 - write up as formal spec language for
external review.