<!-- /* ** Copyright (c) 2016 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>WebGL Rendering and Sampling Feedback Loop Tests</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="8" height="8"></canvas> <div id="description"></div> <div id="console"></div> <script id="vshader" type="x-shader/x-vertex">#version 300 es in highp vec4 aPosition; in vec2 aTexCoord; out vec2 texCoord; void main() { gl_Position = aPosition; texCoord = aTexCoord; } </script> <script id="fshader" type="x-shader/x-fragment">#version 300 es precision mediump float; uniform sampler2D tex; in vec2 texCoord; out vec4 oColor; void main() { oColor = texture(tex, texCoord); } </script> <script> "use strict"; var wtu = WebGLTestUtils; description("This test verifies the functionality of rendering to the same texture where it samples from."); var gl = wtu.create3DContext("example", undefined, 2); var width = 8; var height = 8; var tex0; var tex1; var fbo; var program; var positionLoc; var texCoordLoc; if (!gl) { testFailed("WebGL context does not exist"); } else { testPassed("WebGL context exists"); init(); // The sampling texture is bound to COLOR_ATTACHMENT1 during resource allocation allocate_resource(); rendering_sampling_feedback_loop([gl.NONE, gl.COLOR_ATTACHMENT1], gl.INVALID_OPERATION); rendering_sampling_feedback_loop([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1], gl.INVALID_OPERATION); rendering_sampling_feedback_loop([gl.COLOR_ATTACHMENT0, gl.NONE], gl.NO_ERROR); } function init() { program = wtu.setupProgram(gl, ['vshader', 'fshader'], ['aPosition', 'aTexCoord'], [0, 1]); positionLoc = gl.getAttribLocation(program, "aPosition"); texCoordLoc = gl.getAttribLocation(program, "aTexCoord"); if (!program || positionLoc < 0 || texCoordLoc < 0) { testFailed("Set up program failed"); return; } testPassed("Set up program succeeded"); wtu.setupUnitQuad(gl, 0, 1); gl.viewport(0, 0, width, height); } function allocate_resource() { tex0 = gl.createTexture(); tex1 = gl.createTexture(); fbo = gl.createFramebuffer(); wtu.fillTexture(gl, tex0, width, height, [0xff, 0x0, 0x0, 0xff], 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.RGBA); wtu.fillTexture(gl, tex1, width, height, [0x0, 0xff, 0x0, 0xff], 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.RGBA); gl.bindTexture(gl.TEXTURE_2D, tex1); var texLoc = gl.getUniformLocation(program, "tex"); gl.uniform1i(texLoc, 0); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex0, 0); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, tex1, 0); } function rendering_sampling_feedback_loop(draw_buffers, error) { gl.drawBuffers(draw_buffers); // Make sure framebuffer is complete before feedback loop detection if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) { testFailed("Framebuffer incomplete."); return; } wtu.clearAndDrawUnitQuad(gl); wtu.glErrorShouldBe(gl, error, "Rendering to a texture where it samples from should geneates INVALID_OPERATION. Otherwise, it should be NO_ERROR"); } gl.bindTexture(gl.TEXTURE_2D, null); gl.bindFramebuffer(gl.FRAMEBUFFER, null); gl.deleteTexture(tex0); gl.deleteTexture(tex1); gl.deleteFramebuffer(fbo); var successfullyParsed = true; </script> <script src="../../js/js-test-post.js"></script> </body> </html>