Syntax Rules for OpenGL Extensions

Based on a version edited by Kurt Akeley on September 10, 2003.
Updates proposed by Eskil Steenberg, May 2006.
Revised by Benj Lipchak under the direction of the Ecosystem TSG, December 2006.


Reserved terms
--------------

    ** NOTE **
    Whereas some of the other rules in subsequent sections of this document
    are intended to be strictly adhered to, this section is intended as a
    set of guidelines to assist in name decisions.  The guidelines should
    be considered, and then accepted or rejected, on a case by case basis.
    ** NOTE **

    The terms used in OpenGL should have a consistent meaning.  Any time
    new functionality is introduced it is desired to use terms that are 
    previously established in GL.  If no term exists that fits with the
    new functionality, a new term may be used.  Whenever a new term is used,
    the precise meaning of that term should be specified and added to this
    text so that future functionality has the option of reusing the term
    with a consistent meaning.

    A term in GL should encompass more then the meaning of the word found
    in a dictionary.  It should encompass limitations and usages and give the
    reader a broader sense of the usage of the word in the context of OpenGL.

    When choosing new words one should always name it for what it does and
    never name it for its intended usage.  In a general programmable
    environment the naming should not suggest usage.

    It is desired to keep data and the usage of data separated in the name
    space.  "image" data can be used for "texturing."  The two should not be 
    named the same.  This maintains consistency if in some future version 
    something other than an image can be used for texturing, or if an image 
    can be used for something other then texturing.  This is why it is 
    strongly encouraged to name any storage class for what it stores, not the 
    usage of the data.

    Whenever a procedure sets the state that is directly associated with
    something that can be found in the language grammar, it is preferred to 
    use terms from the language like "attribute," "uniform" or "texture."


    1: Asking for information
       
    "Get" is used as a prefix whenever the procedure returns state from the GL.


    2: Storage

    "Create" is used for any procedure that creates an object.  No other
    creations should be named "create."

    "Delete" is used for any procedure that marks an object for 
    destruction.  No other destructions should be named "delete."


    4: Object content

    TBD: Names must be chosen.


    5: Types of state setting

    "Pname" is used to define what a subsequent parameter refers to.  Pname
    is always followed by a "param."

    "Param" is only used when a generic parameter or array of parameters is 
    being passed in.
       
    "Count" always refers to the length of an array.

    "Size" always refers to size measured in units or number of bytes.

    "Render" refers to the later parts of the pipeline that apply the 
    resulting data of a computation to a storage container.  (Examples of
    operations that can be refered to as rendering are sampling, depth test, 
    blending, and resolve.)

    "Draw" refers to the earlier part of the pipeline when results are
    being computed.


    6: References

    Any time an object is referenced by the context or another object the
    following words should be used:

    TBD: Names must be chosen.


Accepted terms
--------------

    Notes:

	1.  Abbreviations are required for all usage unless otherwise noted.

	2.  Compound words (e.g. Doublebuffer) must always be used as
	    compounds.  Embedded words are not capitalized in function
	    names, and are not separated by underscores in token names.
	    (e.g. Doublebuffer, not DoubleBuffer.  DOUBLEBUFFER, not
	    DOUBLE_BUFFER.)

    Exceptions:

    	(1) Abbreviation is used in function names, but not in token names.

	(2) Abbreviation is used in token names, but not in function names.

    	(3) Abbreviation is used for GL and GL extensions, but not for
	    WGL abbreviations.

	(4) Abbreviation is used only as the last characters of token names
	    that identify packed data types.
	    (E.g. GL_UNSIGNED_BYTE_2_3_3_REV)

	(5) Abbreviation is used only in interleaved vertex array token names.
	    (e.g. GL_T4F_C4F_N3F_V4F)

	(6) Abbreviation is used only for specific operations, such as
	    logical operations (Logic Op) or stencil operations (Stencil Op).
	    Abbreviation is not used for generic operations (e.g. Invalid
	    Operation).



    Abbrev.	Term or phrase		Specification(s) used in
    -------	--------------		------------------------
		Access			28
    Accum	Accumulation Buffer	GL, 9
		Active			GL, 15
		Add			GL, 6, 17
		Address			2, 26
		Aliased			GL
		Alignment		GL
		All			GL
		Alpha			GL, 5, 9, 12, 17
		Always			GL
		Ambient			GL
    ASCII	American Standard ...	26, 27
		And			GL
		Are			GL
    ALU		Arithmetic Logic Unit   27
		Array			GL, 15, 16, 26, 28
		Attenuation		GL, 14
    Attrib	Attribute		GL, 9, 20, 26, 27, 28
    Auto	Automatic		GL
    Aux		Auxiliary		GL, 9, 20
		Back			GL, 20
		Base			GL
		Begin			GL
    		Bias			GL
		Bind			GL, 20, 26, 27, 28
		Binding			GL, 7, 26, 27, 28
		Bit			GL, 9
		Bitfield		GL
		Bitmap			GL, 9
		Blend			GL, 15
		Blue			GL, 9
    BGR		Blue Green Red		GL
    BGRA	Blue Green Red Alpha	GL
		Boolean			GL
		Border			GL, 13
		Box			GL
		Buffer			GL, 4, 5, 9, 11, 28
		Byte			GL
		Call			GL
		Care			GL
		Choose			9
		Clamp			GL, 13
		Clear			GL
		Client			GL
    Clip	Clipping		GL
    CW		Clockwise		GL
    Coeff	Coefficient		GL
    C (5)	Color			GL, 3, 9, 17, 26, 28
    Index	Color Index		GL, 9, 28
		Combine			GL, 17
		Compare			GL, 23, 24
		Compile			GL
		Component		GL, 22
		Compressed		GL, 12
		Compression		GL, 12
		Constant		GL, 17
		Control			GL
		Convolution		GL
		Context			10
    Coord	Coordinate		GL, 27
		Copy			GL, 9, 28
		Correction		GL
    CCW		Counter Clockwise	GL
		Coverage		GL, 5
		Cube			GL, 7, 20
		Cube Map		7, 20
		Cull			GL
		Current			GL, 10, 15, 16, 26, 27
		Cutoff			GL
		Data			28
		Decal			GL
    Decr	Decrement		GL
		Delete			GL, 4, 26, 27, 28
		Density			GL
		Depth			GL, 9, 16, 22, 26, 27
    Dst		Destination		GL
		Destroy			11
		Diffuse			GL
    Dim		Dimension		GL
		Direction		GL
		Disable			GL, 26
    List	Display List
		Distance		GL, 14
		Dither			GL
    Dont	Do Not			GL
		Domain			GL
		Dot			19
		Dot3			GL, 19
		Double			GL
		Doublebuffer		GL
		Draw			GL, 9, 11, 28
		Dynamic			28
		Edge			GL, 28
		Element			GL, 28
		Emission		GL
		Enable			GL, 26
		Enabled			GL
		End			GL
    Enum	Enumerant		GL
    Env		Environment		GL, 26, 27
		Equal			GL
		Equation		GL
    Equiv	Equivalent		GL
		Error			GL, 10, 26, 27
    Eval	Evaluate		GL
    XOR		Exclusive OR		GL
		Execute			GL
		Exponent		GL
    Exp		Exponential		GL
    Exp2	Exponential Squared	GL
		Extension		GL, 5
		Eye			GL
		Face			GL, 20
		Factor			GL
		Fade			GL, 14
		Fail			GL, 24
		False			GL
		Fan			GL
		Fastest			GL
		Feedback		GL
		Fill			GL
		Filter			GL
		Finish			GL
		First			GL
		Flag			GL
		Flat			GL
		Float			GL
		Flush			GL
		Fog			GL, 28
		Format			GL, 9, 12, 20, 26, 27
		Fragment		GL, 27
		Framebuffer		(documentation only)
		Front			GL, 20
		Frustum			GL
    Func	Function		GL, 23
    Gen		Generate		GL, 26, 27, 28
		Get			GL, 2, 5, 9, 10, 11, 26, 27, 28
		Granularity		GL
    GL		Graphics Library	GL
		Greater			GL
    Gequal	Greater than or equal to GL
		Green			GL, 9
		Grid			GL
		Half			GL
		Height			GL, 11
		Hint			GL, 12
		Histogram		GL
		Identity		GL
		Ignore			GL
		Image			GL, 12, 20, 27
    Incr	Increment		GL
		Index			16
		Indices			GL
		Indirection		27
    Init	Initial			GL
    Init	Initialize		GL
		Instruction		26, 27
    Int (2)	Integer			GL
		Intensity		GL, 12
		Interleaved		GL
		Internal		GL
		Interpolate		GL, 17
		Invalid			GL, 10
		Invert			GL, 5
		Inverted		GL
		Is			GL, 26, 27, 28
		Keep			GL
    LSB		Least significant bit	GL
		Left			GL, 20
		Length			GL, 26, 27
		Less			GL
    Lequal	Less than or equal to	GL
		Level			GL, 20
    LOD		Level of Detail		GL
		Light			GL
    Light Model	Lighting Model
		Line			GL
		Linear			GL
		List			GL
		Limit			26, 27
		Load			GL, 3
		Local			GL, 26, 27
    Logic Op	Logical Operation	GL
		Loop			GL
		Luminance		GL, 12
    Mag		Magnify			GL
		Make			10
		Map			GL, 7, 20, 28
		Mapped			3, 28
		Mask			GL
		Material		GL
		Matrix, Matrices	GL, 16, 26, 27
    Max		Maximum			GL, 7, 11, 14, 15, 16, 26, 27
    		Memory			GL
		Mesh			GL
    Win		Microsoft Windows OS	GL
    Min		Minimum			GL, 14
    Minmax	Minimum Maximum		GL
    Min		Minify			GL, 14
		Minus			GL, 17
		Mirrored		GL, 21
		Mode			GL, 22, 23
		Model			GL
		Modelview		GL, 3, 15
		Modulate		GL, 17
    Mipmap	Multim in parvo map	GL, 20
    Multi	Multiple		GL
    Mult	Multiply		GL, 3
		Multisample		GL, 5
		Name			GL
		Native			26, 27
		Nearest			GL
    NAND	Negated AND		GL
    NOR		Negated OR		GL
		Negative		GL, 7, 20
		Nesting			GL
		Never			GL
		New			GL
		Nicest			GL
		No			GL, 9, 28
    Noop	No Operation		GL
		None			GL
    N (5)	Normal			GL, 7, 28
    		Normalize, Normalized	GL, 26
		Notequal		GL
    Num	(3)	Number Of		GL
		Object			GL
		Of			GL
		Offset			GL
		One			GL, 17
		Only			28
		Operand			GL, 17
    Op (6)	Operation		GL
		Or			GL
		Order			GL
    Ortho	Orthographic		GL
		Out			GL
		Overflow		GL
		Pack			GL
		Palette			9, 16
    Param	Parameter		GL, 14, 26, 27, 28
    Pname	Parameter Name		GL
		Pass			GL
		Pattern			GL
		Perspective		GL
		Phong			GL
		Pixel			GL, 9, 10, 11
    Pbuffer	Pixel Buffer		11, 20
		Plane			GL
		Point			GL, 14, 26
		Pointer			GL, 15, 16, 26, 28
		Polygon			GL
    		Pop			GL
		Position		GL
    Pos (1)	Position		GL, 25, 26, 27
		Positive		GL, 7, 20
		Post			GL
		Previous		GL, 17
		Primary			GL, 17
		Prioritize, Priority	GL
    Proc        Procedure		2
		Program			26, 27
		Projection		GL, 3
		Proxy			GL, 7
		Push			GL
    Quad	Quadrilateral		GL
		Quadratic		GL
		Query			11
		Range			GL
		Raster			GL
		Read			GL, 10, 28
    Rect	Rectangle		GL
		Red			GL, 9
    RGB		Red Green Blue		GL, 12, 17, 19, 20
    RGBA	Red Green Blue Alpha	GL, 9, 12, 19, 20
		Reduce			GL
    Ref		Reference		GL
		Reflection		GL, 7
		Region			GL, 4
		Register		26
		Render			GL
		Renderer		GL
		Repeat			GL, 21
		Replace			GL, 17
		Replicate		GL
		Rescale			GL
		Reset			GL
		Resident		GL
		Return			GL
    Rev	(4)	Reverse			GL
		Right			GL, 20
		Rotate, Rotated		GL
		Row			GL
		Sample			GL, 5
		Saturate		GL
		Scale, Scaled		GL, 17
		Scissor			GL
		Secondary		GL, 28
		Segment			GL
		Select			GL
		Selection		GL
		Separable		GL
		Separate		GL
		Set (noun only!)	GL
		Shade			GL
    Shade Model	Shading Model
		Shift			GL, 9
		Shininess		GL
		Short			GL
		Side			GL, 26
		Signed			GL, 17
		Single			GL
		Sink			GL
		Size			GL, 7, 12, 14, 15, 16, 22, 26, 28
		Skip			GL
		Smooth			GL
    Src		Source			GL, 17
		Specular		GL
		Sphere			GL
		Spot			GL
		Stack			GL, 16, 26, 27
		Start			GL
		State			GL
		Static			28
		Stencil			GL, 9
		Stereo			GL, 9
		Stipple			GL
		Store			GL
		Stream			28
		Stride			GL, 15, 16, 26
		String			GL, 5, 26, 27
		Strip			GL
		Sub			GL, 12
		Subtract		17
		Sub Image		12
		Subpixel		GL
		Sub Table		GL
		Sum			GL, 15, 26
		Swap			GL, 9
		Table			GL
		Target			20
		Temporary		26, 27
		Test			GL
    Tex (1),	Texture			GL, 3, 7, 12, 17, 18, 20, 22, 23,
    T(5)				24, 27, 28
		Threshold		GL, 14
		Through			GL
		To			GL, 9, 11, 13, 20, 23
		Token			GL
		Transfer		GL
		Transform		GL
		Translate, Translated	GL
		Transpose		GL, 3, 26, 27
		Triangle		GL
    		True			GL
		Two			GL, 26
		Type			GL, 9, 10, 15, 16, 26
		Under			26, 27
		Underflow		GL
		Unit			GL, 15, 27
		Unity			15
		Unmap			28
		Unpack			GL
		Unsigned		GL
    Ubyte	Unsigned Byte		GL
    Uint	Unsigned Int		GL
    Ushort	Unsigned Short		GL
		Usage			28
		Valid			GL
		Value			GL, 5, 9, 24
		Vendor			GL
		Version			GL
    V (5)	Vertex			GL, 15, 26, 28
    		Vertices		GL
		Viewer			GL
		Viewport		GL
		Weight			15, 28
		Width			GL, 11
		Window			GL, 25
		Wrap			GL
		Write			28
		Writemask		GL
		Zero			GL
		Zoom			GL



Abbreviations specifically not allowed
--------------------------------------
    Bgn		Begin
    Mat		Matrix
    Pnt		Point
    Poly	Polygon
    Tri		Triangle



Used in WGL specs only (or differently)
---------------------------------------

    Abbrev.	Term or phrase		Specification(s) used in
    -------	--------------		------------------------
		Acceleration		9
		Create			4, 11
    DC		???			10
		Declare			11
		Device			10
		Exchange		9
		Full			9
		Generic			9
    GDI		???			9
		Handle			11
    HP		???			11
		Incompatible		10
		Largest			11
		Layer			9
		Lost			11
		Method			9
		Need			9
    Number	Number Of		9
		OpenGL			9
		Overlay			9
		Release			20
		Restore			4
		Save			4
		Share			9
		Support			9
		System			9
		Transparent		9
		Undefined		9
		Underlay		9



Name rules (for all names)
--------------------------

    Always use the specified abbreviations.  Never abbreviate terms 
    that are already in the OpenGL API and are not abbreviated.  If you 
    add terms to your extensions, abbreviate consistently, maintaining 
    a local version of additions to the list of abbreviations.

        Use Depth, never Z.

    The word "object" should not be used in a function name unless it 
    operates on all object types.

    Longer descriptive names are desired if they are believed to help
    developers identify the purpose of a name.  

    The opposite of "create" is "destroy."  "delete" marks an object for
    later destruction.

    All names should describe what functionality does, never its expected
    usage.

    Begin each word with a capital letter, except the second word of
    compound words.
   

Procedure name rules
--------------------

    Never use set, as in SetFeedbackBuffer.  Set is implicit, unless
    otherwise specified.

    Use Verb-noun (DeleteList) and adjective-noun (EdgeFlag) formats.

    Append a corporate-specific suffix to all procedures.  For example:
    glNewCommandSGI.  All upper case is preferred for this suffix, but 
    is not required.  The suffix is always last, following OpenGL type 
    and count suffixes.  (e.g. glNewVertex3iSGI, not glNewVertexSGI3i.)


Definition name rules
---------------------

    Use all capital letters.

    Separate words with underscores, except words within compound words.

    Append simple numeric suffixes directly to the end of definition
    tokens (LIGHT0).  Begin these sequences with 0.

    Use an underscore to separate complex suffixes from the token body 
    (MAP_3V).

    Append a corporate-specific suffix to the token, after any other
    suffixes.  For example: GL_NEW_TOKEN0_SGI.  All upper case is 
    required.

    All tokens that are used only for a single use should be grouped
    together using enum types.


Parameter name rules
--------------------

    <target> is reserved for the notion of "which is affected", and for
    the corresponding "which is returned" get commands.

    <params> is reserved for an array of parameters whose contents are
    defined by a second enumerated argument, called <pname>.

    Begin number sequences with 1, not 0.  (e.g. u1,u2, not u0,u1)

    Any parameters that contain more then one word should have the
    second and subsequent words capitalized.

    Long descriptive parameters are encouraged.


Parameter order
---------------

    <X> precedes <Y> precedes <Z> precedes <W>.

    <R> precedes <G> precedes <B> precedes <A>.

    <S> precedes <T> precedes <R> precedes <Q>.

    <U> precedes <V>.

    The array being passed is always the last argument.

    If a passed array has a type, the type specification argument immediately 
    precedes the array.

    <pname> always precedes <params>.

    <x> and <y> precede <width> and <height>.

    <format> precedes <type>.

    <target> is first.

    <face> is first.

    <object> is first.

    <count> always precedes the thing that it counts.

    Any time the function parameters contain an address of what they
    operate on, the address is last.

    Arrays are never terminated by NULL or any other termination but are 
    always specified by length.

    For variable length arrays passed into the GL, the parameter list should 
    end with: "sizei count, const void* data"  

    For variable length arrays passed back from the GL, the parameter list 
    should end with: "sizei maxCount, sizei* count, void* data"


Parameter types
---------------

    All integer quantity parameters (widths, heights, array lengths, etc.)
    should be typed GLsizei, not GLint or GLuint.  Note that GLsizei
    generates an error only for negative values, so all integer quantity
    parameters should accept the value zero.

    Handles to specific object types are typed as pointers to the corresponding 
    abstract structs.  Generic objects are passed around as void pointers.

    Generic masks that do not have explicitly defined bit values (e.g.
    color index write masks and stencil write masks) should be typed
    GLuint.  GLuint is also used for unsigned integer components, such as
    color components and depth components.

    Masks that do have explicitly defined bit values (e.g. attribute mask, 
    clear mask) should be typed GLbitfield, not GLuint.

    All floating point parameters that are clamped to the range [0,1] when 
    received should be typed GLclampf or GLclampd, not GLfloat or GLdouble.


Extension name rules
--------------------

    An extension name is prefixed with the same string that suffixes its 
    procedures and definitions.  The prefix and the individual words are 
    separated with underscores, the prefix is all upper case, and the other 
    text is all lower case.  For example, extension ARB_cool_feature, which 
    specifies glCoolProcedureARB() and defines GL_COOL_DEFINITION_ARB.


Suffix codes
------------

    i       signed 32-bit integer
    ui      unsigned 32-bit integer
    s       signed 16-bit integer
    us      unsigned 16-bit integer
    b       signed 8-bit integer
    ub      unsigned 8-bit integer
    l       signed 64-bit integer
    ul      unsigned 64-bit integer
    f       32-bit float
    d       64-bit float
    t       token enum
    v       vector format
    N       normalize values

    #       number of components (e.g. 3)
    #x#     matrix dimensions (e.g. 2x4)


Shared extensions
-----------------

    An OpenGL extension may be deemed a shared extension if either:

        1.  Two or more OpenGL licensees agree in good faith to implement
            and ship the extension, or

        2.  The OpenGL ARB determines that it is in the best interest of
            the licensees that the extension be shared.

    The procedures and definitions that are defined by a shared extension
    are suffixed with EXT, rather than by a company-specific suffix.  
    Likewise, the extension name is prefixed by EXT.  To avoid name 
    conflicts Silicon Graphics will maintain a registry of EXT extensions, 
    including all their procedures and definitions, in a location that is 
    accessible to all licensees.
