tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

shader-with-array-of-structs-uniform.html (4597B)


      1 <!--
      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.
      5 -->
      6 
      7 <!DOCTYPE html>
      8 <html>
      9 <head>
     10 <meta charset="utf-8">
     11 <title>GLSL Array of Structs Uniform</title>
     12 <link rel="stylesheet" href="../../../resources/js-test-style.css"/>
     13 <link rel="stylesheet" href="../../../resources/glsl-feature-tests.css"/>
     14 <script src="../../../js/js-test-pre.js"></script>
     15 <script src="../../../js/webgl-test-utils.js"> </script>
     16 
     17 <script id="vshader" type="x-shader/x-vertex">
     18 attribute vec4 a_position;
     19 void main(void) {
     20    gl_Position = a_position;
     21 }
     22 </script>
     23 <script id="fshader0" type="x-shader/x-fragment">
     24 precision mediump float;
     25 struct my_struct {
     26  vec4 color;
     27 };
     28 uniform my_struct u_colors[2];
     29 void main(void) {
     30    gl_FragColor = u_colors[0].color;
     31 }
     32 </script>
     33 <script id="fshader1" type="x-shader/x-fragment">
     34 precision mediump float;
     35 struct my_struct {
     36  vec4 color;
     37 };
     38 uniform my_struct u_colors[2];
     39 void main(void) {
     40    gl_FragColor = u_colors[1].color;
     41 }
     42 </script>
     43 <script id="fshader2" type="x-shader/x-fragment">
     44 precision mediump float;
     45 struct my_struct {
     46  vec4 color1;
     47  vec4 color2;
     48 };
     49 uniform my_struct u_colors[2];
     50 void main(void) {
     51    gl_FragColor = u_colors[0].color1 + u_colors[0].color2 + u_colors[1].color1 +u_colors[1].color2;
     52 }
     53 </script>
     54 <script id="fshader3" type="x-shader/x-fragment">
     55 precision mediump float;
     56 struct my_struct {
     57  float r;
     58  float g;
     59  float b;
     60  float a;
     61 };
     62 uniform my_struct u_colors[2];
     63 void main(void) {
     64    gl_FragColor = vec4(u_colors[0].r, u_colors[0].g, u_colors[1].b, u_colors[1].a);
     65 }
     66 </script>
     67 </head>
     68 <body>
     69 <canvas id="canvas" width="50" height="50"></canvas>
     70 <div id="description"></div>
     71 <div id="console"></div>
     72 <script>
     73 "use strict";
     74 description();
     75 
     76 var wtu = WebGLTestUtils;
     77 var gl = wtu.create3DContext("canvas");
     78 wtu.setupUnitQuad(gl);
     79 
     80 for (var ii = 0; ii < 2; ++ii) {
     81  var program = wtu.setupProgram(gl, ["vshader", "fshader" + ii], ["a_position"]);
     82  var red_loc = gl.getUniformLocation(program, "u_colors[" + ii + "].color");
     83  var green_loc = gl.getUniformLocation(program, "u_colors[" + (1 - ii) + "].color");
     84  gl.uniform4fv(red_loc, [1, 0, 0, 1]);
     85  gl.uniform4fv(green_loc, [0, 1, 0, 1]);
     86  wtu.clearAndDrawUnitQuad(gl);
     87  wtu.checkCanvas(gl, [255, 0, 0, 255], "Should be red");
     88 }
     89 
     90 var program = wtu.setupProgram(gl, ["vshader", "fshader2"], ["a_position"]);
     91 var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
     92 shouldBe("numUniforms", "4");
     93 var uniforms = []
     94 for (var ii = 0; ii < numUniforms; ++ii) {
     95  uniforms.push(gl.getActiveUniform(program, ii).name);
     96 }
     97 uniforms.sort();
     98 shouldBe("uniforms[0]", '"u_colors[0].color1"');
     99 shouldBe("uniforms[1]", '"u_colors[0].color2"');
    100 shouldBe("uniforms[2]", '"u_colors[1].color1"');
    101 shouldBe("uniforms[3]", '"u_colors[1].color2"');
    102 var loc00 = gl.getUniformLocation(program, "u_colors[0].color1");
    103 var loc01 = gl.getUniformLocation(program, "u_colors[0].color2");
    104 var loc10 = gl.getUniformLocation(program, "u_colors[1].color1");
    105 var loc11 = gl.getUniformLocation(program, "u_colors[1].color2");
    106 shouldBeTrue("loc00 != undefined");
    107 shouldBeTrue("loc01 != undefined");
    108 shouldBeTrue("loc10 != undefined");
    109 shouldBeTrue("loc11 != undefined");
    110 gl.uniform4fv(loc00, [1, 0, 0, 0]);
    111 gl.uniform4fv(loc01, [0, 1, 0, 0]);
    112 gl.uniform4fv(loc10, [0, 0, 1, 0]);
    113 gl.uniform4fv(loc11, [0, 0, 0, 1]);
    114 wtu.clearAndDrawUnitQuad(gl, [0, 0, 0, 0]);
    115 wtu.checkCanvas(gl, [255, 255, 255, 255], "Should be white");
    116 
    117 program = wtu.setupProgram(gl, ["vshader", "fshader3"], ["a_position"]);
    118 var loc0r = gl.getUniformLocation(program, "u_colors[0].r");
    119 var loc0g = gl.getUniformLocation(program, "u_colors[0].g");
    120 var loc0b = gl.getUniformLocation(program, "u_colors[0].b");
    121 var loc0a = gl.getUniformLocation(program, "u_colors[0].a");
    122 var loc1r = gl.getUniformLocation(program, "u_colors[1].r");
    123 var loc1g = gl.getUniformLocation(program, "u_colors[1].g");
    124 var loc1b = gl.getUniformLocation(program, "u_colors[1].b");
    125 var loc1a = gl.getUniformLocation(program, "u_colors[1].a");
    126 shouldBeTrue("loc0r != undefined");
    127 shouldBeTrue("loc0g != undefined");
    128 shouldBeTrue("loc1b != undefined");
    129 shouldBeTrue("loc1a != undefined");
    130 gl.uniform1f(loc0r, 1);
    131 gl.uniform1f(loc0g, 1);
    132 gl.uniform1f(loc1b, 1);
    133 gl.uniform1f(loc1a, 1);
    134 wtu.clearAndDrawUnitQuad(gl, [0, 0, 0, 0]);
    135 wtu.checkCanvas(gl, [255, 255, 255, 255], "Should be white");
    136 
    137 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors");
    138 
    139 var successfullyParsed = true;
    140 </script>
    141 <script src="../../../js/js-test-post.js"></script>
    142 </body>
    143 </html>