Name

    OES_fixed_point

Name Strings

    GL_OES_fixed_point

Contact

    David Blythe (blythe 'at' bluevoid.com)

Notice

    Copyright (c) 2002-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Ratified by the Khronos BOP, July 23, 2003.
    Ratified by the Khronos BOP, Aug 5, 2004.

Version

    Last Modifed Date: 27 April 2015
    Author Revision: 1.0

Number

    OpenGL ES Extension #9 (formerly ARB Extension #292)

Dependencies

    None
    The extension is written against the OpenGL 1.3 Specification.

Overview

    This extension provides the capability, for platforms that do
    not have efficient floating-point support, to input data in a
    fixed-point format, i.e.,  a scaled-integer format.  There are
    several ways a platform could try to solve the problem, such as
    using integer only commands, but there are many OpenGL commands
    that have only floating-point or double-precision floating-point
    parameters.  Also, it is likely that any credible application
    running on such a platform will need to perform some computations
    and will already be using some form of fixed-point representation.
    This extension solves the problem by adding new ``fixed', and
    ``clamp fixed''  data types based on a a two's complement
    S15.16 representation.  New versions of commands are created
    with an 'x' suffix that take fixed or clampx parameters.


IP Status

    None

Issues

*   Add double-precision (S31.32) form too?
      NO

*   Additional InterleavedArray formats?
      NO

*   Should newly suffixed commands, e.g., PointSize, get an alias with
    a float or double suffix for consistency?
      NO

*   Are enums converted to fixed by scaling by 2^16.
      NO.  An enums are passed through as if they are already in
      S15.16 form.  Requiring scaling is too error prone.

New Procedures and Functions

    NOTE:  `T' expands to 'const fixed*' or `fixed' as appropriate

    void Vertex{234}x[v]OES(T coords);
    void Normal3x[v]OES(T coords);
    void TexCoord{1234}x[v]OES(T coords);
    void MultiTexCoord{1234}x[v]OES(enum texture, T coords);
    void Color{34}x[v]OES(T components);
    void Indexx[v]OES(T component);
    void RectxOES(fixed x1, fixed y1, fixed x2, fixed y2);
    void RectxvOES(const fixed v1[2], const fixed v2[2]);

    void DepthRangexOES(clampx n, clampx f);
    void LoadMatrixxOES(const fixed m[16]);
    void MultMatrixxOES(const fixed m[16]);
    void LoadTransposeMatrixxOES(const fixed m[16]);
    void MultTransposeMatrixxOES(const fixed m[16]);
    void RotatexOES(fixed angle, fixed x, fixed y, fixed z);
    void ScalexOES(fixed x, fixed y, fixed z);
    void TranslatexOES(fixed x, fixed y, fixed z);
    void FrustumxOES(fixed l, fixed r, fixed b, fixed t, fixed n, fixed f);
    void OrthoxOES(fixed l, fixed r, fixed b, fixed t, fixed n, fixed f);
    void TexGenx[v]OES(enum coord, enum pname, T param);
    void GetTexGenxvOES(enum coord, enum pname, T* params);

    void ClipPlanexOES(enum plane, const fixed* equation);
    void GetClipPlanexOES(enum plane, fixed* equation);

    void RasterPos{234}x[v]OES(T coords);

    void Materialx[v]OES(enum face, enum pname, T param);
    void GetMaterialxOES(enum face, enum pname, T param);
    void Lightx[v]OES(enum light, enum pname, T* params);
    void GetLightxOES(enum light, enum pname, T* params);
    void LightModelx[v]OES(enum pname, T param);

    void PointSizexOES(fixed size);
    void PointParameterxvOES(enum pname, const fixed *params)
    void LineWidthxOES(fixed width);
    void PolygonOffsetxOES(fixed factor, fixed units);

    void PixelStorex{enum pname, T param);
    void PixelTransferxOES(enum pname, T param);
    void PixelMapx{enum map int size T* values);
    void GetPixelMapxv{enum map int size T* values);

    void ConvolutionParameterx[v]OES(enum target, enum pname, T param);
    void GetConvolutionParameterxvOES(enum target, enum pname, T* params);
    void GetHistogramParameterxvOES(enum target, enum pname, T *params);

    void PixelZoomxOES(fixed xfactor, fixed yfactor);

    void BitmapxOES(sizei width, sizei height, fixed xorig, fixed yorig,
                 fixed xmove, fixed ymove, const ubyte* bitmap);

    void TexParameterx[v]OES(enum target, enum pname, T param);
    void GetTexParameterxvOES(enum target, enum pname, T* params);
    void GetTexLevelParameterxvOES(enum target, int level, enum pname, T* params);
    void PrioritizeTexturesxOES(sizei n, uint* textures, clampx* priorities);
    void TexEnvx[v]OES(enum target, enum pname, T param);
    void GetTexEnvxvOES(enum target, enum pname, T* params);

    void Fogx[v]OES(enum pname, T param);

    void SampleCoveragexOES(clampx value, boolean invert);
    void AlphaFuncxOES(enum func, clampx ref);

    void BlendColorxOES(clampx red, clampx green, clampx blue, clampx alpha);

    void ClearColorxOES(clampx red, clampx green, clampx blue, clampx alpha);
    void ClearDepthxOES(clampx depth);
    void ClearAccumxOES(clampx red, clampx green, clampx blue, clampx alpha);
    void AccumxOES(enum op, fixed value);

    void Map1xOES(enum target, T u1, T u2, int stride, int order, T points);
    void Map2xOES(enum target, T u1, T u2, int ustride, int uorder,
                            T v1, T v2, int vstride, int vorder, T points);
    void MapGrid1xOES(int n, T u1, T u2);
    void MapGrid2xOES(int n, T u1, T u2, T v1, T v2);
    void GetMapxvOES(enum target, enum query, T* v);
    void EvalCoord{12}x[v]OES(T coord);

    void FeedbackBufferxOES(sizei n, enum type, fixed* buffer);
    void PassThroughxOES(fixed token);

    GetFixedvOES(enum pname, fixed* params);


New Tokens

    FIXED_OES                0x140C

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

    Section 2.1.1 Floating-Point Computation

      Add the following paragraphs:

      On some platforms, floating-point computations are not sufficiently
      well supported to be used in an OpenGL implementation.  On such
      platforms, fixed-point representations may be a viable substitute for
      floating-point.  Internal computations can use either fixed-point
      or floating-point arithmetic.  Fixed-point computations must be
      accurate to within +/-2^-15.  The maximum representable magnitude
      for a fixed-point number used to represent positional or normal
      coordinates must be at least 2^15; the maximum representable
      magnitude for colors or texture coordinates must be at least 2^10.
      The maximum representable magnitude for all other fixed-point
      values must be at least 2^15.  x*0 = 0*x = 0. 1*x = x*1 = x. x +
      0 = 0 + x = x. 0^0 = 1. Fixed-point computations may lead to
      overflows or underflows.  The results of such computations are
      undefined, but must not lead to GL interruption or termination.


    Section 2.3 GL Command Syntax

      Paragraph 3 is updated to include the 'x' suffix and

      Table 2.1 is modified to include the row:

      ---------------
      | x |  fixed  |
      ---------------

      Table 2.2 is modified to include the rows:

      --------------------------------------------------------------
      | fixed  |  32  | signed 2's complement S15.16 scaled integer|
      --------------------------------------------------------------
      | clampx |  32  | S15.16 scaled integer clamped to [0, 1]    |
      --------------------------------------------------------------

      and the count of the number of rows in the text is changed to 16.

      Add paragraph

      The mapping of GL data types to data types of a specific
      language binding are part of the language binding definition and
      may be platform-dependent.  Type conversion and type promotion
      behavior when mixing actual and formal arguments of different
      data types are specific to the language binding and platform.
      For example, the C language includes automatic conversion
      between integer and floating-point data types, but does not
      include automatic conversion between the int and fixed or
      float and fixed GL types since the fixed data type is not a
      distinct built-in type.  Regardless of language binding,
      the enum type converts to fixed-point without scaling and
      integer types are converted by multiplying by 2^16.



    Section 2.7 Vertex Specification

      Commands are revised to included 'x' suffix.

    Section 2.8 Vertex Arrays

      Table 2.4 Vertex Array Sizes is revised to include the 'fixed' type
      for all commands except EdgeFlagPointer.

      References to Vertex command suffixes are revised to include 'x'.

    Section 2.9 Rectangles

      Revise to include 'x' suffix.

    Section 2.10 Coordinate Transformations

      Revise to include 'x' suffix.  Section 2.10.1 describes clampx.
      Add alternate suffixed versions of Ortho and Frustum.

    Section 2.11 Clipping

      Add alternate suffixed version of ClipPlane.

    Section 2.12 Current Raster Position

      Revise to include 'x' suffix.

    Section 2.13 Colors and Coloring

      Revise to include 'x' suffix and
      Table 2.6 is modified to include row:

      ---------------
      | fixed |  c  |
      ---------------


Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)

    Section 3.3 Points

      Add alternate suffixed PointSize command.

    Section 3.4 Line Segments

      Add alternate suffixed LineWidth command.

    Section 3.5 Polygons

      Add alternate suffixed PolygonOffset command.

    Section 3.6 Pixel Rectangles

      Revise to include 'x' suffix on PixelStore, PixelTransfer, PixelMap,
      ConvolutionParameter.

      Table 3.5 is modified to include row:

      ----------------------
      | FIXED | fixed | No |
      ----------------------

      Add alternate suffixed PixelZoom to Section 3.6.5

    Section 3.7 Bitmaps

      Add alternate suffixed Bitmap command.

    Section 3.8 Texturing

      Revise to include 'x' suffix in TexParameter (Section 3.8.4).

      Add alternate suffixed PrioritizeTextures command (Section 3.8.11).

      Revise to include 'x' suffix in TexEnv (Section 3.8.12).

    Section 3.10 Fog

      Revise to include ;x; suffix in Fog command.


Additions to Chapter 4 of the OpenGL 1.3 Specification (Per-Fragment
Operations and the Frame Buffer)

    Section 4.1 Fragment Operations

      Add alternate suffixed SampleCoveragex (Section 4.1.3), AlphaFunc
      (Section 4.1.4), and BlendColor (Section 4.1.7) commands.

    Section 4.2 Whole Framebuffer Operations

      Add alternate suffixed ClearColor, ClearDepth, and ClearAccum commands
      (Section 4.2.3).

      Add alternate suffixed Accum command (Section 4.2.4).


Additions to Chapter 5 of the OpenGL 1.3 Specification (Special Functions)

    Section 5.1 Evaluators

      Revise to include 'x' suffix on Map1, Map2, Map1Grid, and Map2Grid
      commands.

    Section 5.3 Feedback

      Add alternate suffixed FeedbackBuffer and PassThrough commands.
      Revise Figure 5.2 to indicate 'f' values may also be 'x' values.

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

      Add GetFixedv to Section 6.1.1.  Revise Section 6.1.2 to
      include implied conversions for GetFixedv.

      Revise to include 'x' suffix for GetClipPlane, GetLightm GetMaterial,
      GetTexEnv, GetTexGen, GetTexParameter, GetTexLevelParameter,
      GetPixelMap, and GetMap in Section 6.1.3.

      Revise to include 'x' suffix for GetHistogramParameter (Section 6.1.9).

    Section 6.2 State Tables

      Revise intro paragraph to include GetFixedv.

Additions to Appendix A of the OpenGL 1.3 Specification (Invariance)

    None

Additions to the AGL/GLX/WGL Specifications

    None

Additions to the WGL Specification

    None

Additions to the AGL Specification

    None

Additions to Chapter 2 of the GLX 1.3 Specification (GLX Operation)

    The data representation is client-side only.  The GLX layer
    performs translation between fixed and float representations.

Additions to Chapter 3 of the GLX 1.3 Specification (Functions and Errors)

Additions to Chapter 4 of the GLX 1.3 Specification (Encoding on the X
Byte Stream)

Additions to Chapter 5 of the GLX 1.3 Specification (Extending OpenGL)

Additions to Chapter 6 of the GLX 1.3 Specification (GLX Versions)

GLX Protocol

    Fixed type entry points are mapped on the client-side to the
    appropriate floating-point command protocol.  To preserve precision,
    double-precision protocol is encouraged, but not required.

Errors

    None

New State

    None

New Implementation Dependent State

    None

Revision History

    12/15/2002    0.1
        - Original draft.

    03/31/2003    0.2
        - Corrected a typo in GetClipPlanex and FIXED_OES.

    04/24/2003    0.3
        - Added clarification that enums must be converted to fixed
          by scaling when passed in a fixed parameter type.  Corrected
          some typos.

    05/29/2003    0.4
        - Changed enums to be passed unscaled when passed to a
          fixed formal parameter.

    07/08/2003    0.5
        - Removed bogus Dependencies on section
        - Added extension number and enumerant value

    07/11/2003    0.6
        - Added OES suffixes

    07/12/2003    0.7
        - Added note about GLX protocol

    06/16/2004    0.8
        - Added ClipPlanex, and various Get functions

    04/27/2015    1.0 (Jon Leech)
        - Replace SampleCoverageOES with SampleCoveragexOES, to match the
          specfile / headers (Bug 13591).
