OpenGL(R) Shading Language Extension Conventions

Last Modified Date: 2006/12/18
Author Revision: 11

Document Source: the OpenGL Extension Registry at

    http://www.opengl.org/registry/

Contributors:

    Pat Brown, NVIDIA
    John Kessenich, 3Dlabs
    Jon Leech
    Barthold Lichtenbelt, 3Dlabs
    Bill Licea-Kane, ATI
    Kent Lin, Intel
    Jeremy Sandmel, ATI
    Folker Schamel, Spinor

The ARB OpenGL Shading Language working group has defined the following
conventions for writing OpenGL extension specifications that extend the
Shading Language syntax or semantics.

=======================================================================

Section #1:  Conventions to avoid name-space collision

  We expect the Shading Language to continue to evolve through the
  use of vendor, EXT, and ARB extensions, as well as through
  revisions to the core language specification itself. As a result,
  we'd like to establish some name conventions to avoid name-space
  collisions between vendors and between the extensions and the core
  language.

  We have the same kinds of concerns that resulted in the need for
  naming and syntax rules document for the non-shader parts of
  OpenGL:

    http://www.opengl.org/registry/doc/rules.html#spec_naming

  We expect that we will need to affix new names with vendor tags
  where appropriate, and  change and/or remove these tags as
  extensions are promoted, in the same fashion as for core GL
  function and token names.

  The fact that the Shading Language is modeled after C/C++ means
  that we have some additional requirements for what the language
  should "look" like.

  Consequently, vendors must use the following naming conventions
  when creating new OpenGL extensions that affect the syntax of the
  Shading Language.

  General principles:

   - New syntax defined by an extension should be suffixed with a
     vendor specific extension (EXT, ARB, SGI, etc),
     except as noted below where the constraints of
     being "C-like" make it unpalatble.
   - Vendors should make a good faith effort to ensure that new
     shading language extensions do not conflict in syntax or
     semantics with the extensions of other vendors
     or the ARB.

  Rules for adding or modifying specific Shading Language
  constructs defined by extensions follow.

  Note: VEN stands for any vendor tag, e.g. ARB, EXT, SGI, etc.

  Summary:
  --------
  1a) variables:	       gl_<Name>VEN
  1b) keywords:		       __<name>VEN
  1c) data types:
      1c1) keywords:	   __<name>VEN
      1c2) derived types:  gl_<Name>VEN
  1d) operators:	       use new data types as operands or ask ARB
  1e) functions:	       <name>VEN

  Details:
  --------
  1a) Variables
      STATUS:  RESOLVED

      New variables defined by an extension should use:
	    prefix:   "gl_"  (lower case, single underscore)
	    suffix:   "VEN"  (no underscore)

      Form:
	gl_<Name>VEN

	<Name> is subject to these constraints:
	  - Each word in <Name> must start with a capital letter.
	  - Words should be concatenated, not separated with
	    underscores.
	  - Don't use an underscore to separate the
	    final VEN suffix.

      Notes:
	All of the variables defined in the core
	shading language specification already follow this
	convention.

	New variables added by shading language extensions should
	match the naming style of the core specification
	where possible.

      Examples:
	uniform   float  gl_SomeNewBuiltinScalarARB;
	varying   vec4	 gl_YetAnotherVaryingEXT;
	attribute vec4	 gl_OneMoreAttributeATI

  1b) keywords:
      STATUS:  RESOLVED

      New keywords defined by an extension should use:
	prefix:  "__"  (double underscore)
	suffix:  VEN   (no underscore)

      Form:
	__<name>VEN

      Notes:
	New keywords should be prefixed with "__" because this is
	how C/C++ handle keyword extensions.  The core language
	specification reserves the use of "__" anywhere within a
	keyword so that future language revisions from the ARB will
	not conflict with user level names.

	To avoid name collisions between OpenGL implementations from
	different IHV's, extended keywords should also use a vendor
	suffix.

	The working group considered requiring a "gl_" for the
	prefix instead of "__", but felt this diverged too far from
	the conventions of C/C++

      Examples:
	__float4EXT
	__sampler4DSGI
	__elifARB
	__some_new_kind_of_while_loopARB

  1c) New data types:
      STATUS:  RESOLVED

      Naming conventions for new data types defined by an extension
      differ depending on whether the data type is a new fundamental
      type defined as a keyword (case 1c1), or a new derived type
      defined by Shading Language constructs (case 1c2). Currently the
      only derived types are "struct"s.

      1c1) For new data type keywords defined by an extension:

	  prefix:  "__" (double underscore)
	  suffix: VEN

	Form:
	   __<name>VEN

	Examples:
	  __float4SGI
	  __half2NV
	  __triplefloatARB
	  __mat5EXT

      1c2) For new derived types defined by an extension:

	  prefix:  "gl_" (gl and single underscore)
	  suffix: VEN

	Form:
	  gl_<name>VEN

	Examples:
	  gl_skinningParametersEXT
	  gl_newDerivedStateStructARB

	Notes:
	  If new data types are defined as keywords, then they
	  should follow the rules for keywords. If new data types
	  are derived types, then they should follow a different
	  naming convention, like the one for variables.

	  New data types should not be added as keywords unless
	  absolutely necessary.

  1d) New operators:
      STATUS:  RESOLVED

      To avoid name space collisions for new operators
      defined by an extension, or existing operators whose
      behavior is re-defined by an extensions, extensions should
      either:

    1d1) Add a new data type along with the operator and use at
	 least one of these new data types for the operands of the
	 (re)defined operator. The new data type name should follow
	 the rules given in (1c) above for new data types.

    or

    1d2) For IHVs who want to define a new operator to work on
	 existing data types or to redefine an existing operator to
	 work on existing data types, the IHV should come to the ARB
	 and request the new operator to avoid colliding with any
	 upcoming uses for the operator by the ARB.

    Examples:
      An extension which overloads the "+" operator to add an int
      and a "triple" should define a new gl_tripleEXT type, then
      define the behavior of the + operator when one operand is an
      int and the other is a gl_tripleEXT.

      An extension needing to overload the "+" operator to add an
      int and a float must obtain permission from the ARB. If it
      approves, the ARB would revise the shading language grammar
      to define the behavior of the + operator when one operand is
      an int and the other is a float.

      An extension needing to define an entirely new operator for
      exponentiation must obtain permission from the ARB. If it
      approves, the ARB would agree to reserve an appropriate new
      operator, such as "**", and the extension would define the
      behavior of that operator with respect to some data types.

    Notes:
      On the surface, operators by themselves need no additional
      name-space syntax. No one wants "+" redefined as gl_+ARB, for
      instance.

      However, the ARB still wants to avoid name space and semantic
      collisions as extensions are promoted. The ARB reserves the
      use of operators with existing types.

      Therefore we've adopted the two-pronged approach listed above.
      (A) is borrowed from C++ operator overloading conventions.
      (B) is a fall-back position in the event that (A) is
      inconvenient.

  1e) functions:
      STATUS:  RESOLVED

      New functions defined by an extension should use:
	prefix:  none  (note, no "gl_" or "__")
	suffix:  VEN

      Form:
       <name>VEN

      Examples:
	newfunctionEXT()
	SomeOtherFuncARB()
	Yet_Another_FunctionSGI()

      Notes:
	Since none of the standard core Shading Language functions
	start with the "gl_" prefix, new functions do not need this
	prefix either.	There is no need to avoid collisions between
	implementation-defined and user-defined functions, because
	the Shading Language specifically allows user overloading of
	built-in functions.  In other words, name collisions are
	expected and intentional.  Further, when a name collision
	occurs between a user function and an implementation-defined
	function, the user function takes precedence.

	However, we still must avoid name collisions between IHV's
	and to allow for promotion of new functions into EXT, ARB
	and core status.  So, new functions should use a VENDOR
	suffix.


=============================================================

Section #2:  Protocol for accessing extension features in the
       shading language

  2a) Extension #defines?

    STATUS:  RESOLVED

    Every extension which affects shading language semantics or
    syntax must create a Shading Language preprocessor #define that
    matches the GL extension name string.  This #define would be
    available in the shading language if and only if the extension
    were supported on a given Shading Language implementation.

    Further, extensions which do not affect shading language
    semantics or syntax *must not* create this Shading Language
    preprocessor #define.

    The extension-writing template in the OpenGL Extension Registry
    will be updated to include a placeholder for shading language
    extensions showing the corresponding #define.

    Example:
      An extension which adds the extension string
	"GL_ARB_shading_extension_1"
      should also add a Shading Language preprocessor #define called
	GL_ARB_shading_extension_1

      Doing so means that a shader can do something like:

      #ifdef GL_ARB_shading_extension_1
	// do something using the extension
      #else
	// do something else or #error!
      #endif

    Notes:
      If an application wishes to emulate this behavior for any
      other extensions which do not directly affect the shading
      language syntax or behavior, they can simply query the
      extension string for the presence of these extensions and
      create their own #defines to be prepended to their shader
      strings.

    Pseudo-code example:
      char* prefixStr;
      if (glIsExtensionSupported("GL_ARB_texture_mirrored_repeat"))
      {
	ConcatString(prefixStr, "#define GL_ARB_texture_mirrored_repeat 1\n");
      }
      // use prefixStr as the first string given to glShaderSource()

  2b) Should we allow and/or require a shader author to declare
      their intended use of a given extension prior to use?

    STATUS:  RESOLVED - YES

    The ARB has received developer feedback requesting we strive
    towards portability in the shading language. The concern is
    shaders written on one implementation with an extension will not
    run on an implementation without the extension and that without
    an explicit "enable", the shader author may not realize that
    he/she was using any extended features.

    After much discussion, the resolution is as follows:

    For any extension which can affect shaders written without
    knowledge of the extension (i.e. no change in syntax to the
    shading language), the extension must introduce an API which
    explicitly "enables" the extended behavior. New extensions
    should not be allowed to change the behavior of old shaders
    without an explicit request to do so from the application.

    Further, for any extension which affects the syntax or semantics
    of the shading language, the shader author must explicitly make
    a request allow the use of the extension, by inserting this
    request within the shader text itself.

    This request is made using the following syntax:
      #extension <name> : <behavior>
    where
      <name> = the GL extension name string (as defined in section 2a,
	       starting with "GL_").
    and
      <behavior> can be one of the following:
      require, enable, warn, or disable

    Example:
      To use an extension which adds the extension string
      "GL_ARB_shading_extension_1", a shader should include a line like:

      #extension GL_ARB_shading_extension_1: enable

    See section 3.3 of the OpenGL Shading Language specification
    (Language Version 1.20) for details about using this mechanism.

-----------------------------------

Revision history:

 #11 - 12/18/2006 - Jon Leech
    - Clarify that #extension name must be the extension name string
      starting with "GL_", give an example, fix an old URL.

 #10 - 10/09/2006 - Jon Leech
    - Move registry URL to www.opengl.org.

  #9 - 05/12/2004 - js
    - no changes from rev #8, whitespace cleanup only

  #8 - 05/11/2004 - js
    - minor typos fixed
    - cleaned up language about when to use 1c1 or 1c2

  #7 - 05/07/2004 - Jon Leech
    - language cleanups including removing use of "built in"

  #6 - 04/29/04 - js
    - cleaned up psuedo code example in section 2a
    - change language about "decorate"ing names to "affix"

  #5 - 04/29/04 - js
    - added to contributors list

  #4 - 04/29/04 - js
    - cleaned up section 2 to reflect #extension resolution

  #3 - 03/15/04 - js
    - summarized section 1 conventions on name decorations

  #2 - 03/24/04 - js
    - reorganized doc to reflect recent working group discussions

  #1 - 03/19/04 - js
    - initial revision
