<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Dynamically-indexed row-major matrix test</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../js/js-test-pre.js"></script>
<script src="../../js/webgl-test-utils.js"></script>
<script src="../../js/glsl-conformance-test.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script id="fshaderIndexRowMajorMatrixArrayInUniformBlock" type="x-shader/x-fragment">#version 300 es
precision mediump float;

out vec4 my_FragColor;

uniform int u_zero;

layout(row_major) uniform a {
    mat4 u_mats[1];
};

void main() {
    float f = u_mats[u_zero + 0][2][1];
    my_FragColor = vec4(1.0 - f, f, 0.0, 1.0);
}
</script>
<script id="fshaderRowMatrixIndexedByRowMatrixInUniformBlock" type="x-shader/x-fragment">#version 300 es
precision mediump float;

uniform Stuff {
  layout(row_major) mat4 u_mat[3];
  layout(row_major) mat4 u_ndx[3];
} stuff;


out vec4 my_FragColor;

void main() {
  vec4 row = stuff.u_mat[int(stuff.u_ndx[1][1][3])][2];
  my_FragColor = row == vec4(9, 10, 11, 12) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
}
</script>
<script type="application/javascript">
"use strict";
description("Indexing row-major matrices within a uniform block should work");

GLSLConformanceTester.runRenderTests([
{
  fShaderId: 'fshaderIndexRowMajorMatrixArrayInUniformBlock',
  fShaderSuccess: true,
  linkSuccess: true,
  passMsg: '',
  uniformBlocks: [{name: "a", value: new Float32Array([
    0, 0, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
  ])}],
},
{
  fShaderId: 'fshaderRowMatrixIndexedByRowMatrixInUniformBlock',
  fShaderSuccess: true,
  linkSuccess: true,
  passMsg: '',
  uniformBlocks: [{name: "Stuff", value: new Float32Array([
    // mat4 u_mat[3]
     1,  2,  3,  4,
     5,  6,  7,  8,
     9, 10, 11, 12,
    13, 14, 15, 16,

         //  +-- we should be pulling out this column
         //  |
         //  V
     1,  5,  9, 13,
     2,  6, 10, 14,
     3,  7, 11, 15,
     4,  8, 12, 16,

     2, 10, 18, 22,
     4, 12, 20, 28,
     6, 14, 22, 30,
     8, 16, 24, 32,

    // mat4 u_ndx[3]
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,

    0, 0, 0, 0,
    0, 0, 0, 2,
    0, 0, 0, 0,
    0, 1, 0, 0,
    // ^
    // |
    // +-- we should be reading this value as an index into u_mat

    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
    0, 0, 0, 0,
  ])}],
}
], 2);
</script>
</body>
</html>

