blob: c463a15d1629b795d9d2df0421f29b43e1ccbe40 [file] [log] [blame]
Name
APPLE_client_storage
Name Strings
GL_APPLE_client_storage
Contact
Geoff Stahl, Apple (gstahl 'at' apple.com)
Status
Complete
Version
$Date: 2002/08/27 01:40:16 $ $Revision: 1.6 $
Number
270
Dependencies
OpenGL 1.1 is required.
The extension is written against the OpenGL 1.2.1 Specification.
Overview
This extension provides a simple mechanism to optimize texture data handling
by clients. GL implementations normally maintain a copy of texture image
data supplied clients when any of the various texturing commands, such as
TexImage2D, are invoked. This extension eliminates GL's internal copy of
the texture image data and allows a client to maintain this data locally for
textures when the UNPACK_CLIENT_STORAGE_APPLE pixel storage parameter is
TRUE at the time of texture specification. Local texture data storage is
especially useful in cases where clients maintain internal copies of
textures used in any case. This results in what could be considered an
extra copy of the texture image data. Assuming all operations are error
free, the use of client storage has no affect on the result of texturing
operations and will not affect rendering results. APPLE_client_storage
allows clients to optimize memory requirements and copy operations it also
requires adherence to specific rules in maintaining texture image data.
Clients using this extension are agreeing to preserve a texture's image data
for the life of the texture. The life of the texture is defined, in this
case, as the time from first issuing the TexImage3D, TexImage2D or
TexImage1D command, for the specific texture object with the
UNPACK_CLIENT_STORAGE_APPLE pixel storage parameter set to TRUE, until the
DeleteTextures command or another TexImage command for that same object.
Only after DeleteTextures has completed, or new texture is specified, can
the local texture memory be released, as it will no longer be utilized by
OpenGL. Changing the UNPACK_CLIENT_STORAGE_APPLE pixel storage parameter
will have no additional effect once the texturing command has been issued
and specifically will not alleviate the client from maintaining the texture
data.
Client storage is implemented as a pixel storage parameter which affects
texture image storage at the time the texturing command is issued. As with
other pixel storage parameters this state may differ from the time the
texturing command in executed if the command is placed in a display list.
The PixelStore command is used to set the parameter
UNPACK_CLIENT_STORAGE_APPLE. Values can either be TRUE or FALSE, with TRUE
representing the use of client local storage and FALSE indicating the OpenGL
engine and not the client will be responsible for maintaining texture
storage for future texturing commands issued per the OpenGL specification.
The default state for the UNPACK_CLIENT_STORAGE_APPLE parameter is FALSE
Client storage is only available for texture objects and not the default
texture (of any target type). This means that a texture object has to
generated and bound to be used with client storage. Setting
UNPACK_CLIENT_STORAGE_APPLE to TRUE and texturing with the default texture
will result in normally texturing with GL maintaining a copy of the texture
image data.
Normally, client storage will be used in conjunction with normal texturing
techniques. An application would use GenTextures to generate texture
objects as needed. BindTexture to the texture object name of interest.
Enable client storage via the PixelStore command setting the
UNPACK_CLIENT_STORAGE_APPLE parameter to TRUE. Then use TexImage3D,
TexImage2D or TexImage1D to specify the texture image. If no further use of
client storage is desired, it is recommended to again use the PixelStore
command, in this case setting the UNPACK_CLIENT_STORAGE_APPLE parameter to
FALSE to disable client storage, since this pixel state is maintained unless
explicitly set by the PixelStore command.
If an application needs to modify the texture, using TexSubImage for
example, it should be noted that the pointer passed to TexSubImage1D,
TexSubImage2D or TexSubImage3D does not have to the same, or within the
original texture memory. It if is not, there is the likelihood of GL
copying the new data to the original texture memory owned by the client,
thus actually modifying this texture image data. This does not affect
requirement to maintain the original texture memory but also does not add
the requirement to maintain the sub image data, due to the copy.
Once a client has completed use of the texture stored in client memory, it
should issue a DeleteTextures command to delete the texture object or issue
a texture command, with the same target type, for the object, with either a
different data pointer, or UNPACK_CLIENT_STORAGE_APPLE set to false, in any
case, breaking the tie between GL and the texture buffer. An implicit Flush
command is issued in these cases, ensuring all access to the texture by
OpenGL is complete. Only at this point can the texture buffer be safely
released. Releasing the texture buffer prior has undefined results and will
very possibly display texel anomalies at run time. System level memory
management and paging schemes should not affect the use of client storage.
Consider in any case, that GL has an alias of the base pointer for this
block of texture memory which is maintained until GL is finished rendering
with the texture and it has been deleted or reassigned to another set of
texture data. As long as this alias exists, applications must not
de-allocate, move or purge this memory.
New Procedures and Functions
None
New Tokens
Accepted by the <pname> parameters of PixelStore:
UNPACK_CLIENT_STORAGE_APPLE 0x85B2
Additions to Chapter 3 of the 1.2.1 Specification (Rasterization)
- (3.6.1, p. 75) Add new PixelStore parameter:
Add to Table 3.1 (p. 76):
Parameter Name Type Initial Value Valid Range
-------------- ---- ------------- -----------
UNPACK_CLIENT_STORAGE_APPLE boolean FALSE TRUE/FALSE
- (3.8.1, p. 117) Last paragraph first sentence changed to:
"If the pixel storage parameter UNPACK_CLIENT_STORAGE_APPLE is false the
image indicated to the GL by the image pointer is decoded and copied into
the GL's internal memory."
- (3.8.1, p. 118) Add paragraphs before to last paragraph in section:
"If the pixel storage parameter UNPACK_CLIENT_STORAGE_APPLE is TRUE, GL
will not copy but instead will attempt to decode the texture image
data directly from client memory. GL will fall back to the default copy
and decode behavior if modifications to the texture image data are
required to decode the texels. This fall back may occur if ARB_imaging is
enabled, texture image data format or internal format indexed,
UNPACK_SWAP_BYTES is TRUE, or texturing from the default texture object.
Otherwise, GL will attempt to use the client local memory directly to
decode the texels.
Clients using the UNPACK_CLIENT_STORAGE_APPLE pixel storage parameter will
maintain a texture's image data for the life of the texture. The life of
the texture in this case is the time from issuing this texture command,
for the specific texture object, until the DeleteTextures command or
another texture command for this same texture object. Only after
DeleteTextures has completed, or new texture image data is specified, can
the client local memory be released. Releasing the texture buffer prior
has undefined results and will very possibly display texel anomalies at
run time. System level memory management and paging schemes should not
affect the use of client local storage. Consider, that GL has an alias of
the base pointer for this block of client memory which is maintained until
GL is finished rendering with the texture and it has been deleted or
reassigned to other texture image data. As long as this alias exists,
clients must not de-allocate, move or purge this memory. Otherwise,
texturing from with client local storage is unchanged from the default
copy and decode behavior."
- (3.8.2, p. 123) Add final paragraph in section:
"Note, if the existing target texture array has enabled client local
storage via the UNPACK_CLIENT_STORAGE_APPLE pixel storage parameter and if
client local storage is being used, TexSubImage and CopyTexImage may
directly modify the client memory being used as storage for a texture's
image data."
Additions to Chapter 6 of the 1.2.1 Specification (State and State Requests)
None
Additions to the GLX Specification
None
GLX Protocol
None
Errors
None (Texturing using client local storage behaves as texturing with client
local storage and no additional errors are generated)
New State
(table 6.17, p. 207)
Get Value Type Get Command Initial Value Description Sec. Attribute
--------- ---- ----------- ------------- ----------- ---- ---------
UNPACK_CLIENT_STORAGE_APPLE B GetBooleanv FALSE Value of 4.3 pixel-store
UNPACK_CLIENT_STORAGE_APPLE
New Implementation Dependent State
None