Backed out changeset 7272b7396c78 (bug 1932758) for causing fenix debug failures...
[gecko.git] / dom / canvas / test / webgl-conf / checkout / conformance / rendering / rendering-sampling-feedback-loop.html
blob888ee99aeceafb76181d5fc97d6af961a997119a
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 -->
7 <!DOCTYPE html>
8 <html>
9 <head>
10 <meta charset="utf-8">
11 <title>WebGL Rendering and Sampling Feedback Loop Tests</title>
12 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
13 <script src="../../js/js-test-pre.js"></script>
14 <script src="../../js/webgl-test-utils.js"></script>
15 </head>
16 <body>
17 <canvas id="example" width="8" height="8"></canvas>
18 <div id="description"></div>
19 <div id="console"></div>
21 <script id="vs100" type="x-shader/x-vertex">
22 attribute vec4 aPosition;
23 attribute vec2 aTexCoord;
24 varying vec2 texCoord;
25 void main() {
26 gl_Position = aPosition;
27 texCoord = aTexCoord;
29 </script>
31 <script id="fs100" type="x-shader/x-fragment">
32 #extension GL_EXT_draw_buffers : require
33 precision mediump float;
34 uniform sampler2D tex;
35 varying vec2 texCoord;
36 void main() {
37 gl_FragData[0] = texture2D(tex, texCoord);
38 gl_FragData[1] = texture2D(tex, texCoord);
40 </script>
42 <script id="fs100-no-ext-draw-buffers" type="x-shader/x-fragment">
43 precision mediump float;
44 uniform sampler2D tex;
45 varying vec2 texCoord;
46 void main() {
47 gl_FragData[0] = texture2D(tex, texCoord);
49 </script>
51 <script id="vs300" type="x-shader/x-vertex">#version 300 es
52 in highp vec4 aPosition;
53 in vec2 aTexCoord;
54 out vec2 texCoord;
55 void main() {
56 gl_Position = aPosition;
57 texCoord = aTexCoord;
59 </script>
61 <script id="fs300" type="x-shader/x-fragment">#version 300 es
62 precision mediump float;
63 uniform sampler2D tex;
64 in vec2 texCoord;
65 out vec4 oColor;
66 void main() {
67 oColor = texture(tex, texCoord);
69 </script>
71 <script>
72 "use strict";
74 const wtu = WebGLTestUtils;
75 description("This test verifies the functionality of rendering to the same texture where it samples from.");
77 const gl = wtu.create3DContext("example");
79 const width = 8;
80 const height = 8;
81 let tex;
82 let fbo;
83 let drawBuffers = null;
85 if (!gl) {
86 testFailed("WebGL context does not exist");
87 } else {
88 testPassed("WebGL context exists");
90 if (gl.drawBuffers) {
91 debug("Using webgl2.drawBuffers.");
92 drawBuffers = (x) => gl.drawBuffers(x);
93 } else {
94 const ext = gl.getExtension("WEBGL_draw_buffers");
95 if (ext) {
96 debug("Using WEBGL_draw_buffers.drawBuffersWEBGL.");
97 drawBuffers = (x) => ext.drawBuffersWEBGL(x);
101 init();
103 // The sampling texture is bound to COLOR_ATTACHMENT1 during resource allocation
104 allocate_resource();
106 rendering_sampling_feedback_loop(null);
107 if (drawBuffers) {
108 rendering_sampling_feedback_loop([gl.NONE]);
109 rendering_sampling_feedback_loop([gl.COLOR_ATTACHMENT0,
110 gl.COLOR_ATTACHMENT0+1]);
111 rendering_sampling_feedback_loop([gl.NONE,
112 gl.COLOR_ATTACHMENT0+1]);
116 function init() {
117 let shaders = ["vs100", "fs100"];
118 if (gl.texStorage2D) {
119 shaders = ["vs300", "fs300"];
120 } else if (!drawBuffers) {
121 shaders = ["vs100", "fs100-no-ext-draw-buffers"];
123 const program = wtu.setupProgram(gl, shaders, ["aPosition", "aTexCoord"], [0, 1]);
124 const positionLoc = gl.getAttribLocation(program, "aPosition");
125 const texCoordLoc = gl.getAttribLocation(program, "aTexCoord");
126 if (!program || positionLoc < 0 || texCoordLoc < 0) {
127 testFailed("Set up program failed");
128 return;
130 const texLoc = gl.getUniformLocation(program, "tex");
131 gl.uniform1i(texLoc, 0);
132 testPassed("Set up program succeeded");
134 wtu.setupUnitQuad(gl, 0, 1);
135 gl.viewport(0, 0, width, height);
138 function allocate_resource() {
139 tex = gl.createTexture();
140 gl.bindTexture(gl.TEXTURE_2D, tex);
141 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
143 fbo = gl.createFramebuffer();
144 gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
145 gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
148 function rendering_sampling_feedback_loop(draw_buffers) {
149 debug("draw_buffers: " + JSON.stringify(draw_buffers));
151 if (draw_buffers) {
152 drawBuffers(draw_buffers);
155 // Make sure framebuffer is complete before feedback loop detection
156 if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
157 testFailed("Framebuffer incomplete.");
158 return;
161 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
162 wtu.clearAndDrawUnitQuad(gl);
163 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "Feedback loop detection should ignore drawBuffers settings.");
165 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST);
166 // The texture will be mipmap incomplete, so feedback cannot occur nor be consistently evaluated.
167 wtu.clearAndDrawUnitQuad(gl);
168 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Feedback loop detection should ignore sampled incomplete textures.");
170 if (draw_buffers) {
171 drawBuffers([gl.COLOR_ATTACHMENT0]);
175 gl.deleteTexture(tex);
176 gl.deleteFramebuffer(fbo);
178 var successfullyParsed = true;
179 </script>
180 <script src="../../js/js-test-post.js"></script>
182 </body>
183 </html>