| Name | 
 |  | 
 |     ARB_shading_language_include | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_shading_language_include | 
 |  | 
 | Contact | 
 |  | 
 |     Jon Leech (jon 'at' alumni.caltech.edu) | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2010-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Status | 
 |  | 
 |     Complete. Approved by the ARB at the 2010/01/22 F2F meeting. | 
 |     Approved by the Khronos Board of Promoters on March 10, 2010. | 
 |  | 
 | Version | 
 |  | 
 |     Version 17, June 24, 2013 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #76 | 
 |  | 
 | Dependencies | 
 |  | 
 |     A version of OpenGL supporting OpenGL Shading Language 1.10 or later | 
 |     is required. | 
 |  | 
 |     This extension is written against the OpenGL 3.2 (Core Profile) and | 
 |     OpenGL Shading Language 1.50 Specifications. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension introduces a #include GLSL directive to allow reusing | 
 |     the same shader text in multiple shaders and defines the semantics | 
 |     and syntax of the names allowed in #include directives. It also | 
 |     defines API mechanisms to define the named string backing a | 
 |     #include. | 
 |  | 
 | IP Status | 
 |  | 
 |     No known IP claims. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     void NamedStringARB(enum type, int namelen, const char *name, | 
 |                         int stringlen, const char *string) | 
 |     void DeleteNamedStringARB(int namelen, const char *name) | 
 |  | 
 |     void CompileShaderIncludeARB(uint shader, sizei count, | 
 |                                  const char *const *path, | 
 |                                  const int *length) | 
 |  | 
 |     boolean IsNamedStringARB(int namelen, const char *name) | 
 |     void GetNamedStringARB(int namelen, const char *name, | 
 |                            sizei bufSize, int *stringlen, | 
 |                            char *string) | 
 |     void GetNamedStringivARB(int namelen, const char *name, | 
 |                              enum pname, int *params) | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <type> parameter of NamedStringARB: | 
 |  | 
 |         SHADER_INCLUDE_ARB                              0x8DAE | 
 |  | 
 |     Accepted by the <pname> parameter of GetNamedStringivARB: | 
 |  | 
 |         NAMED_STRING_LENGTH_ARB                         0x8DE9 | 
 |         NAMED_STRING_TYPE_ARB                           0x8DEA | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 3.2 Specification (OpenGL Operation) | 
 |  | 
 |     Add new section 2.11.1 preceding the current section 2.11.1 and | 
 |     renumber following sections: | 
 |  | 
 |    "2.11.1 Named Strings | 
 |  | 
 |     Arbitrary strings may be defined and given names. These strings can | 
 |     be included by name in shaders during compilation, allowing reuse of | 
 |     the same code segments. A string and its name are specified | 
 |     with the command | 
 |  | 
 |         void NamedStringARB(enum type, int namelen, const char *name, | 
 |                             int stringlen, const char *string) | 
 |  | 
 |     <type> must be SHADER_INCLUDE_ARB. <namelen> is the number of | 
 |     <char>s in <name>. <name> defines the name associated with the | 
 |     string. <stringlen> is the number of <char>s in <string>. <string> | 
 |     is an arbitrary string of characters. If <namelen> or <stringlen> | 
 |     are negative, then <name> or <string> respectively are considered to | 
 |     be null-terminated strings. | 
 |  | 
 |     <name> must be a <valid pathname> as defined in Appendix A of the | 
 |     OpenGL Shading Language Specification. Additionally, <name> must | 
 |     begin with the character '/'. Before creating a named string, <name> | 
 |     is converted to a <tree location> as described in Appendix A of | 
 |     the OpenGL Shading Language Specification. | 
 |  | 
 |     After calling NamedStringARB, the contents of <string> are | 
 |     associated with the tree location corresponding to <name>[fn1]. If a | 
 |     string is already associated with that tree location, it will be | 
 |     replaced with the new <string>. | 
 |        [fn1 - Many possible <name>s may correspond to the same tree | 
 |         location.] | 
 |  | 
 |     An INVALID_VALUE error will be generated under any of the following | 
 |     conditions: | 
 |  | 
 |       - Either <name> or <string> is NULL. | 
 |       - <name> is not a valid pathname beginning with '/'. | 
 |  | 
 |     To delete a named string, use the command | 
 |  | 
 |         void DeleteNamedStringARB(int namelen, const char *name) | 
 |  | 
 |     <namelen>, and <name> have the same meanings as the corresponding | 
 |     parameters of NamedStringARB. After calling DeleteNamedStringARB, no | 
 |     string is associated with the tree location corresponding to <name>. | 
 |  | 
 |     An INVALID_VALUE error will be generated under any of the following | 
 |     conditions: | 
 |  | 
 |       - <name> is NULL. | 
 |       - <name> is not a valid pathname beginning with '/'. | 
 |  | 
 |     An INVALID_OPERATION error will be generated if the tree location | 
 |     corresponding to <name> has no string associated with it." | 
 |  | 
 |  | 
 |     Replace the description of CompileShader in new section 2.11.2 | 
 |     (formerly section 2.11.1) with: | 
 |  | 
 |    "Once the source code for a shader has been loaded, a shader object | 
 |     can be compiled with the command | 
 |  | 
 |         void CompileShaderIncludeARB(uint shader, sizei count, | 
 |                                      const char * const *path, | 
 |                                      const int *length) | 
 |  | 
 |     <path> is an ordered array of <count> pointers to optionally | 
 |     null-terminated character strings defining <search paths>. <length> | 
 |     is an array of <count> values with the number of chars in each | 
 |     string (the string length). If an element in <length> is negative, | 
 |     its accompanying string is null-terminated. If <length> is NULL, all | 
 |     strings in the <path> argument are considered null-terminated. | 
 |  | 
 |     Each string in <path> must be a valid <pathname> as defined in | 
 |     Appendix A of the OpenGL Shading Language Specification, and must | 
 |     begin with the character '/'. The ordered list of <path>s is used | 
 |     during compilation, together with the arguments of #include | 
 |     directives in the shader source, to search for named strings | 
 |     corresponding to the #include directives as described in section | 
 |     3.3 of the OpenGL Shading Language Specification. If a #include | 
 |     directive does not correspond to a valid named string, compilation | 
 |     will fail. | 
 |  | 
 |     Each shader object has a boolean status that is modified as a result | 
 |     of compilation, and can be queried by calling GetShaderiv (see | 
 |     section 6.1.10) with <pname> COMPILE_STATUS. The status will be set | 
 |     to TRUE if <shader> was compiled without errors and is ready for | 
 |     use, and FALSE otherwise. Compilation can fail for a variety of | 
 |     reasons as listed in the OpenGL Shading Language Specification. If | 
 |     compilation failed, any information about a previous compile is | 
 |     lost. Thus a failed compile does not restore the old state of | 
 |     shader. | 
 |  | 
 |     Changing the source code of a shader object with ShaderSource, or | 
 |     the contents of any named strings corresponding to #include | 
 |     directives in the source code, does not change its compile status or | 
 |     the compiled shader code. | 
 |  | 
 |     Each shader object has an information log, which is a text string | 
 |     that is overwritten as a result of compilation. This information log | 
 |     can be queried with GetShaderInfoLog to obtain more information | 
 |     about the compilation attempt (see section 6.1.10). | 
 |  | 
 |     An INVALID_OPERATION error is generated if <shader> is not the name | 
 |     of a valid shader object generated by CreateShader. | 
 |  | 
 |     An INVALID_VALUE error will be generated under any of the following | 
 |     conditions: | 
 |       - <count> is greater than zero and <path> is NULL, or any | 
 |         of the pointers path[0] .. path[<count>-1] is NULL. | 
 |       - Any of the strings in <path> are not valid pathnames beginning | 
 |         with '/'. | 
 |  | 
 | *** (compatibility profile only) | 
 |     An INVALID_OPERATION error is generated if CompileShaderIncludeARB | 
 |     is executed between Begin and the corresponding End. | 
 |  | 
 |     The command | 
 |  | 
 |         CompileShader(uint shader) | 
 |  | 
 |     is equivalent to | 
 |  | 
 |         CompileShaderIncludeARB(shader,0,NULL,NULL). | 
 |  | 
 |     Shader objects can be deleted with the command ..." | 
 |  | 
 |  | 
 | Additions to Chapter 5 (Special Functions) | 
 |  | 
 |     Add CompileShaderIncludeARB to the list of "Commands Not Usable In | 
 |     Display Lists" in section 5.4.1 of the compatibility profile. | 
 |  | 
 | Additions to Chapter 6 (State and State Requests) | 
 |  | 
 |     Add new section 6.1.10 preceding the current section 6.1.10 and | 
 |     renumber following sections: | 
 |  | 
 |    "6.1.10 Named String Queries | 
 |  | 
 |     The command | 
 |  | 
 |         boolean IsNamedStringARB(int namelen, const char *name) | 
 |  | 
 |     returns TRUE if the tree location corresponding to <name> has a | 
 |     string associated with it, and FALSE if the tree location has no | 
 |     string associated with it. <name> and <namelen> have the same | 
 |     meanings as the corresponding parameters of NamedStringARB (see | 
 |     section 2.11.1). | 
 |  | 
 |     If <name> or <namelen> do not describe a valid name, or if <name> is | 
 |     NULL, IsNamedStringARB succeeds and returns FALSE. | 
 |  | 
 |     The command | 
 |  | 
 |         void GetNamedStringivARB(int namelen, const char *name, | 
 |                                  enum pname, int *params) | 
 |  | 
 |     returns properties of the named string whose tree location | 
 |     corresponds to <name>. <name> and <namelen> have the same meanings | 
 |     as the corresponding parameters of NamedStringARB (see section | 
 |     2.11.1). The parameter value to return is specified by <pname>. | 
 |  | 
 |     If <pname> is NAMED_STRING_LENGTH_ARB, the length of the named | 
 |     string, including a null terminator, is returned. If <pname> is | 
 |     NAMED_STRING_TYPE_ARB, the <type> argument passed to NamedStringARB | 
 |     is returned. | 
 |  | 
 |     An INVALID_VALUE error will be generated under any of the following | 
 |     conditions: | 
 |  | 
 |       - <name> is NULL. | 
 |       - <name> is not a valid pathname beginning with '/'. | 
 |  | 
 |     An INVALID_OPERATION error will be generated if the tree location | 
 |     corresponding to <name> has no string associated with it. | 
 |  | 
 |     The command | 
 |  | 
 |         void GetNamedStringARB(int namelen, const char *name, | 
 |                                sizei bufSize, int *stringlen, | 
 |                                char *string) | 
 |  | 
 |     returns in <string> the string corresponding to the specified | 
 |     <name>. <name> and <namelen> have the same meanings as the | 
 |     corresponding parameters of NamedStringARB. | 
 |  | 
 |     The returned string will be null-terminated. The actual number of | 
 |     characters written into <string>, excluding the null terminator, is | 
 |     returned in <stringlen>. If <stringlen> is NULL, no length is | 
 |     returned. The maximum number of characters that may be written into | 
 |     <string>, including the null terminator, is specified by <bufSize>. | 
 |  | 
 |     An INVALID_VALUE error will be generated under any of the following | 
 |     conditions: | 
 |  | 
 |       - <name> is NULL. | 
 |       - <name> is not a valid pathname beginning with '/'. | 
 |  | 
 |     An INVALID_OPERATION error will be generated if the tree location | 
 |     corresponding to <name> has no string associated with it." | 
 |  | 
 |  | 
 | Additions to Appendix D of the OpenGL 3.2 Specification (Shared Objects and | 
 | Multiple Contexts) | 
 |  | 
 |     Add "named strings" to the list of shared object types in the second | 
 |     paragraph of Appendix D, prior to "program and shader objects". | 
 |  | 
 |  | 
 |     Replace the second paragraph of section D.1.2 with: | 
 |  | 
 |    "When a named string, shader object, or program object is deleted, it | 
 |     is flagged for deletion, but its name remains valid until the | 
 |     underlying object can be deleted because it is no longer in use. A | 
 |     named string is in use for the duration of any | 
 |     CompileShaderIncludeARB command [fn3]. A shader object is in use | 
 |     while it is attached to any program object. A program object is in | 
 |     use while it is the current program in any context. | 
 |        [fn3 - this effectively places a lock around the named string | 
 |         dictionary during compilation. Given the lack of ordering | 
 |         inherent in multicontext access to the named string database it | 
 |         would probably be equally acceptable to state that the effect of | 
 |         deleting or changing a named string from one context during | 
 |         compilation in another context is undefined.] | 
 |  | 
 |     Named strings are treated as invariant while they are in use during | 
 |     compilation of a shader. That is, named strings will not be added | 
 |     to, changed, or removed from the point of view of | 
 |     CompileShaderIncludeARB, even if such changes are made in other | 
 |     contexts [fn4]. | 
 |        [fn4 - implementations may use locking, caching, or other | 
 |         techniques to realize such invariance. Again this effectively | 
 |         places a lock around the dictionary in order to provide | 
 |         predictable multicontext behavior across all implementations.]" | 
 |  | 
 |     Add to the list of <data> in the first paragraph of section D.3: | 
 |  | 
 |      "- Named strings (only string contents, not string names)." | 
 |  | 
 |     Add a new paragraph to the first bullet point, describing the term | 
 |     <directly attached>, in section D.3.2: | 
 |  | 
 |      "Additionally, a named string object T will be considered to have | 
 |       been <directly attached> to the current context whenever a | 
 |       CompileShaderIncludeARB command is issued, and to have been | 
 |       detached when that CompileShaderIncludeARB completes." | 
 |  | 
 |     (This language may need some iteration. The intent is that whenever | 
 |     CompileShaderIncludeARB is called, the effect is to pick up all | 
 |     changes to the named string dictionary completed in other contexts | 
 |     prior to that compilation by leveraging the existing "directly | 
 |     attached" language of Appendix D instead of introducing a new type | 
 |     of relationship between object and context, even though named | 
 |     strings are not "bound".) | 
 |  | 
 |  | 
 | Additions to Chapter 3 of the OpenGL Shading Language 1.50 Specification | 
 |  | 
 |     Including the following line in a shader will enable #include and | 
 |     related extended language features described in this extension: | 
 |  | 
 |         #extension GL_ARB_shading_language_include : <behavior> | 
 |  | 
 |     where <behavior> is as specified in section 3.3 for the #extension | 
 |     directive. | 
 |  | 
 |  | 
 |     Add a new class of characters following the first paragraph | 
 |     of section 3.1 "Character Set": | 
 |  | 
 |    "The double quote ( " ) for use only with #include and #line." | 
 |  | 
 |     Replace the next-to-last paragraph of section 3.1 with: | 
 |  | 
 |    "There are no character or string data types, with the exception of | 
 |     the quoted string used to name an include string for the | 
 |     preprocessor." | 
 |  | 
 |  | 
 |     Add following the first paragraph of section 3.2: | 
 |  | 
 |    "A shader can also include another string, using #include, as | 
 |     described later. The included string is a single string, not an | 
 |     array of strings, but this string may itself include other strings." | 
 |  | 
 |     Replace the last paragraph of section 3.2 with: | 
 |  | 
 |    "Diagnostic messages returned from compiling a shader must identify | 
 |     both the line number within a string and which source string the | 
 |     message applies to.  For included strings (using #include), the | 
 |     string is identified by the path provided in the shader to the | 
 |     #include statement.  For an array of shader source strings, strings | 
 |     are counted sequentially with the first string being string 0.  Line | 
 |     numbers are one more than the number of new-lines that have been | 
 |     processed.  These are all consistent with use of the __LINE__, | 
 |     __FILE__, and __FILE_SPACE__ macros as described below." | 
 |  | 
 |     Add to the list of preprocessor directives in the second paragraph | 
 |     of section 3.3: | 
 |  | 
 |    "#include" | 
 |  | 
 |     Add following the paragraph in section 3.3 starting "The number | 
 |     sign...": | 
 |  | 
 |    "Functionality for #include is dependent on the GL to supply a tree | 
 |     of strings to search, plus an ordered list of initial search points | 
 |     within that tree. The presence of these is assumed below. | 
 |  | 
 |     The #include directive is followed by a quoted <path>; a string | 
 |     quoted with double quotes or angled brackets ( < > ): | 
 |  | 
 |     #include "path" | 
 |     #include <path> | 
 |  | 
 |     This will lookup <path> in the supplied tree, as described in Appendix | 
 |     A, and select its associated string. The associated string is | 
 |     substituted and processed as is standard for C++ preprocessors, with | 
 |     full preprocessing applied after the substitution. It is a | 
 |     compile-time error if <path> is not valid as described in Appendix | 
 |     A. | 
 |  | 
 |     If <path> starts with a forward slash, whether it is quoted with | 
 |     double quotes or with angled brackets, the list of search points is | 
 |     ignored and <path> is looked up in the tree as described in Appendix | 
 |     A. It is a compile-time error if a path starting with a forward | 
 |     slash either | 
 |  | 
 |       * exists in the tree, but does not have a string associated with | 
 |         it, or | 
 |       * does not exist in the tree. | 
 |  | 
 |     If <path> does not start with a forward slash, it is a path relative | 
 |     to one of the ordered list of initial search points. If this path is | 
 |     quoted with angled brackets, the tree is searched relative to the | 
 |     first search point in the ordered list, and then relative to each | 
 |     subsequent search point, in order, until a matching path is found in | 
 |     the tree. This is also the behavior if it is quoted with double | 
 |     quotes in an initial (non-included) shader string. If it is quoted | 
 |     with double quotes in a previously included string, then the first | 
 |     search point will be the tree location where the previously included | 
 |     string had been found. If not found there, the search continues at | 
 |     the beginning of the list of search points, as just described. It is | 
 |     a compile error if | 
 |  | 
 |       * the first time the path is found in the tree relative to a | 
 |         search point, there is no string assigned to that path | 
 |       * the path is not found relative to any of the search points." | 
 |  | 
 |     Replace the paragraph of section 3.3 starting with '__FILE__ | 
 |     will...' with: | 
 |  | 
 |    "__FILE__ will substitute either a decimal integer constant that says | 
 |     which source string number is currently being processed, or the path | 
 |     of the string if the string was an included string. This path will | 
 |     be the same as the path supplied to the #include directive." | 
 |  | 
 |     Replace the last paragraph of section 3.3 with: | 
 |  | 
 |    "#line must have, after macro substitution, one of the following | 
 |     forms: | 
 |  | 
 |        #line <line> | 
 |        #line <line> <source-string-number> | 
 |        #line <line> "<path>" | 
 |  | 
 |     where <line> and <source-string-number> are constant integer | 
 |     expressions and <path> is a valid string for a path supplied in the | 
 |     #include directive. After processing this directive (including its | 
 |     new-line), the implementation will behave as if it is compiling at | 
 |     line number <line> and source string number <source-string-number> | 
 |     or <path> path. Subsequent source strings will be numbered | 
 |     sequentially, until another #line directive overrides that | 
 |     numbering." | 
 |  | 
 | Additions to Appendix A (Looking up Paths in Trees) of the OpenGL | 
 | Shading Language 1.50 Specification | 
 |  | 
 |     Add a new appendix A: | 
 |  | 
 |    "Appendix A: Looking up Paths in Trees | 
 |  | 
 |     Introduction | 
 |  | 
 |     The GLSL #include mechanism looks up paths in a tree built through | 
 |     the OpenGL API. This appendix describes the syntax and semantic | 
 |     model of the tree and paths into the tree. How the tree is used is | 
 |     up to users of the tree, like the OpenGL API or GLSL. | 
 |  | 
 |     The Tree | 
 |  | 
 |     The tree is a singly rooted hierarchy of tree locations. The root | 
 |     may have one or more child locations, and any location may in turn | 
 |     have its own children. Except for the root, each location has | 
 |     exactly one parent; the root has no parent. | 
 |  | 
 |     Paths into the Tree | 
 |  | 
 |     The locations in the tree are created or looked up by path strings. | 
 |     The path string "/" locates the root of the tree. The path "/foo" | 
 |     locates the child "foo" of the root. Formally, a valid path is a | 
 |     sequence of tokens delimited by the beginning of the string, by the | 
 |     path-separator forward slash ( / ), and by the end of the string. | 
 |     The string "foo/bar" has two tokens; "foo" and "bar". The string | 
 |     "/foo/./bar" has 3 tokens; "foo", ".", and "bar". The string | 
 |     "/foo/.." has two tokens; "foo" and "..". The string "/foo/.bar" has | 
 |     two tokens; "foo" and ".bar". A path is invalid if | 
 |  | 
 |       * <path> contains any characters not listed in Section 3.1 | 
 |         "Character Set", or the double quote character, or angled | 
 |         brackets, or any white space characters other than the space | 
 |         character, | 
 |       * <path> has consecutive forward slashes ( // ); "/foo//bar" is | 
 |         not valid (zero length tokens are not allowed), | 
 |       * <path> ends with a forward slash ( / ), or | 
 |       * <path> contains no characters. | 
 |  | 
 |     There are no path escape characters, so there is no way to get the | 
 |     forward slash delimiter within a single token. | 
 |  | 
 |     When using a path to lookup a tree location, the path tokens are | 
 |     used to walk the tree. The initial location to start the walk is | 
 |     specified by the user of the tree and is updated as follows by the | 
 |     tokens in the path. (Paths starting with "/" will start at the | 
 |     root.) Taken left to right: | 
 |  | 
 |     The token ".." walks to the parent. Or, if already at the root, then | 
 |     the location remains at the root. | 
 |  | 
 |     The token "." leaves the location unchanged. | 
 |  | 
 |     Any other token is considered the name of a child of the current | 
 |     location, and walks to that child. (If there is no child of that | 
 |     name, this may result in a failed lookup or in the child being | 
 |     created, as specified by the user of the tree for the operation | 
 |     being performed.) | 
 |  | 
 |     Associated Strings | 
 |  | 
 |     Each location in the tree can have an additional string associated | 
 |     with it (that a user like the #include mechanism can use as an | 
 |     included string). This is true even for locations that have | 
 |     children: "/foo/bar" can exist in the tree at the same time that | 
 |     "/foo" has an additional string associated with it. Typically, when | 
 |     a path is used to find a location in the tree, it is for the purpose | 
 |     of returning this associated string. | 
 |  | 
 |     Hence, the tree can be built from a collection of (path,string) | 
 |     pairs, where path is a string establishing the existence of a | 
 |     location in the tree and string is the string associated with the | 
 |     node. Details of how to do this are specified by the user of the | 
 |     tree." | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None. | 
 |  | 
 | GLX Protocol | 
 |  | 
 |     To be determined. | 
 |  | 
 | Errors | 
 |  | 
 |     <fill in from spec language above> | 
 |  | 
 | New State | 
 |  | 
 |     Add new state table 6.46 and renumber existing | 
 |     tables starting at 6.47: | 
 |  | 
 |    "Table 6.46: Named String State | 
 |  | 
 |     Get Value               Initial Value Get Command         Type    Description           Sec.   Attribute | 
 |     ---------               ------------- ----------------    ------  --------------------- ------ --------- | 
 |     NAMED_STRING_LENGTH_ARB --            GetNamedStringivARB n x Z+  Named string length   6.1.10 -- | 
 |     NAMED_STRING_TYPE_ARB   --            GetNamedStringivARB n x Z_1 Named string type     6.1.10 -- | 
 |     --                      --            GetNamedStringARB   n x S   Named string contents 6.1.10 --" | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date    Author    Changes | 
 |     ----  --------  --------- ------------------------------------------ | 
 |     17    13/06/24  Jon Leech | 
 |       - Add additional 'const' attribute to CompileShaderIncludeARB | 
 |         <path> (Bug 9006). | 
 |     16    10/02/10  Jon Leech | 
 |       - Remove 'const' attribute from GetNamedStringARB <stringlen>. | 
 |     15    10/01/27  Jon Leech | 
 |       - Update issues. Minor corrections from John Kessenich. | 
 |     14    10/01/26  pbrown | 
 |       - Assigned enumerant values. | 
 |     13    10/01/26  Jon Leech | 
 |       - Restore ARB suffixes. | 
 |     12    10/01/25  Jon Leech | 
 |       - Merge major edits from GLSL 1.60 (now GLSL 3.30). | 
 |     11    10/01/14  Jon Leech | 
 |       - Sync up with minor edits to the GL 3.3 API spec language. Major | 
 |         edits to the GLSL 1.60 spec language are still to be pulled back | 
 |         into the extension. | 
 |     10    09/11/12  Jon Leech | 
 |       - Remove redundant <namelen> == zero errors, since an empty name | 
 |         is not a valid pathname. | 
 |       - Change "match" to "have the same meanings as" when describing | 
 |         parameters common to multiple commands. | 
 |       - Make errors for CompileShaderInclude consistent and more | 
 |         robust against NULL pointers. | 
 |       - Confirm that IsNamedString does not generate errors due to | 
 |         otherwise invalid names. | 
 |       - Added Bruce's comments on sharing to issue 4. | 
 |      9    09/10/30  Jon Leech | 
 |       - Replace "canonical pathname" with "tree location". | 
 |       - Add NAMED_STRING_TYPE query. | 
 |       - Add new state table with named string parameters and contents. | 
 |       - Add issue 20 on why there are no examples. | 
 |      8    09/10/29  Jon Leech | 
 |       - Add GetNamedStringiv query for named string length. | 
 |       - Add requirement to pathname rule 3 that #include strings and | 
 |         string names may not end in '/', but search paths may end in | 
 |         '/'. | 
 |       - Change type of 'namelen' and 'stringlen' parameters from sizei | 
 |         to int to allow specifying null-termianted strings. | 
 |       - Finish removing references to namespaces from GLSL language. | 
 |      7    09/10/28  Jon Leech | 
 |       Many changes from group discussion: | 
 |       - Rename extension to ARB_shading_language_include by | 
 |         symmetry with ARB_shading_language_100. | 
 |       - Remove namespace objects and go back to a single shared named | 
 |         string dictionary. | 
 |       - Remove __FILE_NAMESPACE__ macro from shader language. | 
 |       - Pass multiple path strings to CompileShaderInclude, instead of | 
 |         multiple namespace objects. | 
 |       - Require all string names and paths specified through the API to | 
 |         start with '/'. | 
 |       - Support both #include <name> and #include "name" and try to make | 
 |         usage correspond to expectations of C/C++ programmers. | 
 |       - Allow "." and ".." in pathnames and otherwise refine | 
 |         rules on allowed paths. | 
 |       - Introduce concept of canonical pathnames as the key in | 
 |         the named string dictionary. | 
 |       - Added GetNamedString query for completeness. | 
 |       - Still need to expand bullet list of #include behavior into GLSL | 
 |         spec language. | 
 |       - Updated sharing model. | 
 |      6    09/10/15  Jon Leech | 
 |       - Change type of CompileShaderInclude <length> parameter to sizei. | 
 |       - Add GLSL spec edits from John Kessenich, related issues 16-18, | 
 |         and describe the required #extension line. | 
 |       - Use #include <name> instead of #include "name" (see issue 15). | 
 |       - Fix type of CompileShaderInclude <length> parameter. | 
 |       - Make namespace contents invariant for the duration of | 
 |         CompileShaderInclude (from the point of view of the code being | 
 |         compiled). | 
 |       - Update sharing and object model issues 4 and 8 and corresponding | 
 |         Appendix D and error language in the spec. | 
 |       - Fix typos. | 
 |      5    09/10/14  Jon Leech | 
 |       - Rewritten to add namespaces as proposed by Daniel Koch. | 
 |       - Use the shader and program object model for namespace objects. | 
 |       - Change the appendix D language for how multicontext changes to | 
 |         namespaces and names are handled | 
 |       - Update all the issues. | 
 |      4    09/10/04  Jon Leech Add more issues from email discussion | 
 |      3    09/09/24  Jon Leech Define named strings as shared resources | 
 |      2    09/09/24  Jon Leech Fix name of DeleteNamedString | 
 |      1    09/09/24  Jon Leech Initial revision for the Phoenix F2F mtg | 
 |  | 
 | Issues | 
 |  | 
 |     1) Should names be global, per-program, or per-shader? | 
 |  | 
 |         RESOLVED: names are global across the context share list. This | 
 |         is desirable since the point of #include is to reuse as much | 
 |         content as possible. | 
 |  | 
 |     2) Should named strings be specified in the API with a single | 
 |        string, or with an array of strings like ShaderSource? | 
 |  | 
 |         RESOLVED: a single string. | 
 |  | 
 |     3) Are there any constraints on the contents of string names and | 
 |        strings? | 
 |  | 
 |         RESOLVED: There are constraints on string names when a named | 
 |         string is defined, deleted, or queried. Names must be valid GLSL | 
 |         pathnames and must also begin with '/'. Additionally string | 
 |         names are converted to tree locations prior to defining a | 
 |         string. | 
 |  | 
 |         There are no definition-time constraints on string contents, | 
 |         though of course #include directives must expand to legal source | 
 |         in the shader being compiled, or compilation will fail. | 
 |  | 
 |     4) How full-featured are named string objects? | 
 |  | 
 |         PROPOSED: named strings are full-fledged objects, although they | 
 |         are objects whose names are "tree locations" corresponding to | 
 |         strings specified in the API, instead of GLuint handles. | 
 |  | 
 |         Named strings are intended to be very simple objects which will | 
 |         be infrequently created, updated, or deleted, so naming them by | 
 |         passing string names should be fast enough for this use. There | 
 |         is an IsNamedString query, but there is no way to iterate over | 
 |         all the strings (just as there is no way to iterate over all the | 
 |         names of any other class of object in OpenGL). | 
 |  | 
 |         UNRESOLVED: we still need to make sure the proposed sharing | 
 |         rules will make sense and address all the special cases. | 
 |         Bruce offered the following comments on spec language: | 
 |  | 
 |        "When a named string, shader object, or program object is | 
 |         deleted, it is flagged for deletion, but its name remains valid | 
 |         until the underlying object can be deleted because it is no | 
 |         longer in use." | 
 |  | 
 |         Bruce: I think there are potentially some problems with this. | 
 |         Consider an app routine that does something like this: | 
 |  | 
 |         1. Walks some directory tree on the FS | 
 |         2. Suck in all the contents, make named strings out of them. | 
 |         3. CompileShaderIncludes | 
 |         4. Deletes the named strings it created. | 
 |  | 
 |         Now suppose this routine is used twice, and at the same time | 
 |         another thread/context calls CompileShaderIncludes (even | 
 |         implicitly via CompilerShader, with no #includes in the source) | 
 |         - according to the language below, this still causes the entire | 
 |         database to become attached. If this other CompileShaderIncludes | 
 |         starts just before step 4 the first time round, and end just | 
 |         before step 3 the second time around, then all the deletions | 
 |         suddenly kick in right before we were about to call the | 
 |         compiler. So even though these compilations used completely | 
 |         disjoint sets of objects, they still managed to cause spooky | 
 |         action at a distance. | 
 |  | 
 |        "[fn4 - implementations may use locking, caching, or other | 
 |         techniques to realize such invariance. Again this effectively | 
 |         places a lock around the dictionary in order to provide | 
 |         predictable multicontext behavior across all implementations.]" | 
 |  | 
 |         Bruce: I don't see how changing names in the middle of | 
 |         compilation is any different from calling ShaderSource in one | 
 |         context at the same time as CompileShader in the other context. | 
 |         Making such guarantees aren't going to make apps that don't | 
 |         synchronise their threads properly magically start working, and | 
 |         they could add a lot of extra complexity to what is supposed to | 
 |         be a very simple system. | 
 |  | 
 |     5) Do we need named string queries? | 
 |  | 
 |         RESOLVED: Since they are objects (albeit simple ones), we | 
 |         support queries. | 
 |  | 
 |     6)  The GLSL language is underspecified | 
 |  | 
 |         UNRESOLVED: John Kessenich has written up a detailed bullet list | 
 |         defining the behavior of #include and how API string names and | 
 |         #include string arguments are converted to "tree locations". The | 
 |         bullet points has not yet been refined into final spec language. | 
 |  | 
 |     7) What is the <type> parameter for? | 
 |  | 
 |         RESOLVED: Future expansion. | 
 |  | 
 |     8) Are named strings shared? | 
 |  | 
 |         RESOLVED: Yes. The update semantics may appear odd because named | 
 |         strings are not explicitly bound to a context; they simply exist | 
 |         in the share list. Appendix D language has been updated to | 
 |         describe treat CompileShaderInclude as a virtual bind point | 
 |         which "directly attaches" all named strings to the context for | 
 |         the duration of any compilation in which they may be used. | 
 |  | 
 |         RESOLVED: CompileShaderInclude is defined to use the state of | 
 |         the named string dictionary at the time it is called. Additions | 
 |         or deletions from other contexts will not affect an ongoing | 
 |         compile. This might be implemented with any combination of | 
 |         techniques such as locks, reference counting against deletion, | 
 |         caching context-local copies, etc. This should produce | 
 |         well-defined behavior without overly constraining implementation | 
 |         choices. | 
 |  | 
 |     9) What is the binding point at which #include strings are | 
 |        associated with shaders? | 
 |  | 
 |         RESOLVED: CompileShaderInclude. Since the string associated with | 
 |         a name can change over time, for predictability we must specify | 
 |         when a shader expands #include directives. CompileShaderInclude | 
 |         is the only logical place to do this. | 
 |  | 
 |         If there are any implementations which defer compilation, they | 
 |         will probably have to do extra work in CompileShaderInclude to | 
 |         cache the named string contents at that time. | 
 |  | 
 |     10) Who is responsible for creating the named string dictionary? | 
 |  | 
 |         RESOLVED: The app. This extension provides mechanism, not | 
 |         policy, and there is no realistic and portable way for a GL | 
 |         implementation to guess what #include directives are supposed to | 
 |         mean. However, it's straightforward to provide utility libraries | 
 |         which read a particular directory tree of files and define them | 
 |         as a corresponding set of named strings in GL. | 
 |  | 
 |         In the future, it would be possible for a layered extension to | 
 |         allow directly searching the client filesystem by passing | 
 |         special searchpaths to CompileShaderInclude. For example, the | 
 |         path "//usr/include/GL", which is not a valid search path in | 
 |         this extension, could be defined to search starting in | 
 |         /usr/include/GL on the client filesystem. There are a number of | 
 |         thorny pitfalls in such usage (for example portability and | 
 |         implementability on separate client/server hardware) and we do | 
 |         not feel a need to support such usage initially. | 
 |  | 
 |     11) Do we need to provide a "#once" or "#pragma once" directive to | 
 |         protect against re-inclusion of headers, and possible infinite | 
 |         loops of #includes? | 
 |  | 
 |         RESOLVED: No (by straw poll of the Nextgen TSG on 2009/10/19). | 
 |         Instead the | 
 |  | 
 |             #ifndef FOO_H | 
 |             #define FOO_H | 
 |             ... | 
 |             #endif /* FOO_H */ | 
 |  | 
 |         approach can be used. See discussion of this feature in C: | 
 |  | 
 |             http://en.wikipedia.org/wiki/Pragma_once | 
 |  | 
 |     12) What other approaches for named strings exist? | 
 |  | 
 |         Alternatives we experimented with were a new shader type along | 
 |         with a #name or glShaderName() directive, or explicit "include | 
 |         space" objects in which named strings exist, instead of what is | 
 |         effectively a single implicit "include space" object as in this | 
 |         proposal. | 
 |  | 
 |     13) Should we impose syntax and namespace rules on string names? | 
 |  | 
 |         RESOLVED: String names (API) and search paths / #include | 
 |         pathnames (GLSL) are expressed in a syntax supporting many Unix | 
 |         pathnames as well as the "." and ".." directives, and must be in | 
 |         the valid GLSL character set. Exact rules define how #include | 
 |         pathnames are searched for in the named string database. | 
 |  | 
 |         RESOLVED: We do not impose any namespace rules on string names | 
 |         or search paths. | 
 |  | 
 |         PROPOSED: We suggest that string names starting with "/GL/" be | 
 |         reserved to Khronos, but do not enforce this, and also suggest | 
 |         that applications use consistent conventions on pathnames, such | 
 |         as defining named strings under "/<vendorname>/path" and | 
 |         referring to them by that same name in #include directives. | 
 |  | 
 |     14) Is this an extension or a "feature specification"? | 
 |  | 
 |         RESOLVED: An extension. We decided not to put #include into | 
 |         OpenGL 3.3 / 4.0 yet. | 
 |  | 
 |     15) How are nested (and potentially relative) includes handled? | 
 |  | 
 |         RESOLVED: Rules like those of a Unix C preprocessor are used to | 
 |         combine #include arguments with the specified compiler search | 
 |         path. | 
 |  | 
 |     16) Do we really need to override the source string name with #line? | 
 |         This seems of questionable benefit. | 
 |  | 
 |         RESOLVED: Yes. Of utility to automatic code generators like | 
 |         Yacc. | 
 |  | 
 |     17) Should 0 or something like -1 be substituted for __FILE_SPACE__ | 
 |         when used in a non-included sting? | 
 |  | 
 |         PROPOSED: __FILE_NAMESPACE__ is no longer required, since | 
 |         explicit namespace objects have been removed from the extension. | 
 |         Instead __FILE__ is replaced with something corresponding to the | 
 |         "tree location" of the #include file being processed. | 
 |  | 
 |     18) Consistency of API and GLSL string names / pathnames. | 
 |  | 
 |         RESOLVED: The API and GLSL validate string names using the same | 
 |         rules, which are defined in the GLSL specification. | 
 |  | 
 |     19) Why must string names and search paths in the API start with | 
 |         '/'? | 
 |  | 
 |         Because string names and search paths must both be absolute, | 
 |         rather than relative, paths to function as intended. | 
 |  | 
 |     20) Should there be examples of names and how multiple names | 
 |         correspond to the same tree location? | 
 |  | 
 |         UNRESOLVED. |