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