Name

    EXT_shared_texture_palette

Name Strings

    GL_EXT_shared_texture_palette

Contact

    Jon Leech, SGI (ljp 'at' sgi.com)
    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Version

    Last Modified Date: March 24, 2004
    Revision: 1.4

Number

    141

Support

    Mesa.

    Selected NVIDIA GPUs: NV1x (GeForce 256, GeForce2, GeForce4 MX,
    GeForce4 Go, Quadro, Quadro2), NV2x (GeForce3, GeForce4 Ti,
    Quadro DCC, Quadro4 XGL), and NV3x (GeForce FX 5xxxx, Quadro FX
    1000/2000/3000).  NV3 (Riva 128) and NV4 (TNT, TNT2) GPUs and NV4x
    GPUs do NOT support this functionality (no hardware support).
    Future NVIDIA GPU designs will no longer support paletted textures.

    S3 ProSavage, Savage 2000.

    3Dfx Voodoo3, Voodoo5.

    3Dlabs GLINT.

Dependencies

    EXT_paletted_texture is required.

Overview

    EXT_shared_texture_palette defines a shared texture palette which may be
    used in place of the texture object palettes provided by
    EXT_paletted_texture. This is useful for rapidly changing a palette
    common to many textures, rather than having to reload the new palette
    for each texture. The extension acts as a switch, causing all lookups
    that would normally be done on the texture's palette to instead use the
    shared palette.

IP Status

    None.

Issues

    *  Do we want to use a new <target> to ColorTable to specify the
       shared palette, or can we just infer the new target from the
       corresponding Enable?

    *  A future extension of larger scope might define a "texture palette
       object" and bind these objects to texture objects dynamically, rather
       than making palettes part of the texture object state as the current
       EXT_paletted_texture spec does.

    *  Should there be separate shared palettes for 1D, 2D, and 3D
       textures?

       Probably not; palette lookups have nothing to do with the
       dimensionality of the texture. If multiple shared palettes
       are needed, we should define palette objects.

    *  There's no proxy mechanism for checking if a shared palette can
       be defined with the requested parameters. Will it suffice to
       assume that if a texture palette can be defined, so can a shared
       palette with the same parameters?

    *  The changes to the spec are based on changes already made for
       EXT_paletted_texture, which means that all three documents must
       be referred to. This is quite difficult to read.

    *  The changes to section 3.8.6, defining how shared palettes are
       enabled and disabled, might be better placed in section 3.8.1.
       However, the underlying EXT_paletted_texture does not appear to
       modify these sections to define exactly how palette lookups are
       done, and it's not clear where to put the changes.

    *  How does the shared texture palette interact with multitexture
       support?  There is a single global shared texture palette that
       all texture units utilize (as opposed to a shared texture palette
       per texture unit).

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameters of GetBooleanv, GetIntegerv,
    GetFloatv, GetDoublev, IsEnabled, Enable, Disable, ColorTableEXT,
    ColorSubTableEXT, GetColorTableEXT, GetColorTableParameterivEXT, and
    GetColorTableParameterfd EXT:

    SHARED_TEXTURE_PALETTE_EXT              0x81FB

Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.1 Specification (Rasterization)

  Section 3.8, 'Texturing,' subsection 'Texture Image Specification' is
  modified as follows:

    In the Palette Specification Commands section, the sentence
    beginning 'target specifies which texture is to' should be changed
    to:

      target specifies the texture palette or shared palette to be
      changed, and may be one of TEXTURE_1D, TEXTURE_2D,
      PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, TEXTURE_3D_EXT,
      PROXY_TEXTURE_3D_EXT, or SHARED_TEXTURE_PALETTE_EXT.

    In the 'Texture State and Proxy State' section, the sentence
    beginning 'A texture's palette is initially...' should be changed
    to:

      There is also a shared palette not associated with any texture,
      which may override a texture palette. (Even when multiple texture
      units are available, there is still only a single shared texture
      palette.) All palettes are initially...

  Section 3.8.6, 'Texture Application' is modified by appending the
  following:

    Use of the shared texture palette is enabled or disabled using the
    generic Enable or Disable commands, respectively, with the symbolic
    constant SHARED_TEXTURE_PALETTE_EXT.

    The required state is one bit indicating whether the shared palette is
    enabled or disabled. In the initial state, the shared palettes is
    disabled.

Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations
and the Frame buffer)

Additions to Chapter 5 of the 1.1 Specification (Special Functions)

Additions to Chapter 6 of the 1.1 Specification (State and State Requests)

    In the section on GetTexImage, the sentence beginning 'If format is
    not COLOR_INDEX...' should be changed to:

      If format is not COLOR_INDEX, the texture's indices are passed
      through the texture's palette, or the shared palette if one is
      enabled, and the resulting components are assigned among R, G, B,
      and A according to Table 6.1.

    In the GetColorTable section, the first sentence of the second
    paragraph should be changed to read:

      GetColorTableEXT retrieves the texture palette or shared palette
      given by target.

    The first sentence of the third paragraph should be changed to read:

      Palette parameters can be retrieved using
        void GetColorTableParameterivEXT(enum target, enum pname, int *params);
        void GetColorTableParameterfvEXT(enum target, enum pname, float *params);
      target specifies the texture palette or shared palette being
      queried and pname controls which parameter value is returned.

Additions to the GLX Specification

    None

New State

Get Value                   Type  Get Command                  Initial Value  Description     Sec    Attribute
--------------------------  ----  ---------------------------  -------------  --------------  -----  --------------
SHARED_TEXTURE_PALETTE_EXT  B     IsEnabled                    False          shared texture  3.8.6  texture/enable
                                                                              palette enable
SHARED_TEXTURE_PALETTE_EXT  I     GetColorTableEXT             empty          shared texture  3.8    -
                                                                              palette table
COLOR_TABLE_FORMAT_EXT      Zn    GetColorTableParameterivEXT  RGBA           shared texture  3.8    -
                                                                              palette format
COLOR_TABLE_WIDTH_EXT       Z+    GetColorTableParameteriv     0              shared texture  3.8    -
                                                                              palette width
COLOR_TABLE_x_SIZE_EXT      6xZ+  GetColorTableParameteriv     0              shared texture  3.8    -
                                                                              palette
                                                                              component sizes

New Implementation Dependent State

    None

Revision History

    September 4, 2002 - Add missing IP Status / Contact fields
    (without bumping the revision) and incorporated Mark's changes
    into the registry. (Jon Leech)

    July 10, 2002 (version 1.3) - Added "New State" tables entries.
    Clarify that there is a single global shared texture palette, 
    rather than a per-texture unit palette when multitexture is
    available. (Mark Kilgard)

    March 24, 2004 (version 1.4) - Document vendor support for this
    extension; note that future NVIDIA GPU designs will not support this
    extension. (Mark Kilgard)

