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.
