2 Copyright (c) 2019 The Khronos Group Inc.
3 Use of this source code is governed by an MIT-style license that can be
4 found in the LICENSE.txt file.
10 <link rel=
"stylesheet" href=
"../../resources/js-test-style.css"/>
11 <script src=
"../../js/js-test-pre.js"></script>
12 <script src=
"../../js/webgl-test-utils.js"></script>
13 <title>WebGL bindAttribLocation with Matrix Attributes Conformance Test
</title>
16 <div id=
"description"></div>
17 <div id=
"console"></div>
18 <canvas id=
"canvas" width=
"8" height=
"8" style=
"width: 8px; height: 8px;"></canvas>
21 description("This test verifies that vectors placed via bindAttribLocation right after matricies will fail if there is insufficient room for the matrix.");
23 var wtu
= WebGLTestUtils
;
24 var canvas
= document
.getElementById("canvas");
25 var gl
= wtu
.create3DContext(canvas
, {antialias
: false});
27 // Make sure we have room for at least a mat4.
28 var maxAttributes
= gl
.getParameter(gl
.MAX_VERTEX_ATTRIBS
);
29 debug('MAX_VERTEX_ATTRIBUTES is ' + maxAttributes
);
30 shouldBeGreaterThanOrEqual('maxAttributes', '4');
32 var glFragmentShader
= wtu
.loadShader(gl
, wtu
.simpleColorFragmentShader
, gl
.FRAGMENT_SHADER
);
34 // Given a matrix dimension, load a vertex shader with a matrix of that dimension
35 // and a vector. Ensure that both the vector and matrix are active attributes.
36 // Return the compiled vertex shader.
37 function loadVertexShader(numMatrixDimensions
) {
39 'attribute mat' + numMatrixDimensions
+ ' matrix;\n' +
40 'attribute vec' + numMatrixDimensions
+ ' vector;\n' +
41 'void main(void) { gl_Position = vec4(vector*matrix';
42 // Ensure the vec4 has the correct number of dimensions in order to be assignable
44 for (var ii
= numMatrixDimensions
; ii
< 4; ++ii
) {
45 strVertexShader
+= ",0.0";
47 strVertexShader
+= ");}\n";
48 return wtu
.loadShader(gl
, strVertexShader
, gl
.VERTEX_SHADER
);
51 // Given a vertex shader, matrix location and vector location, create and link
52 // a program with glFragmentShader and a vertex shader returned by loadVertexShader
53 // attached. Bind the matrix to matrixLocation and the vector to vectorLocation.
54 // Return whether the link was successful.
55 function createAndLinkProgram(glVertexShader
, matrixLocation
, vectorLocation
) {
56 var glProgram
= gl
.createProgram();
57 gl
.bindAttribLocation(glProgram
, matrixLocation
, 'matrix');
58 gl
.bindAttribLocation(glProgram
, vectorLocation
, 'vector');
59 gl
.attachShader(glProgram
, glVertexShader
);
60 gl
.attachShader(glProgram
, glFragmentShader
);
61 gl
.linkProgram(glProgram
);
62 return gl
.getProgramParameter(glProgram
, gl
.LINK_STATUS
);
65 // For each matrix dimension (mat2, mat3 and mat4)
66 for (var mm
= 2; mm
<= 4; ++mm
) {
67 debug('Testing ' + mm
+ ' dimensional matrices');
68 var glVertexShader
= loadVertexShader(mm
);
69 // Per the WebGL spec: "LinkProgram will fail if the attribute bindings assigned
70 // by bindAttribLocation do not leave enough space to assign a location for an
71 // active matrix attribute which requires multiple contiguous generic attributes."
72 // We will test this by placing the vector after the matrix attribute such that there
73 // is not enough room for the matrix. Vertify the link operation fails.
75 // Run the test for each available attribute slot. Go to maxAttributes-mm to leave enough room
76 // for the matrix itself. Leave another slot open for the vector following the matrix.
77 for (var pp
= 0; pp
<= maxAttributes
- mm
- 1; ++pp
) {
78 // For each matrix dimension, bind the vector right after the matrix such that we leave
79 // insufficient room for the matrix. Verify doing this will fail the link operation.
80 for (var ll
= 0; ll
< mm
; ++ll
) {
81 var vectorLocation
= pp
+ ll
;
82 assertMsg(!createAndLinkProgram(glVertexShader
, /*matrixLocation*/pp
, vectorLocation
),
83 "Matrix with location " + pp
+ " and vector with location " + vectorLocation
+ " should not link.");
85 // Ensure that once we have left enough room for the matrix, the program links successfully.
86 var vectorLocation
= pp
+ ll
;
87 assertMsg(createAndLinkProgram(glVertexShader
, /*matrixLocation*/pp
, vectorLocation
),
88 "Matrix with location " + pp
+ " and vector with location " + vectorLocation
+ " should link.");
94 var successfullyParsed
= true;
96 <script src=
"../../js/js-test-post.js"></script>