summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/conformance/glsl/misc/glsl-2types-of-textures-on-same-unit.html
blob: 1e8aebde39268ec6f7ae1aff489e5e29ff15b6a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<!--
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>WebGL GLSL 2 types of textures on same unit conformance 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>
</head>
<body>
<canvas id="example" width="2" height="2" style="width: 40px; height: 40px;"></canvas>
<canvas id="canvas2d" width="1" height="1" style="width: 40px; height: 40px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script id="vshader" type="x-shader/x-vertex">
attribute vec4 vPosition;
attribute vec2 texCoord0;
varying vec2 texCoord;
void main()
{
  gl_Position = vPosition;
  texCoord = texCoord0;
}
</script>

<script id="fshader" type="x-shader/x-fragment">
precision mediump float;

uniform sampler2D tex2d;
uniform samplerCube texCube;
varying vec2 texCoord;
void main()
{
  gl_FragColor =  texture2D(tex2d, texCoord) +
                  textureCube(texCube, vec3(0,1,0));
}
</script>

  <script>
  "use strict";
function init()
{
  description(
    "Tests that using 2 types of textures on the same texture unit" +
    "and referencing them both in the same program fails as per" +
    "OpenGL ES 2.0.24 spec section 2.10.4, Samplers subsection.");

  var canvas2d = document.getElementById("canvas2d");
  var ctx2d = canvas2d.getContext("2d");

  var wtu = WebGLTestUtils;
  var gl = wtu.create3DContext("example");
  var program = wtu.setupProgram(gl, ["vshader", "fshader"], ["vPosition", "texCoord0"]);

  var vertexObject = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
  gl.bufferData(
      gl.ARRAY_BUFFER,
      new Float32Array([
          -1, 1,0, 1,1,0, -1,-1,0,
          -1,-1,0, 1,1,0,  1,-1,0]),
      gl.STATIC_DRAW);
  gl.enableVertexAttribArray(0);
  gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);

  var vertexObject = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
  gl.bufferData(
      gl.ARRAY_BUFFER,
      new Float32Array([
          0,0, 1,0, 0,1,
          0,1, 1,0, 1,1]),
      gl.STATIC_DRAW);
  gl.enableVertexAttribArray(1);
  gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);

  // Make texture unit 1 active.
  gl.activeTexture(gl.TEXTURE1);

  // Make a 2d texture
  var tex2d = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, tex2d);
  ctx2d.fillStyle = "rgba(0, 0, 255, 255)";
  ctx2d.fillRect(0, 0, 1, 1);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas2d);

  // make a cube texture
  var texCube = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCube);
  ctx2d.fillStyle = "rgba(0, 255, 0, 64)";
  ctx2d.fillRect(0, 0, 1, 1);
  var targets = [
    gl.TEXTURE_CUBE_MAP_POSITIVE_X,
    gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
    gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
    gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
    gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
    gl.TEXTURE_CUBE_MAP_NEGATIVE_Z];
  for (var ii = 0; ii < targets.length; ++ii) {
    gl.texImage2D(targets[ii], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas2d);
  }

  var tex2dLoc = gl.getUniformLocation(program, "tex2d");
  var texCubeLoc = gl.getUniformLocation(program, "texCube");
  gl.uniform1i(tex2dLoc, 1);
  gl.uniform1i(texCubeLoc, 1);

  gl.clearColor(1,0,0,1);
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  for (var ii = 0; ii < 4; ++ii) {
    var x = ii % 2;
    var y = Math.floor(ii / 2);
    gl.drawArrays(gl.TRIANGLES, 0, 6);
    wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION,
              "drawing with 2 different targets on the same texture unit should generate INVALID_VALUE");
  }
}

init();
var successfullyParsed = true;
</script>
<script src="../../../js/js-test-post.js"></script>

</body>
</html>