15bd8deadSopenharmony_ciName
25bd8deadSopenharmony_ci
35bd8deadSopenharmony_ci    ARB_arrays_of_arrays
45bd8deadSopenharmony_ci
55bd8deadSopenharmony_ciName Strings
65bd8deadSopenharmony_ci
75bd8deadSopenharmony_ci    GL_ARB_arrays_of_arrays
85bd8deadSopenharmony_ci
95bd8deadSopenharmony_ciContact
105bd8deadSopenharmony_ci
115bd8deadSopenharmony_ci    John Kessenich (cepheus 'at' frii.com)
125bd8deadSopenharmony_ci
135bd8deadSopenharmony_ciContributors
145bd8deadSopenharmony_ci
155bd8deadSopenharmony_ci    XXX
165bd8deadSopenharmony_ci
175bd8deadSopenharmony_ciNotice
185bd8deadSopenharmony_ci
195bd8deadSopenharmony_ci    Copyright (c) 2012-2013 The Khronos Group Inc. Copyright terms at
205bd8deadSopenharmony_ci        http://www.khronos.org/registry/speccopyright.html
215bd8deadSopenharmony_ci
225bd8deadSopenharmony_ciSpecification Update Policy
235bd8deadSopenharmony_ci
245bd8deadSopenharmony_ci    Khronos-approved extension specifications are updated in response to
255bd8deadSopenharmony_ci    issues and bugs prioritized by the Khronos OpenGL Working Group. For
265bd8deadSopenharmony_ci    extensions which have been promoted to a core Specification, fixes will
275bd8deadSopenharmony_ci    first appear in the latest version of that core Specification, and will
285bd8deadSopenharmony_ci    eventually be backported to the extension document. This policy is
295bd8deadSopenharmony_ci    described in more detail at
305bd8deadSopenharmony_ci        https://www.khronos.org/registry/OpenGL/docs/update_policy.php
315bd8deadSopenharmony_ci
325bd8deadSopenharmony_ciStatus
335bd8deadSopenharmony_ci
345bd8deadSopenharmony_ci    Complete.
355bd8deadSopenharmony_ci    Approved by the ARB on 2012/06/12.
365bd8deadSopenharmony_ci
375bd8deadSopenharmony_ciVersion
385bd8deadSopenharmony_ci
395bd8deadSopenharmony_ci    Last Modified Date: 2012/07/01
405bd8deadSopenharmony_ci    Revision: 7
415bd8deadSopenharmony_ci
425bd8deadSopenharmony_ciNumber
435bd8deadSopenharmony_ci
445bd8deadSopenharmony_ci    ARB Extension #120
455bd8deadSopenharmony_ci
465bd8deadSopenharmony_ciDependencies
475bd8deadSopenharmony_ci
485bd8deadSopenharmony_ci    GLSL 1.2 is required.
495bd8deadSopenharmony_ci
505bd8deadSopenharmony_ci    OpenGL ?? (Core Profile) specification is required.  (See issues.)
515bd8deadSopenharmony_ci
525bd8deadSopenharmony_ciOverview
535bd8deadSopenharmony_ci
545bd8deadSopenharmony_ci    Multi-dimensional arrays are a frequently requested feature.  This extension
555bd8deadSopenharmony_ci    removes the restriciton that arrays cannot be formed into arrays, allowing
565bd8deadSopenharmony_ci    arrays of arrays to be declared.  Technically, removing this restriction is 
575bd8deadSopenharmony_ci    all that is necessary to enable this feature, but it is worthwhile showing
585bd8deadSopenharmony_ci    what the result of doing that looks like.
595bd8deadSopenharmony_ci
605bd8deadSopenharmony_ci    The following will be true of arrays of arrays
615bd8deadSopenharmony_ci
625bd8deadSopenharmony_ci    - They will first class objects.  (They know their size, can be passed by 
635bd8deadSopenharmony_ci      copy-in semantics to functions, etc.)
645bd8deadSopenharmony_ci
655bd8deadSopenharmony_ci    - They will only be one-dimensional arrays of other first class objects.
665bd8deadSopenharmony_ci      (arrays are already first class objects).
675bd8deadSopenharmony_ci
685bd8deadSopenharmony_ci    - The syntax
695bd8deadSopenharmony_ci
705bd8deadSopenharmony_ci        vec4 a[3][2];
715bd8deadSopenharmony_ci
725bd8deadSopenharmony_ci      Declares a one-dimensional array of size 3 of one-dimensional arrays of 
735bd8deadSopenharmony_ci      size 2 of vec4s.  Also, these syntaxes do the same thing:
745bd8deadSopenharmony_ci
755bd8deadSopenharmony_ci        vec4[2] a[3];
765bd8deadSopenharmony_ci        vec4[3][2] a;
775bd8deadSopenharmony_ci
785bd8deadSopenharmony_ci      or, looking at more dimensions, these are all the same
795bd8deadSopenharmony_ci
805bd8deadSopenharmony_ci        int a[1][2][3][4][5][6];
815bd8deadSopenharmony_ci
825bd8deadSopenharmony_ci        int[1][2][3][4][5][6] a;
835bd8deadSopenharmony_ci
845bd8deadSopenharmony_ci        int[4][5][6] a[1][2][3];
855bd8deadSopenharmony_ci
865bd8deadSopenharmony_ci      note this latter is equivalent to C, in meaning the same thing, if done as
875bd8deadSopenharmony_ci
885bd8deadSopenharmony_ci        typedef int int456[4][5][6];
895bd8deadSopenharmony_ci
905bd8deadSopenharmony_ci        int456 a[1][2][3];
915bd8deadSopenharmony_ci
925bd8deadSopenharmony_ci      that is, this GLSL proposal matches C behavior in this way.  The type needed for
935bd8deadSopenharmony_ci      both constructors and nameless parameters is:
945bd8deadSopenharmony_ci
955bd8deadSopenharmony_ci         int[1][2][3][4][5][6]
965bd8deadSopenharmony_ci
975bd8deadSopenharmony_ci    - This type could be declared as a formal parameter in a function prototype as
985bd8deadSopenharmony_ci
995bd8deadSopenharmony_ci        void foo(vec4[3][2]);
1005bd8deadSopenharmony_ci
1015bd8deadSopenharmony_ci    - Accessing is done as
1025bd8deadSopenharmony_ci
1035bd8deadSopenharmony_ci        a[x][y]  // x selects which array of size 2 is desired
1045bd8deadSopenharmony_ci                 // y selects which vec4 is desired
1055bd8deadSopenharmony_ci
1065bd8deadSopenharmony_ci        a[x]     // this results in a one-dimensional array, with all rights and
1075bd8deadSopenharmony_ci                 // priviledges implied
1085bd8deadSopenharmony_ci
1095bd8deadSopenharmony_ci    - The .length() operator works as normal:
1105bd8deadSopenharmony_ci
1115bd8deadSopenharmony_ci        a.length()     // this is 3
1125bd8deadSopenharmony_ci        a[x].length()  // this is 2
1135bd8deadSopenharmony_ci
1145bd8deadSopenharmony_ci    - The constructor for the above is
1155bd8deadSopenharmony_ci
1165bd8deadSopenharmony_ci        vec4[3][2](vec4[2](vec4(0.0), vec4(1.0)),   
1175bd8deadSopenharmony_ci                   vec4[2](vec4(0.0), vec4(1.0)),   
1185bd8deadSopenharmony_ci                   vec4[2](vec4(0.0), vec4(1.0)))
1195bd8deadSopenharmony_ci
1205bd8deadSopenharmony_ci    - Initializers for the above are
1215bd8deadSopenharmony_ci
1225bd8deadSopenharmony_ci        vec4 a[3][2] = vec4[3][2](vec4[2](vec4(0.0), vec4(1.0)),   
1235bd8deadSopenharmony_ci                                  vec4[2](vec4(0.0), vec4(1.0)),   
1245bd8deadSopenharmony_ci                                  vec4[2](vec4(0.0), vec4(1.0)));
1255bd8deadSopenharmony_ci
1265bd8deadSopenharmony_ci        // or
1275bd8deadSopenharmony_ci
1285bd8deadSopenharmony_ci        vec4 a[3][2] = {vec4[2](vec4(0.0), vec4(1.0)),   
1295bd8deadSopenharmony_ci                        vec4[2](vec4(0.0), vec4(1.0)),   
1305bd8deadSopenharmony_ci                        vec4[2](vec4(0.0), vec4(1.0))) };
1315bd8deadSopenharmony_ci
1325bd8deadSopenharmony_ci        // or 
1335bd8deadSopenharmony_ci
1345bd8deadSopenharmony_ci        vec4 a[3][2] = {{ vec4(0.0), vec4(1.0) },   
1355bd8deadSopenharmony_ci                        { vec4(0.0), vec4(1.0) },   
1365bd8deadSopenharmony_ci                        { vec4(0.0), vec4(1.0) }  };  // requires matching nesting of 
1375bd8deadSopenharmony_ci                                                      // {} with object's hierarchy
1385bd8deadSopenharmony_ci
1395bd8deadSopenharmony_ci
1405bd8deadSopenharmony_ci    Note that all the above is naturally already specified in the core 
1415bd8deadSopenharmony_ci    specification.
1425bd8deadSopenharmony_ci
1435bd8deadSopenharmony_ci
1445bd8deadSopenharmony_ciNew Procedures and Functions
1455bd8deadSopenharmony_ci
1465bd8deadSopenharmony_ci
1475bd8deadSopenharmony_ciNew Tokens
1485bd8deadSopenharmony_ci
1495bd8deadSopenharmony_ci
1505bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 4.2 (Core Profile) Specification
1515bd8deadSopenharmony_ci(OpenGL Operation)
1525bd8deadSopenharmony_ci
1535bd8deadSopenharmony_ci
1545bd8deadSopenharmony_ciAdditions to Chapter 3 of the OpenGL 4.2 (Core Profile) Specification
1555bd8deadSopenharmony_ci(Rasterization)
1565bd8deadSopenharmony_ci
1575bd8deadSopenharmony_ci    None.
1585bd8deadSopenharmony_ci
1595bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL 4.2 (Core Profile) Specification
1605bd8deadSopenharmony_ci(Per-Fragment Operations and the Framebuffer)
1615bd8deadSopenharmony_ci
1625bd8deadSopenharmony_ci    None.
1635bd8deadSopenharmony_ci
1645bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL 4.2 (Core Profile) Specification
1655bd8deadSopenharmony_ci(Special Functions)
1665bd8deadSopenharmony_ci
1675bd8deadSopenharmony_ci
1685bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL 4.2 (Core Profile) Specification
1695bd8deadSopenharmony_ci(State and State Requests)
1705bd8deadSopenharmony_ci
1715bd8deadSopenharmony_ci    None.
1725bd8deadSopenharmony_ci
1735bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL Shading Language Specification, Version
1745bd8deadSopenharmony_ci4.20 (Variables and Types)
1755bd8deadSopenharmony_ci
1765bd8deadSopenharmony_ci    Section 4.1.9 Arrays
1775bd8deadSopenharmony_ci
1785bd8deadSopenharmony_ci    Rewrite the sentences "Only one-dimensional arrays may be declared. All 
1795bd8deadSopenharmony_ci    basic types and structures can be formed into arrays." as 
1805bd8deadSopenharmony_ci
1815bd8deadSopenharmony_ci    "Arrays only have a single dimension (a single number within "[ ]", 
1825bd8deadSopenharmony_ci     however, arrays of arrays can be declared.  All types (basic types, 
1835bd8deadSopenharmony_ci     structures, arrays) can be formed into an array."
1845bd8deadSopenharmony_ci
1855bd8deadSopenharmony_ci    "When in transparent memory (like in a uniform block), the layout is that 
1865bd8deadSopenharmony_ci     the 'inner' (right-most in declaration) dimensions iterate faster than the 
1875bd8deadSopenharmony_ci     out dimensions.  That is, for the above, the order in memory would be:
1885bd8deadSopenharmony_ci
1895bd8deadSopenharmony_ci         low address...a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]...high address"
1905bd8deadSopenharmony_ci
1915bd8deadSopenharmony_ci    Expand the examples in this section by incorporating the declaration and
1925bd8deadSopenharmony_ci    use content from the overview section above.
1935bd8deadSopenharmony_ci
1945bd8deadSopenharmony_ci    Add
1955bd8deadSopenharmony_ci
1965bd8deadSopenharmony_ci        vec4 a[3][2];
1975bd8deadSopenharmony_ci        a.length()     // this is 3
1985bd8deadSopenharmony_ci        a[x].length()  // this is 2
1995bd8deadSopenharmony_ci
2005bd8deadSopenharmony_ci    When the *length* method will return a compile-time constant, the expression 
2015bd8deadSopenharmony_ci    in brackets (x above) will be evaluated and subject to the rules required
2025bd8deadSopenharmony_ci    for array indexes, but the array will not be deferenced.  Thus, behavior
2035bd8deadSopenharmony_ci    is well defined even if the run-time value of the expression is out of bounds.
2045bd8deadSopenharmony_ci
2055bd8deadSopenharmony_ci    Remove the illegal examples of arrays of arrays.
2065bd8deadSopenharmony_ci
2075bd8deadSopenharmony_ci    Add the following:
2085bd8deadSopenharmony_ci
2095bd8deadSopenharmony_ci    "For unsized arrays, only the outermost dimension can be lacking a
2105bd8deadSopenharmony_ci    size. A type that includes an unknown array size cannot be formed into
2115bd8deadSopenharmony_ci    an array until it gets an explicit size."
2125bd8deadSopenharmony_ci
2135bd8deadSopenharmony_ci    Section 4.1.11 Initializers
2145bd8deadSopenharmony_ci
2155bd8deadSopenharmony_ci    Expand the examples in this section by incorporating the initializer
2165bd8deadSopenharmony_ci    content from the overview section above.
2175bd8deadSopenharmony_ci
2185bd8deadSopenharmony_ci    Section 4.3.4 Input Variables
2195bd8deadSopenharmony_ci
2205bd8deadSopenharmony_ci    For this paragraph, keep this introductory text the same
2215bd8deadSopenharmony_ci
2225bd8deadSopenharmony_ci    "Some inputs and outputs are arrayed, meaning that for an interface between 
2235bd8deadSopenharmony_ci    two shader stages either the input or output declaration requires an extra 
2245bd8deadSopenharmony_ci    level of array indexing for the declarations to match.  
2255bd8deadSopenharmony_ci
2265bd8deadSopenharmony_ci    but rewrite the remainder
2275bd8deadSopenharmony_ci
2285bd8deadSopenharmony_ci    "For example, with 
2295bd8deadSopenharmony_ci    the interface between a vertex shader and a geometry shader, vertex shader 
2305bd8deadSopenharmony_ci    output variables and geometry shader input variables of the same name must 
2315bd8deadSopenharmony_ci    match in type and qualification, except that the vertex shader name cannot 
2325bd8deadSopenharmony_ci    be declared as an array while the geometry shader name must be declared 
2335bd8deadSopenharmony_ci    as an array, to allow for vertex indexing.  
2345bd8deadSopenharmony_ci    It is a link error if a 
2355bd8deadSopenharmony_ci    non-arrayed input is not declared with the same type, qualification, and 
2365bd8deadSopenharmony_ci    array dimensionality as the matching output.  It is an error if an arrayed 
2375bd8deadSopenharmony_ci    input is not declared as an array of the same type and qualification as the 
2385bd8deadSopenharmony_ci    corresponding (non-array) output. Symmetrically, it is an error if an 
2395bd8deadSopenharmony_ci    arrayed output is not  declared as an array of the same type and 
2405bd8deadSopenharmony_ci    qualification as the corresponding (non-array) input."
2415bd8deadSopenharmony_ci
2425bd8deadSopenharmony_ci    instead as 
2435bd8deadSopenharmony_ci
2445bd8deadSopenharmony_ci    "For example, with 
2455bd8deadSopenharmony_ci    the interface between a vertex shader and a geometry shader, vertex shader 
2465bd8deadSopenharmony_ci    output variables and geometry shader input variables of the same name must 
2475bd8deadSopenharmony_ci    match in type and storage qualification, except that the geometry shader will have 
2485bd8deadSopenharmony_ci    one more array dimension than the vertex shader, to allow for vertex 
2495bd8deadSopenharmony_ci    indexing.
2505bd8deadSopenharmony_ci    If such an arrayed interface variable is not declared with the necessary 
2515bd8deadSopenharmony_ci    additional input or output array dimension, a link-time error will result."
2525bd8deadSopenharmony_ci
2535bd8deadSopenharmony_ci    "For non-arrayed interfaces (meaning array dimensionally stays the same between 
2545bd8deadSopenharmony_ci    stages), it is a link-time error if the input variable is not declared with the 
2555bd8deadSopenharmony_ci    same type, including array dimensionality, as the matching output variable."
2565bd8deadSopenharmony_ci
2575bd8deadSopenharmony_ci    Remove the following paragraph
2585bd8deadSopenharmony_ci
2595bd8deadSopenharmony_ci    "If the output corresponding to an arrayed input is itself an array, it 
2605bd8deadSopenharmony_ci    must appear in an output block (see interface blocks below) in the 
2615bd8deadSopenharmony_ci    outputting shader and in an input block in the inputting shader with a block
2625bd8deadSopenharmony_ci    instance name declared as an array.  This is required because two-dimensional 
2635bd8deadSopenharmony_ci    arrays are not supported."
2645bd8deadSopenharmony_ci
2655bd8deadSopenharmony_ci    Section 4.3.6 Output Variables
2665bd8deadSopenharmony_ci
2675bd8deadSopenharmony_ci    Remove the following paragraph
2685bd8deadSopenharmony_ci
2695bd8deadSopenharmony_ci    "As described under the section 4.3.4 'Input Variables' above, if a 
2705bd8deadSopenharmony_ci    per-vertex output of the tessellation control shader is itself an array 
2715bd8deadSopenharmony_ci    with multiple values per vertex, it must appear in an output block (see 
2725bd8deadSopenharmony_ci    interface blocks below) in the tessellation control shader with a block 
2735bd8deadSopenharmony_ci    instance name declared as an array."
2745bd8deadSopenharmony_ci
2755bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL Shading Language Specification, Version
2765bd8deadSopenharmony_ci4.20 (Built-in Variables)
2775bd8deadSopenharmony_ci
2785bd8deadSopenharmony_ci    Section 5.4 Array Constructors
2795bd8deadSopenharmony_ci
2805bd8deadSopenharmony_ci    Expand the constructor examples with the constructor examples from the
2815bd8deadSopenharmony_ci    overview section of this specification.
2825bd8deadSopenharmony_ci
2835bd8deadSopenharmony_ci    Section 5.7 Structure and Array Operations
2845bd8deadSopenharmony_ci
2855bd8deadSopenharmony_ci    Expand the examples with the .length() and [] examples from the overview
2865bd8deadSopenharmony_ci    section of this specification.
2875bd8deadSopenharmony_ci
2885bd8deadSopenharmony_ciChanges to the grammar
2895bd8deadSopenharmony_ci
2905bd8deadSopenharmony_ci    There are 7 pairs of rules that allowed either an empty array 
2915bd8deadSopenharmony_ci    declaration or one with a size.  For example:
2925bd8deadSopenharmony_ci
2935bd8deadSopenharmony_ci        init_declarator_list:
2945bd8deadSopenharmony_ci                init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET 
2955bd8deadSopenharmony_ci                init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET 
2965bd8deadSopenharmony_ci
2975bd8deadSopenharmony_ci    plus 1 rule for parameter array declarations:
2985bd8deadSopenharmony_ci        
2995bd8deadSopenharmony_ci        parameter_declarator:
3005bd8deadSopenharmony_ci                type_specifier IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET 
3015bd8deadSopenharmony_ci
3025bd8deadSopenharmony_ci    These 15 total (2*7 + 1) declaration rules are all replaced with 8 uses 
3035bd8deadSopenharmony_ci    of a new rule array_specifier:
3045bd8deadSopenharmony_ci
3055bd8deadSopenharmony_ci        array_specifier:
3065bd8deadSopenharmony_ci                LEFT_BRACKET RIGHT_BRACKET
3075bd8deadSopenharmony_ci                LEFT_BRACKET constant_expression RIGHT_BRACKET
3085bd8deadSopenharmony_ci                array_specifier LEFT_BRACKET RIGHT_BRACKET
3095bd8deadSopenharmony_ci                array_specifier LEFT_BRACKET constant_expression RIGHT_BRACKET
3105bd8deadSopenharmony_ci
3115bd8deadSopenharmony_ci    For example, the pair given in the example above becomes:
3125bd8deadSopenharmony_ci
3135bd8deadSopenharmony_ci        init_declarator_list:
3145bd8deadSopenharmony_ci                init_declarator_list COMMA IDENTIFIER array_specifier
3155bd8deadSopenharmony_ci
3165bd8deadSopenharmony_ci    The LEFT_BRACKET now appears in exactly 5 rules now; the 1 for postfix 
3175bd8deadSopenharmony_ci    expressions (remains unchanged) and the 4 for array_specifier.
3185bd8deadSopenharmony_ci
3195bd8deadSopenharmony_ciNew State
3205bd8deadSopenharmony_ci
3215bd8deadSopenharmony_ci    None.
3225bd8deadSopenharmony_ci
3235bd8deadSopenharmony_ciNew Implementation Dependent State
3245bd8deadSopenharmony_ci
3255bd8deadSopenharmony_ci    None.
3265bd8deadSopenharmony_ci
3275bd8deadSopenharmony_ciIssues
3285bd8deadSopenharmony_ci
3295bd8deadSopenharmony_ci
3305bd8deadSopenharmony_ci1.  Do we want to support the following form as well?
3315bd8deadSopenharmony_ci
3325bd8deadSopenharmony_ci        vec4[3][2] a;
3335bd8deadSopenharmony_ci
3345bd8deadSopenharmony_ci    Probably, to match the constructor and formal parameter declaration.  These
3355bd8deadSopenharmony_ci    require that 
3365bd8deadSopenharmony_ci
3375bd8deadSopenharmony_ci        vec4[3][2]   // a valid type
3385bd8deadSopenharmony_ci
3395bd8deadSopenharmony_ci    is a type in its own right, and the general syntax to declare something is 
3405bd8deadSopenharmony_ci
3415bd8deadSopenharmony_ci        <type> <name>
3425bd8deadSopenharmony_ci
3435bd8deadSopenharmony_ci    GLSL already has required the following since 1.2:
3445bd8deadSopenharmony_ci
3455bd8deadSopenharmony_ci        vec4[3] a;
3465bd8deadSopenharmony_ci
3475bd8deadSopenharmony_ci    RESOLUTION: Yes, allow this syntax.
3485bd8deadSopenharmony_ci    
3495bd8deadSopenharmony_ci2.  What does the enumeration API look like?  Don't want to enumerate down to 
3505bd8deadSopenharmony_ci    10,000 little individual elements, want something more hierarchical instead.
3515bd8deadSopenharmony_ci
3525bd8deadSopenharmony_ci    This will significantly effect this extension if this extension turns into
3535bd8deadSopenharmony_ci    defining a new discovery API.
3545bd8deadSopenharmony_ci
3555bd8deadSopenharmony_ci    Nested issue: What about optimizers eliminating holes in a data structure?
3565bd8deadSopenharmony_ci
3575bd8deadSopenharmony_ci    RESOLUTION: Belongs in another extension.
3585bd8deadSopenharmony_ci
3595bd8deadSopenharmony_ci3.  How are large buffer/memory arrays declared?  E.g.,
3605bd8deadSopenharmony_ci
3615bd8deadSopenharmony_ci        buffer vec4 a[][2];
3625bd8deadSopenharmony_ci
3635bd8deadSopenharmony_ci    RESOLUTION: Belongs in another extension.  Probably will be
3645bd8deadSopenharmony_ci
3655bd8deadSopenharmony_ci        buffer BufferBlock {
3665bd8deadSopenharmony_ci            vec4 a[][2];
3675bd8deadSopenharmony_ci        };
3685bd8deadSopenharmony_ci
3695bd8deadSopenharmony_ci4.  Can large memory arrays be passed by reference to a function?  Want to pick 
3705bd8deadSopenharmony_ci    up pointer-like feature without full introduction of pointers.
3715bd8deadSopenharmony_ci
3725bd8deadSopenharmony_ci    RESOLUTION: Belongs in another extension.
3735bd8deadSopenharmony_ci
3745bd8deadSopenharmony_ci5.  How does this extension interact with ??, which is adding the large 
3755bd8deadSopenharmony_ci    memory/buffer style arrays.
3765bd8deadSopenharmony_ci
3775bd8deadSopenharmony_ci    RESOLUTION: Belongs in another extension.
3785bd8deadSopenharmony_ci
3795bd8deadSopenharmony_ci6.  Can vertex inputs be arrays of arrays?
3805bd8deadSopenharmony_ci
3815bd8deadSopenharmony_ci    RESOLUTION: Yes.  
3825bd8deadSopenharmony_ci
3835bd8deadSopenharmony_ci7.  Can fragment outputs be arrays of arrays?
3845bd8deadSopenharmony_ci
3855bd8deadSopenharmony_ci    RESOLUTION: Yes.
3865bd8deadSopenharmony_ci
3875bd8deadSopenharmony_ci8.  Can vertex outputs be arrays of arrays?  Note that some stage inputs can 
3885bd8deadSopenharmony_ci    now be arrays of arrays, due to adding a new array level to a previous
3895bd8deadSopenharmony_ci    stage's output type.
3905bd8deadSopenharmony_ci
3915bd8deadSopenharmony_ci    RESOLUTION: Yes.
3925bd8deadSopenharmony_ci
3935bd8deadSopenharmony_ci9.  Can uniforms be arrays of arrays?
3945bd8deadSopenharmony_ci
3955bd8deadSopenharmony_ci    RESOLUTION: Yes.
3965bd8deadSopenharmony_ci
3975bd8deadSopenharmony_ci10.  Can interface blocks (e.g. uniform blocks) be arrays of arrays?
3985bd8deadSopenharmony_ci
3995bd8deadSopenharmony_ci    RESOLUTION: Yes.
4005bd8deadSopenharmony_ci
4015bd8deadSopenharmony_ci11.  Can subroutine variables be arrays of arrays?
4025bd8deadSopenharmony_ci
4035bd8deadSopenharmony_ci    Recommended: Yes.
4045bd8deadSopenharmony_ci
4055bd8deadSopenharmony_ci    RESOLUTION:
4065bd8deadSopenharmony_ci
4075bd8deadSopenharmony_ci12.  Do we want to eliminate the syntax?
4085bd8deadSopenharmony_ci
4095bd8deadSopenharmony_ci    vec4[2] a[3];  // same as vec4 a[3][2];
4105bd8deadSopenharmony_ci
4115bd8deadSopenharmony_ci    It might seem the 3 and 2 should be reversed.  However, thinking through how 
4125bd8deadSopenharmony_ci    precedence, the grammar, etc. all work, this is actually very well defined 
4135bd8deadSopenharmony_ci    and correct and consistent with C/C++.
4145bd8deadSopenharmony_ci
4155bd8deadSopenharmony_ci    RESOLUTION: Yes, allow these syntaxes.
4165bd8deadSopenharmony_ci
4175bd8deadSopenharmony_ciRevision History
4185bd8deadSopenharmony_ci
4195bd8deadSopenharmony_ci    Rev.    Date      Author    Changes
4205bd8deadSopenharmony_ci    ----  --------    --------  -----------------------------------------
4215bd8deadSopenharmony_ci     7    1-Jul-2012  JohnK     Added grammar changes.
4225bd8deadSopenharmony_ci     6   10-May-2012  JohnK     Editorial fixes before merging into core spec.
4235bd8deadSopenharmony_ci     5   16-Mar-2012  JohnK     Update with resolutions from language meeting
4245bd8deadSopenharmony_ci                                (Generally, allow arrays of arrays for most I/O, 
4255bd8deadSopenharmony_ci                                 and allow the syntaxes that naturally fall out.)
4265bd8deadSopenharmony_ci     4   24-Feb-2012  JohnK     Minor clarifications within issues.
4275bd8deadSopenharmony_ci     3    3-Feb-2012  JohnK     Fix reversed 2/3, add new example, resolve issues 2-5
4285bd8deadSopenharmony_ci     2    1-Feb-2012  JohnK     Flesh out with specification language
4295bd8deadSopenharmony_ci     1    1-Feb-2012  JohnK     Initial revision
430