Bug 734423 - Upgrade WebGL conformance test suite to 1.0.1 in-principle-final (r17063) - no review

1.0.1 is in principle a done thing. This is also the occasion to do a clean upgrade, by rm and cp, instead of applying a diff.

Upstream:
https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/conformance-suites/1.0.1/
This commit is contained in:
Benoit Jacob 2012-03-26 15:10:40 -04:00
parent 29a8024910
commit 444179b6b6
401 changed files with 4310 additions and 4214 deletions

View File

@ -1,6 +1,6 @@
// files that end in .txt list other tests
// other lines are assumed to be .html files
conformance/00_test_list.txt
conformance/more/00_test_list.txt
// files that end in .txt list other tests
// other lines are assumed to be .html files
conformance/00_test_list.txt
conformance/more/00_test_list.txt

View File

@ -1,6 +1,10 @@
This is a local copy of the WebGL conformance suite, SVN revision 16776
This is a local copy of the WebGL conformance suite, version 1.0.1, SVN revision 17036 (on the 1.0.1 branch, not on trunk)
The canonical location for this testsuite is:
The canonical location for this 1.0.1 test suite is:
https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/conformance-suites/1.0.1
The canonical location of the development tree is:
https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests
@ -12,3 +16,13 @@ patch file in this directory. The exceptions (the Mozilla-specific files) are:
* Makefile.in
* *.patch files, if any
How to do an update:
1. unapply local patches (the .patch files here)
2. perform the update:
* method A: apply diff with new version
* method B: erase all files here, import copy of new version.
3. edit CONFORMANCE_TEST_VERSION in test_webgl_conformance_test_suite.html. That's what
determines with tests to run, as some tests are only enabled in some not-yet-released
version.
4. reapply local patches.
5. update this readme and the .patch files

View File

@ -1,28 +1,28 @@
Welcome to the WebGL Conformance Test Suite
===========================================
This is the initial release of the WebGL conformance test suite.
NOTE TO USERS: Unless you are a WebGL implementor, there is no need to submit
a conformance result using this process. Should you discover bugs in your
browser's WebGL implementation, either via this test suite or otherwise,
please report them to your browser vendor's bug tracking system.
FOR WEBGL IMPLEMENTORS: Please follow the isntructions below to create
a formal conformance submission.'
1) Open webgl-conformance-tests.html in your target browser
2) Press the "run tests" button
3) At the end of the run, press "display text summary"
4) Verify that the User Agent and WebGL renderer strings identify your browser and target correctly.
5) Copy the contents of the text summary (starting with "WebGL Conformance Test Results") and send via email to
--- NEED ADDRESS HERE --- @khronos.org
- Version 1.0.0
- February 24, 2011
Welcome to the WebGL Conformance Test Suite
===========================================
This is the initial release of the WebGL conformance test suite.
NOTE TO USERS: Unless you are a WebGL implementor, there is no need to submit
a conformance result using this process. Should you discover bugs in your
browser's WebGL implementation, either via this test suite or otherwise,
please report them to your browser vendor's bug tracking system.
FOR WEBGL IMPLEMENTORS: Please follow the isntructions below to create
a formal conformance submission.'
1) Open webgl-conformance-tests.html in your target browser
2) Press the "run tests" button
3) At the end of the run, press "display text summary"
4) Verify that the User Agent and WebGL renderer strings identify your browser and target correctly.
5) Copy the contents of the text summary (starting with "WebGL Conformance Test Results") and send via email to
--- NEED ADDRESS HERE --- @khronos.org
- Version 1.0.0
- February 24, 2011

View File

@ -1,13 +1,13 @@
This file "00_test_list.txt" lists which files the test harness should run.
If you add new tests you can update it with
on windows
dir /b *.html >00_test_list.txt
on OSX / Linux
ls -1 *.html >00_test_list.txt
This file "00_test_list.txt" lists which files the test harness should run.
If you add new tests you can update it with
on windows
dir /b *.html >00_test_list.txt
on OSX / Linux
ls -1 *.html >00_test_list.txt

View File

@ -0,0 +1,30 @@
// For files copyrighted by the Chromium Authors, the following
// license applies:
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -37,15 +37,11 @@
description("Test some of the issues of the difference between attrib 0 on OpenGL vs WebGL");
debug("");
var wtu = WebGLTestUtils;
var canvas = document.getElementById("example");
var gl = wtu.create3DContext(canvas);
var gl = wtu.create3DContext("example");
function setup(numVerts, attribIndex) {
var program = wtu.setupProgram(
gl,
[wtu.loadShaderFromScript(gl, 'vshader', gl.VERTEX_SHADER),
wtu.loadShaderFromScript(gl, 'fshader', gl.FRAGMENT_SHADER)],
['vPosition'], [attribIndex]);
gl, ['vshader', 'fshader'], ['vPosition'], [attribIndex]);
// draw with something on attrib zero with a small number of vertices
var vertexObject = gl.createBuffer();
g_program = program;

View File

@ -53,9 +53,8 @@ function go() {
debug("");
gl1 = create3DContext(document.getElementById("c"));
c2 = document.createElement('canvas');
gl2 = create3DContext(c2);
gl1 = wtu.create3DContext("c");
gl2 = create3DContext();
shouldBeTrue("gl1 != null");
shouldBeTrue("gl2 != null");

View File

@ -59,7 +59,7 @@ function go() {
debug("");
gl1 = create3DContext(document.getElementById("c"));
gl1 = wtu.create3DContext("c");
if (!gl1) {
finishTest();
return;

View File

@ -94,8 +94,7 @@ debug("");
var wtu = WebGLTestUtils;
var err;
var maxSize;
var canvas = document.getElementById("canvas");
var gl = wtu.create3DContext(canvas);
var gl = wtu.create3DContext("canvas");
if (!gl) {
testFailed("context does not exist");
} else {
@ -114,8 +113,8 @@ if (!gl) {
debug("Checking drawingBufferWidth/drawingBufferHeight");
// Check that a canvas with no width or height is 300x150 pixels
shouldBe('gl.drawingBufferWidth', 'canvas.width');
shouldBe('gl.drawingBufferHeight', 'canvas.height');
shouldBe('gl.drawingBufferWidth', 'gl.canvas.width');
shouldBe('gl.drawingBufferHeight', 'gl.canvas.height');
// Check that changing the canvas size to something too large falls back to reasonable values.
maxSize = gl.getParameter(gl.MAX_VIEWPORT_DIMS);
@ -123,8 +122,8 @@ if (!gl) {
shouldBeTrue('maxSize[1] > 0');
// debug("MAX_VIEWPORT_DIMS = " + maxSize[0] + "x" + maxSize[1]);
canvas.width = maxSize[0] * 4;
canvas.height = maxSize[1] * 4;
gl.canvas.width = maxSize[0] * 4;
gl.canvas.height = maxSize[1] * 4;
shouldBeTrue('gl.drawingBufferWidth > 0');
shouldBeTrue('gl.drawingBufferHeight > 0');
shouldBeTrue('gl.drawingBufferWidth <= maxSize[0]');
@ -133,8 +132,8 @@ if (!gl) {
debug("");
debug("Checking scaling up then back down to 50/50, drawing still works.");
canvas.width = 50;
canvas.height = 50;
gl.canvas.width = 50;
gl.canvas.height = 50;
shouldBeTrue('gl.drawingBufferWidth == 50');
shouldBeTrue('gl.drawingBufferHeight == 50');
shouldBe('gl.getError()', 'gl.NO_ERROR');

View File

@ -93,8 +93,7 @@ debug("");
var wtu = WebGLTestUtils;
var err;
var maxSize;
var canvas = document.createElement("canvas");
var gl = create3DContext(canvas);
var gl = wtu.create3DContext();
if (!gl) {
testFailed("context does not exist");
} else {
@ -113,8 +112,8 @@ if (!gl) {
debug("Checking drawingBufferWidth/drawingBufferHeight");
// Check that a canvas with no width or height is 300x150 pixels
shouldBe('gl.drawingBufferWidth', 'canvas.width');
shouldBe('gl.drawingBufferHeight', 'canvas.height');
shouldBe('gl.drawingBufferWidth', 'gl.canvas.width');
shouldBe('gl.drawingBufferHeight', 'gl.canvas.height');
// Check that changing the canvas size to something too large falls back to reasonable values.
maxSize = gl.getParameter(gl.MAX_VIEWPORT_DIMS);
@ -122,8 +121,8 @@ if (!gl) {
shouldBeTrue('maxSize[1] > 0');
// debug("MAX_VIEWPORT_DIMS = " + maxSize[0] + "x" + maxSize[1]);
canvas.width = maxSize[0] * 4;
canvas.height = maxSize[1] * 4;
gl.canvas.width = maxSize[0] * 4;
gl.canvas.height = maxSize[1] * 4;
shouldBeTrue('gl.drawingBufferWidth > 0');
shouldBeTrue('gl.drawingBufferHeight > 0');
shouldBeTrue('gl.drawingBufferWidth <= maxSize[0]');
@ -132,8 +131,8 @@ if (!gl) {
debug("");
debug("Checking scaling up then back down to 50/50, drawing still works.");
canvas.width = 50;
canvas.height = 50;
gl.canvas.width = 50;
gl.canvas.height = 50;
shouldBeTrue('gl.drawingBufferWidth == 50');
shouldBeTrue('gl.drawingBufferHeight == 50');
shouldBe('gl.getError()', 'gl.NO_ERROR');

View File

@ -196,7 +196,6 @@ SAMPLE_COVERAGE_INVERT : 0x80AB,
/* TEXTURE_WRAP_S */
/* TEXTURE_WRAP_T */
NUM_COMPRESSED_TEXTURE_FORMATS : 0x86A2,
COMPRESSED_TEXTURE_FORMATS : 0x86A3,
/* HintMode */

View File

@ -0,0 +1,113 @@
<!--
Copyright (C) 2012 Opera Software ASA. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY OPERA SOFTWARE ASA. ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test.js"></script>
<style>
canvas {
width:50px;
height:50px;
}
.square {
display:inline-block;
width:50px;
height:50px;
background-color:red;
}
</style>
<script>
function checkResult(ctx1, ctx2, preserve) {
var imgData1 = ctx1.getImageData(0,0,1,1);
var imgData2 = ctx2.getImageData(0,0,1,1);
var correct1 = [255,0,0,255];
var correct2 = preserve ? [255,0,0,255] : [0,0,0,255];
var ok1 = true;
var ok2 = true;
for (var p = 0; p < 4; ++p) {
if (imgData1.data[p] != correct1[p])
ok1 = false;
if (imgData2.data[p] != correct2[p])
ok2 = false;
}
if (ok1 && ok2)
testPassed('Rendered ok with preserveDrawingBuffer ' + preserve +'.');
else
testFailed('Did not render ok with preserveDrawingBuffer ' + preserve + '.');
if (preserve) {
debug('<br /><span class="pass">TEST COMPLETE</span>');
notifyFinishedToHarness()
} else {
runTest(true);
}
}
function runTest(preserve) {
var c1 = document.getElementById('c' + (preserve * 3 + 1));
var c2 = document.getElementById('c' + (preserve * 3 + 2));
var c3 = document.getElementById('c' + (preserve * 3 + 3));
var ctx1 = c1.getContext('2d');
var ctx2 = c2.getContext('2d');
var gl = c3.getContext('experimental-webgl', { alpha:false, preserveDrawingBuffer:preserve });
gl.clearColor(1, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
ctx1.drawImage(c3, 0, 0);
setTimeout(function() { ctx2.drawImage(c3, 0, 0); checkResult(ctx1, ctx2, preserve); }, 100);
}
</script>
</head>
<body>
<div>
<canvas id='c1'></canvas>
<canvas id='c2'></canvas>
<canvas id='c3'></canvas>
<span>should look as right pattern</span>
<div class='square'></div>
<div class='square' style='background-color:black'></div>
<div class='square'></div>
</div>
<div>
<canvas id='c4'></canvas>
<canvas id='c5'></canvas>
<canvas id='c6'></canvas>
<span>should look as right pattern</span>
<div class='square'></div>
<div class='square'></div>
<div class='square'></div>
</div>
<div id="description"></div>
<div id="console"></div>
<script>
description('Verify that preserveDrawingBuffer attribute is honored.');
runTest(false);
successfullyParsed = true;
shouldBeTrue("successfullyParsed");
</script>
</body>
</html>

View File

@ -4,5 +4,5 @@ oes-texture-float.html
oes-vertex-array-object.html
webgl-debug-renderer-info.html
webgl-debug-shaders.html
--min-version 1.0.2 webgl-experimental-compressed-textures.html
--min-version 1.0.2 webgl-compressed-texture-s3tc.html

View File

@ -1,3 +0,0 @@
var img_4x4_rgb_dxt1 = [
0xe0,0x07,0x00,0xf8,0x11,0x10,0x15,0x00,
];

View File

@ -1,3 +0,0 @@
var img_4x4_rgba_dxt1 = [
0xe0,0x07,0x00,0xf8,0x13,0x10,0x15,0x00,
];

View File

@ -1,3 +0,0 @@
var img_4x4_rgba_dxt3 = [
0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,
];

View File

@ -1,3 +0,0 @@
var img_4x4_rgba_dxt5 = [
0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,
];

View File

@ -1,3 +0,0 @@
var img_4x4_rgba_raw = [
0xff,0x00,0x00,0x69,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,
];

View File

@ -1,3 +0,0 @@
var img_8x8_rgb_dxt1 = [
0xe0,0x07,0x00,0xf8,0x11,0x10,0x15,0x00,0x1f,0x00,0xe0,0xff,0x11,0x10,0x15,0x00,0xe0,0x07,0x1f,0xf8,0x44,0x45,0x40,0x55,0x1f,0x00,0xff,0x07,0x44,0x45,0x40,0x55,
];

View File

@ -1,3 +0,0 @@
var img_8x8_rgba_dxt1 = [
0xe0,0x07,0x00,0xf8,0x13,0x13,0x15,0x00,0x1f,0x00,0xe0,0xff,0x11,0x10,0x15,0x00,0xe0,0x07,0x1f,0xf8,0x44,0x45,0x43,0x57,0x1f,0x00,0xff,0x07,0x44,0x45,0x40,0x55,
];

View File

@ -1,3 +0,0 @@
var img_8x8_rgba_dxt3 = [
0xf6,0xff,0xf6,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0x1f,0x00,0x44,0x45,0x40,0x55,0xff,0xff,0xff,0xff,0xf6,0xff,0xf6,0xff,0x1f,0xf8,0xe0,0x07,0x11,0x10,0x15,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x1f,0x00,0x11,0x10,0x15,0x00,
];

View File

@ -1,3 +0,0 @@
var img_8x8_rgba_dxt5 = [
0xff,0x69,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x1f,0x00,0x44,0x45,0x40,0x55,0xff,0x69,0x00,0x00,0x00,0x01,0x10,0x00,0x1f,0xf8,0xe0,0x07,0x11,0x10,0x15,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x1f,0x00,0x11,0x10,0x15,0x00,
];

View File

@ -1,3 +0,0 @@
var img_8x8_rgba_pvrtc4bpp = [
0x33,0x30,0x3f,0x00,0xe0,0x83,0x00,0xfc,0xcc,0xcf,0xc0,0xff,0xe0,0x83,0x1f,0xfc,0xcc,0xcf,0xc0,0xff,0xe0,0xff,0x1f,0x80,0x33,0x30,0x3f,0x00,0xfe,0x83,0x1f,0x80,
];

View File

@ -1,3 +0,0 @@
var img_8x8_rgba_raw = [
0xff,0x00,0x00,0x69,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x69,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x69,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0x69,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,
];

View File

@ -120,8 +120,8 @@ if (!gl) {
runHintTestEnabled();
runShaderTests(true);
runOutputTests();
// similar to bug 683216, see the discussion in bug 630672
// runUniqueObjectTest();
runUniqueObjectTest();
runReferenceCycleTest();
}
}
@ -257,11 +257,7 @@ function runOutputTests() {
gl.viewport(0, 0, canvas.width, canvas.height);
gl.hint(ext.FRAGMENT_SHADER_DERIVATIVE_HINT_OES, gl.NICEST);
var shaders = [
wtu.loadShaderFromScript(gl, "outputVertexShader"),
wtu.loadShaderFromScript(gl, "outputFragmentShader")
];
var program = wtu.setupProgram(gl, shaders, ['vPosition', 'texCoord0'], [0, 1]);
var program = wtu.setupProgram(gl, ["outputVertexShader", "outputFragmentShader"], ['vPosition', 'texCoord0'], [0, 1]);
var quadParameters = wtu.setupUnitQuad(gl, 0, 1);
function readLocation(x, y) {
@ -375,6 +371,20 @@ function runUniqueObjectTest()
shouldBe('gl.getExtension("OES_standard_derivatives").myProperty', '2');
}
function runReferenceCycleTest()
{
// create some reference cycles. The goal is to see if they cause leaks. The point is that
// some browser test runners have instrumentation to detect leaked refcounted objects.
debug("Testing reference cycles between context and extension objects");
var ext = gl.getExtension("OES_standard_derivatives");
// create cycle between extension and context, since the context has to hold a reference to the extension
ext.context = gl;
// create a self-cycle on the extension object
ext.ext = ext;
}
debug("");
successfullyParsed = true;

View File

@ -66,7 +66,7 @@ if (!gl) {
var texturedShaders = [
wtu.setupSimpleTextureVertexShader(gl),
wtu.loadShaderFromScript(gl, "testFragmentShader")
"testFragmentShader"
];
var testProgram =
wtu.setupProgram(gl,
@ -85,8 +85,8 @@ if (!gl) {
testPassed("Successfully enabled OES_texture_float extension");
runTextureCreationTest(testProgram, true);
runRenderTargetTest(testProgram);
// bug 683216, see the discussion in bug 630672
// runUniqueObjectTest();
runUniqueObjectTest();
runReferenceCycleTest();
}
}
@ -165,13 +165,9 @@ function runRenderTargetTest(testProgram)
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE)
return;
var shaders = [
wtu.loadShaderFromScript(gl, "positionVertexShader"),
wtu.loadShaderFromScript(gl, "floatingPointFragmentShader")
];
var renderProgram =
wtu.setupProgram(gl,
shaders,
["positionVertexShader", "floatingPointFragmentShader"],
['vPosition'],
[0]);
wtu.drawQuad(gl);
@ -216,6 +212,20 @@ function runUniqueObjectTest()
shouldBe('gl.getExtension("OES_texture_float").myProperty', '2');
}
function runReferenceCycleTest()
{
// create some reference cycles. The goal is to see if they cause leaks. The point is that
// some browser test runners have instrumentation to detect leaked refcounted objects.
debug("Testing reference cycles between context and extension objects");
var ext = gl.getExtension("OES_texture_float");
// create cycle between extension and context, since the context has to hold a reference to the extension
ext.context = gl;
// create a self-cycle on the extension object
ext.ext = ext;
}
debug("");
successfullyParsed = true;

View File

@ -0,0 +1,614 @@
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test.js"></script>
<script src="../resources/webgl-test-utils.js"></script>
<title>WebGL WEBGL_compressed_texture_s3tc Conformance Tests</title>
<style>
img {
border: 1px solid black;
margin-right: 1em;
}
.testimages {
}
.testimages br {
clear: both;
}
.testimages > div {
float: left;
margin: 1em;
}
</style>
</head>
<body>
<div id="description"></div>
<canvas id="canvas" width="8" height="8" style="width: 8px; height: 8px;"></canvas>
<div id="console"></div>
<script>
description("This test verifies the functionality of the WEBGL_compressed_texture_s3tc extension, if it is available.");
debug("");
var img_4x4_rgba_raw = new Uint8Array([
0xff,0x00,0x00,0x69,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,
]);
var img_4x4_rgb_dxt1 = new Uint8Array([
0xe0,0x07,0x00,0xf8,0x11,0x10,0x15,0x00,
]);
var img_4x4_rgba_dxt1 = new Uint8Array([
0xe0,0x07,0x00,0xf8,0x13,0x10,0x15,0x00,
]);
var img_4x4_rgba_dxt3 = new Uint8Array([
0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,
]);
var img_4x4_rgba_dxt5 = new Uint8Array([
0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,
]);
var img_8x8_rgba_raw = new Uint8Array([
0xff,0x00,0x00,0x69,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x69,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x69,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0x00,0xff,0x69,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,
]);
var img_8x8_rgb_dxt1 = new Uint8Array([
0xe0,0x07,0x00,0xf8,0x11,0x10,0x15,0x00,0x1f,0x00,0xe0,0xff,0x11,0x10,0x15,0x00,0xe0,0x07,0x1f,0xf8,0x44,0x45,0x40,0x55,0x1f,0x00,0xff,0x07,0x44,0x45,0x40,0x55,
]);
var img_8x8_rgba_dxt1 = new Uint8Array([
0xe0,0x07,0x00,0xf8,0x13,0x13,0x15,0x00,0x1f,0x00,0xe0,0xff,0x11,0x10,0x15,0x00,0xe0,0x07,0x1f,0xf8,0x44,0x45,0x43,0x57,0x1f,0x00,0xff,0x07,0x44,0x45,0x40,0x55,
]);
var img_8x8_rgba_dxt3 = new Uint8Array([
0xf6,0xff,0xf6,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0x1f,0x00,0x44,0x45,0x40,0x55,0xff,0xff,0xff,0xff,0xf6,0xff,0xf6,0xff,0x1f,0xf8,0xe0,0x07,0x11,0x10,0x15,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x1f,0x00,0x11,0x10,0x15,0x00,
]);
var img_8x8_rgba_dxt5 = new Uint8Array([
0xff,0x69,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0xf8,0xe0,0x07,0x44,0x45,0x40,0x55,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x1f,0x00,0x44,0x45,0x40,0x55,0xff,0x69,0x00,0x00,0x00,0x01,0x10,0x00,0x1f,0xf8,0xe0,0x07,0x11,0x10,0x15,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x1f,0x00,0x11,0x10,0x15,0x00,
]);
var wtu = WebGLTestUtils;
var canvas = document.getElementById("canvas");
var gl = wtu.create3DContext(canvas, {antialias: false});
var program = wtu.setupTexturedQuad(gl);
var ext = null;
var vao = null;
var validFormats = {
COMPRESSED_RGB_S3TC_DXT1_EXT : 0x83F0,
COMPRESSED_RGBA_S3TC_DXT1_EXT : 0x83F1,
COMPRESSED_RGBA_S3TC_DXT3_EXT : 0x83F2,
COMPRESSED_RGBA_S3TC_DXT5_EXT : 0x83F3,
};
var name;
var supportedFormats;
if (!gl) {
testFailed("WebGL context does not exist");
} else {
testPassed("WebGL context exists");
// Run tests with extension disabled
runTestDisabled();
// Query the extension and store globally so shouldBe can access it
ext = gl.getExtension("WEBGL_compressed_texture_s3tc");
if (!ext) {
ext = gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
}
if (!ext) {
testPassed("No WEBGL_compressed_texture_s3tc support -- this is legal");
runSupportedTest(false);
} else {
testPassed("Successfully enabled WEBGL_compressed_texture_s3tc extension");
runSupportedTest(true);
runTestExtension();
}
}
function runSupportedTest(extensionEnabled) {
var supported = gl.getSupportedExtensions();
if (supported.indexOf("WEBGL_compressed_texture_s3tc") >= 0 ||
supported.indexOf("WEBKIT_WEBGL_compressed_texture_s3tc") >= 0) {
if (extensionEnabled) {
testPassed("WEBGL_compressed_texture_s3tc listed as supported and getExtension succeeded");
} else {
testFailed("WEBGL_compressed_texture_s3tc listed as supported but getExtension failed");
}
} else {
if (extensionEnabled) {
testFailed("WEBGL_compressed_texture_s3tc not listed as supported but getExtension succeeded");
} else {
testPassed("WEBGL_compressed_texture_s3tc not listed as supported and getExtension failed -- this is legal");
}
}
}
function runTestDisabled() {
debug("Testing binding enum with extension disabled");
shouldBe('gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS)', '[]');
}
function formatExists(format, supportedFormats) {
for (var ii = 0; ii < supportedFormats.length; ++ii) {
if (format == supportedFormats[ii]) {
testPassed("supported format " + formatToString(format) + " is exists");
return;
}
}
testFailed("supported format " + formatToString(format) + " does not exist");
}
function formatToString(format) {
for (var p in ext) {
if (ext[p] == format) {
return p;
}
}
return "0x" + format.toString(16);
}
function runTestExtension() {
debug("Testing WEBGL_compressed_texture_s3tc");
// check that all format enums exist.
for (name in validFormats) {
var expected = "0x" + validFormats[name].toString(16);
var actual = "ext['" + name + "']";
shouldBe(actual, expected);
}
supportedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);
// There should be exactly 4 formats
shouldBe("supportedFormats.length", "4");
// check that all 4 formats exist
for (var name in validFormats.length) {
formatExists(validFormats[name], supportedFormats);
}
// Test each format
testDXT1_RGB();
testDXT1_RGBA();
testDXT3_RGBA();
testDXT5_RGBA();
}
function testDXT1_RGB() {
var tests = [
{ width: 4,
height: 4,
channels: 3,
data: img_4x4_rgb_dxt1,
format: ext.COMPRESSED_RGB_S3TC_DXT1_EXT
},
{ width: 8,
height: 8,
channels: 3,
data: img_8x8_rgb_dxt1,
format: ext.COMPRESSED_RGB_S3TC_DXT1_EXT
}
];
testDXTTextures(tests);
}
function testDXT1_RGBA() {
var tests = [
{ width: 4,
height: 4,
channels: 4,
data: img_4x4_rgba_dxt1,
format: ext.COMPRESSED_RGBA_S3TC_DXT1_EXT
},
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_dxt1,
format: ext.COMPRESSED_RGBA_S3TC_DXT1_EXT
}
];
testDXTTextures(tests);
}
function testDXT3_RGBA() {
var tests = [
{ width: 4,
height: 4,
channels: 4,
data: img_4x4_rgba_dxt3,
format: ext.COMPRESSED_RGBA_S3TC_DXT3_EXT
},
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_dxt3,
format: ext.COMPRESSED_RGBA_S3TC_DXT3_EXT
}
];
testDXTTextures(tests);
}
function testDXT5_RGBA() {
var tests = [
{ width: 4,
height: 4,
channels: 4,
data: img_4x4_rgba_dxt5,
format: ext.COMPRESSED_RGBA_S3TC_DXT5_EXT
},
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_dxt5,
format: ext.COMPRESSED_RGBA_S3TC_DXT5_EXT
}
];
testDXTTextures(tests);
}
function testDXTTextures(tests) {
debug("<hr/>");
for (var ii = 0; ii < tests.length; ++ii) {
testDXTTexture(tests[ii]);
}
}
function uncompressDXTBlock(
destBuffer, destX, destY, destWidth, src, srcOffset, format) {
function make565(src, offset) {
return src[offset + 0] + src[offset + 1] * 256;
}
function make8888From565(c) {
return [
Math.floor(((c >> 11) & 0x1F) * 255 / 31),
Math.floor(((c >> 5) & 0x3F) * 255 / 63),
Math.floor(((c >> 0) & 0x1F) * 255 / 31),
255
];
}
function mix(mult, c0, c1, div) {
var r = [];
for (var ii = 0; ii < c0.length; ++ii) {
r[ii] = Math.floor((c0[ii] * mult + c1[ii]) / div);
}
return r;
}
var isDXT1 = format == ext.COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == ext.COMPRESSED_RGBA_S3TC_DXT1_EXT;
var colorOffset = srcOffset + (isDXT1 ? 0 : 8);
var color0 = make565(src, colorOffset + 0);
var color1 = make565(src, colorOffset + 2);
var c0gtc1 = color0 > color1 || !isDXT1;
var rgba0 = make8888From565(color0);
var rgba1 = make8888From565(color1);
var colors = [
rgba0,
rgba1,
c0gtc1 ? mix(2, rgba0, rgba1, 3) : mix(1, rgba0, rgba1, 2),
c0gtc1 ? mix(2, rgba1, rgba0, 3) : [0, 0, 0, 255]
];
// yea I know there is a lot of math in this inner loop.
// so sue me.
for (var yy = 0; yy < 4; ++yy) {
var pixels = src[colorOffset + 4 + yy];
for (var xx = 0; xx < 4; ++xx) {
var dstOff = ((destY + yy) * destWidth + destX + xx) * 4;
var code = (pixels >> (xx * 2)) & 0x3;
var srcColor = colors[code];
var alpha;
switch (format) {
case ext.COMPRESSED_RGB_S3TC_DXT1_EXT:
alpha = 255;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT1_EXT:
alpha = (code == 3 && !c0gtc1) ? 0 : 255;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT3_EXT:
{
var alpha0 = src[srcOffset + yy * 2 + Math.floor(xx / 2)];
var alpha1 = (alpha0 >> ((xx % 2) * 4)) & 0xF;
alpha = alpha1 | (alpha1 << 4);
}
break;
case ext.COMPRESSED_RGBA_S3TC_DXT5_EXT:
{
var alpha0 = src[srcOffset + 0];
var alpha1 = src[srcOffset + 1];
var alphaOff = Math.floor(yy / 2) * 3 + 2;
var alphaBits =
src[srcOffset + alphaOff + 0] +
src[srcOffset + alphaOff + 1] * 256 +
src[srcOffset + alphaOff + 2] * 65536;
var alphaShift = (yy % 2) * 12 + xx * 3;
var alphaCode = (alphaBits >> alphaShift) & 0x7;
if (alpha0 > alpha1) {
switch (alphaCode) {
case 0:
alpha = alpha0;
break;
case 1:
alpha = alpha1;
break;
default:
alpha = ((8 - alphaCode) * alpha0 + (alphaCode - 1) * alpha1) / 7;
break;
}
} else {
switch (alphaCode) {
case 0:
alpha = alpha0;
break;
case 1:
alpha = alpha1;
break;
case 6:
alpha = 0;
break;
case 7:
alpha = 255;
break;
default:
alpha = ((6 - alphaCode) * alpha0 + (alphaCode - 1) * alpha1) / 5;
break;
}
}
}
break;
default:
throw "bad format";
}
destBuffer[dstOff + 0] = srcColor[0];
destBuffer[dstOff + 1] = srcColor[1];
destBuffer[dstOff + 2] = srcColor[2];
destBuffer[dstOff + 3] = alpha;
}
}
}
function getBlockSize(format) {
var isDXT1 = format == ext.COMPRESSED_RGB_S3TC_DXT1_EXT ||
format == ext.COMPRESSED_RGBA_S3TC_DXT1_EXT;
return isDXT1 ? 8 : 16;
}
function uncompressDXT(width, height, data, format) {
if (width % 4 || height % 4) throw "bad width or height";
var dest = new Uint8Array(width * height * 4);
var blocksAcross = width / 4;
var blocksDown = height / 4;
var blockSize = getBlockSize(format);
for (var yy = 0; yy < blocksDown; ++yy) {
for (var xx = 0; xx < blocksAcross; ++xx) {
uncompressDXTBlock(
dest, xx * 4, yy * 4, width, data,
(yy * blocksAcross + xx) * blockSize, format);
}
}
return dest;
}
function copyRect(data, srcX, srcY, dstX, dstY, width, height, stride) {
var bytesPerLine = width * 4;
var srcOffset = srcX * 4 + srcY * stride;
var dstOffset = dstX * 4 + dstY * stride;
for (; height > 0; --height) {
for (var ii = 0; ii < bytesPerLine; ++ii) {
data[dstOffset + ii] = data[srcOffset + ii];
}
srcOffset += stride;
dstOffset += stride;
}
}
function testDXTTexture(test) {
var data = new Uint8Array(test.data);
var width = test.width;
var height = test.height;
var format = test.format;
var uncompressedData = uncompressDXT(width, height, data, format);
canvas.width = width;
canvas.height = height;
gl.viewport(0, 0, width, height);
debug("testing " + formatToString(format) + " " + width + "x" + height);
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data);
glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
wtu.drawQuad(gl);
compareRect(width, height, test.channels, width, height, uncompressedData, data, format);
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 1, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "non 0 border");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width + 4, height, 0, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height + 4, 0, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 4, height, 0, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 4, 0, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 1, height, 0, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 2, height, 0, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 1, 0, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 2, 0, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
if (width == 4) {
gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 1, height, 0, data);
glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 2, height, 0, data);
glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
}
if (height == 4) {
gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 1, 0, data);
glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 2, 0, data);
glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0");
}
// pick a wrong format that uses the same amount of data.
var wrongFormat;
switch (format) {
case ext.COMPRESSED_RGB_S3TC_DXT1_EXT:
wrongFormat = ext.COMPRESSED_RGBA_S3TC_DXT1_EXT;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT1_EXT:
wrongFormat = ext.COMPRESSED_RGB_S3TC_DXT1_EXT;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT3_EXT:
wrongFormat = ext.COMPRESSED_RGBA_S3TC_DXT5_EXT;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT5_EXT:
wrongFormat = ext.COMPRESSED_RGBA_S3TC_DXT3_EXT;
break;
}
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, wrongFormat, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "format does not match");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width + 4, height, format, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height + 4, format, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 4, height, format, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 4, format, data);
glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 1, height, format, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 2, height, format, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 1, format, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 2, format, data);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions");
var subData = new Uint8Array(data.buffer, 0, getBlockSize(format));
if (width == 8 && height == 8) {
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 1, 0, 4, 4, format, subData);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset");
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 1, 4, 4, format, subData);
glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset");
}
var stride = width * 4;
for (var yoff = 0; yoff < height; yoff += 4) {
for (var xoff = 0; xoff < width; xoff += 4) {
copyRect(uncompressedData, 0, 0, xoff, yoff, 4, 4, stride);
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, xoff, yoff, 4, 4, format, subData);
glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
wtu.drawQuad(gl);
compareRect(width, height, test.channels, width, height, uncompressedData, data, format);
}
}
}
function insertImg(element, caption, img) {
var div = document.createElement("div");
div.appendChild(img);
var label = document.createElement("div");
label.appendChild(document.createTextNode(caption));
div.appendChild(label);
element.appendChild(div);
}
function makeImage(imageWidth, imageHeight, dataWidth, data, alpha) {
var scale = 8;
var c = document.createElement("canvas");
c.width = imageWidth * scale;
c.height = imageHeight * scale;
var ctx = c.getContext("2d");
for (var yy = 0; yy < imageWidth; ++yy) {
for (var xx = 0; xx < imageHeight; ++xx) {
var offset = (yy * dataWidth + xx) * 4;
ctx.fillStyle = "rgba(" +
data[offset + 0] + "," +
data[offset + 1] + "," +
data[offset + 2] + "," +
(alpha ? data[offset + 3] / 255 : 1) + ")";
ctx.fillRect(xx * scale, yy * scale, scale, scale);
}
}
var img = document.createElement("img");
img.src = c.toDataURL();
return img;
}
function compareRect(
actualWidth, actualHeight, actualChannels,
dataWidth, dataHeight, expectedData,
testData, testFormat) {
var actual = new Uint8Array(actualWidth * actualHeight * 4);
gl.readPixels(
0, 0, actualWidth, actualHeight, gl.RGBA, gl.UNSIGNED_BYTE, actual);
var div = document.createElement("div");
div.className = "testimages";
insertImg(div, "expected", makeImage(
actualWidth, actualHeight, dataWidth, expectedData,
actualChannels == 4));
insertImg(div, "actual", makeImage(
actualWidth, actualHeight, actualWidth, actual,
actualChannels == 4));
div.appendChild(document.createElement('br'));
document.getElementById("console").appendChild(div);
var failed = false;
for (var yy = 0; yy < actualHeight; ++yy) {
for (var xx = 0; xx < actualWidth; ++xx) {
var actualOffset = (yy * actualWidth + xx) * 4;
var expectedOffset = (yy * dataWidth + xx) * 4;
var expected = [
expectedData[expectedOffset + 0],
expectedData[expectedOffset + 1],
expectedData[expectedOffset + 2],
(actualChannels == 3 ? 255 : expectedData[expectedOffset + 3])
];
for (var jj = 0; jj < 4; ++jj) {
if (actual[actualOffset + jj] != expected[jj]) {
failed = true;
var was = actual[actualOffset + 0].toString();
for (j = 1; j < 4; ++j) {
was += "," + actual[actualOffset + j];
}
testFailed('at (' + xx + ', ' + yy +
') expected: ' + expected + ' was ' + was);
}
}
}
}
if (!failed) {
testPassed("texture rendered correctly");
}
}
function testPVRTCTextures() {
testFailed("PVRTC test not yet implemented");
}
debug("");
successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>

View File

@ -26,8 +26,7 @@ description("This test verifies the functionality of the WEBGL_debug_renderer_in
debug("");
var wtu = WebGLTestUtils;
var canvas = document.getElementById("canvas");
var gl = create3DContext(canvas);
var gl = wtu.create3DContext("canvas");
var ext = null;
var vao = null;

View File

@ -26,8 +26,7 @@ description("This test verifies the functionality of the WEBGL_debug_shaders ext
debug("");
var wtu = WebGLTestUtils;
var canvas = document.getElementById("canvas");
var gl = create3DContext(canvas);
var gl = wtu.create3DContext("canvas");
var ext = null;
var shader = null;

View File

@ -1,520 +0,0 @@
<!--
Copyright (c) 2011 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL WEBGL_EXPERIMENTAL_compressed_textures Conformance Tests</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<style>
img {
border: 1px solid black;
margin-right: 1em;
}
.testimages {
}
.testimages br {
clear: both;
}
.testimages > div {
float: left;
margin: 1em;
}
</style>
<script src="../../resources/desktop-gl-constants.js" type="text/javascript"></script>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test.js"></script>
<script src="../resources/webgl-test-utils.js"></script>
<script src="compressed-textures/4x4.rgb.dxt1.js"></script>
<script src="compressed-textures/4x4.rgba.dxt1.js"></script>
<script src="compressed-textures/4x4.rgba.dxt5.js"></script>
<script src="compressed-textures/8x8.rgb.dxt1.js"></script>
<script src="compressed-textures/8x8.rgba.dxt1.js"></script>
<script src="compressed-textures/8x8.rgba.dxt5.js"></script>
<script src="compressed-textures/8x8.rgba.pvrtc4bpp.js"></script>
</head>
<body>
<div id="description"></div>
<canvas id="canvas" width="8" height="8" style="width: 8px; height: 8px;"></canvas>
<div id="console"></div>
<!-- Shaders for testing standard derivatives -->
<script>
description("This test verifies the functionality of the OES_vertex_array_object extension, if it is available.");
debug("");
var wtu = WebGLTestUtils;
var canvas = document.getElementById("canvas");
var gl = wtu.create3DContext(canvas, {antialias: false});
var program = wtu.setupTexturedQuad(gl);
var ext = null;
var vao = null;
var validFormats = {
COMPRESSED_RGB_S3TC_DXT1_EXT : 0x83F0,
COMPRESSED_RGBA_S3TC_DXT1_EXT : 0x83F1,
COMPRESSED_RGBA_S3TC_DXT5_EXT : 0x83F3,
ETC1_RGB8_OES : 0x8D64,
COMPRESSED_RGB_PVRTC_4BPPV1_IMG : 0x8C00,
COMPRESSED_RGBA_PVRTC_4BPPV1_IMG : 0x8C02
};
var name;
var supportedFormats;
if (!gl) {
testFailed("WebGL context does not exist");
} else {
testPassed("WebGL context exists");
// Run tests with extension disabled
runTestDisabled();
// Query the extension and store globally so shouldBe can access it
ext = gl.getExtension("WEBGL_EXPERIMENTAL_compressed_textures");
if (!ext) {
testPassed("No WEBGL_EXPERIMENTAL_compressed_textures support -- this is legal");
runSupportedTest(false);
} else {
testPassed("Successfully enabled WEBGL_EXPERIMENTAL_compressed_textures extension");
runSupportedTest(true);
runTestExtension();
}
}
function runSupportedTest(extensionEnabled) {
var supported = gl.getSupportedExtensions();
if (supported.indexOf("WEBGL_EXPERIMENTAL_compressed_textures") >= 0) {
if (extensionEnabled) {
testPassed("WEBGL_EXPERIMENTAL_compressed_textures listed as supported and getExtension succeeded");
} else {
testFailed("WEBGL_EXPERIMENTAL_compressed_textures listed as supported but getExtension failed");
}
} else {
if (extensionEnabled) {
testFailed("WEBGL_EXPERIMENTAL_compressed_textures not listed as supported but getExtension succeeded");
} else {
testPassed("WEBGL_EXPERIMENTAL_compressed_textures not listed as supported and getExtension failed -- this is legal");
}
}
}
function runTestDisabled() {
debug("Testing binding enum with extension disabled");
// Default value is null
if (gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS) === null) {
testPassed("Default value of COMPRESSED_TEXTURE_FORMATS is null");
} else {
testFailed("Default value of COMPRESSED_TEXTURE_FORMATS is not null");
}
}
function checkIsValidFormat(format) {
for (var name in validFormats) {
if (format == validFormats[name]) {
testPassed("supported format " + formatToString(format) + " is valid");
return;
}
}
testFailed("supported format " + formatToString(format) + " is not valid");
}
function formatToString(format) {
for (var p in ext) {
if (ext[p] == format) {
return p;
}
}
return "0x" + format.toString(16);
}
function runTestExtension() {
debug("Testing WEBGL_EXPERIMENTAL_compressed_textures");
// check that all format enums exist.
for (name in validFormats) {
var expected = "0x" + validFormats[name].toString(16);
var actual = "ext['" + name + "']";
shouldBe(actual, expected);
}
supportedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);
// Even if no formats are supported this should return an array.
shouldBeTrue("supportedFormats.length !== undefined");
// check that each format is an allowed format
for (var ii = 0; ii < supportedFormats.length; ++ii) {
checkIsValidFormat(supportedFormats[ii]);
}
// Test each format
for (var ii = 0; ii < supportedFormats.length; ++ii) {
switch (supportedFormats[ii]) {
case ext.COMPRESSED_RGB_S3TC_DXT1_EXT:
testDXT1_RGB();
break;
case ext.COMPRESSED_RGBA_S3TC_DXT1_EXT:
testDXT1_RGBA();
break;
case ext.COMPRESSED_RGBA_S3TC_DXT5_EXT:
testDXT5_RGBA();
break;
case ext.ETC1_RGB8_OES:
testETC1_RGB8();
break;
case ext.COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
testPVRTC_RGB_4BPPV1();
break;
case ext.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
testPVRTC_RGBA_4BPPV1();
break;
}
}
}
function testDXT1_RGB() {
var tests = [
{ width: 4,
height: 4,
channels: 3,
data: img_4x4_rgb_dxt1,
format: ext.COMPRESSED_RGB_S3TC_DXT1_EXT
},
{ width: 8,
height: 8,
channels: 3,
data: img_8x8_rgb_dxt1,
format: ext.COMPRESSED_RGB_S3TC_DXT1_EXT
}
];
testDXTTextures(tests);
}
function testDXT1_RGBA() {
var tests = [
{ width: 4,
height: 4,
channels: 4,
data: img_4x4_rgba_dxt1,
format: ext.COMPRESSED_RGBA_S3TC_DXT1_EXT
},
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_dxt1,
format: ext.COMPRESSED_RGBA_S3TC_DXT1_EXT
}
];
testDXTTextures(tests);
}
function testDXT5_RGBA() {
var tests = [
{ width: 4,
height: 4,
channels: 4,
data: img_4x4_rgba_dxt5,
format: ext.COMPRESSED_RGBA_S3TC_DXT5_EXT
},
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_dxt5,
format: ext.COMPRESSED_RGBA_S3TC_DXT5_EXT
}
];
testDXTTextures(tests);
}
function testETC1_RGB8() {
testFailed("ETC1 test not yet implemented");
}
function testPVRTC_RGB_4BPPV1() {
var tests = [
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_pvrtc4bpp,
format: ext.COMPRESSED_RGB_PVRTC_4BPPV1_IMG
}
];
testPVRTCTextures(tests);
}
function testPVRTC_RGB_4BPPV1() {
var tests = [
{ width: 8,
height: 8,
channels: 4,
data: img_8x8_rgba_pvrtc4bpp,
format: ext.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
}
];
testPVRTCTextures(tests);
}
function testDXTTextures(tests) {
debug("<hr/>");
for (var ii = 0; ii < tests.length; ++ii) {
testDXTTexture(tests[ii]);
}
}
function uncompressDXTBlock(
destBuffer, destX, destY, destWidth, src, srcOffset, format) {
function make565(src, offset) {
return src[offset + 0] + src[offset + 1] * 256;
}
function make8888From565(c) {
return [
Math.floor(((c >> 11) & 0x1F) * 255 / 31),
Math.floor(((c >> 5) & 0x3F) * 255 / 63),
Math.floor(((c >> 0) & 0x1F) * 255 / 31),
255
];
}
function mix(mult, c0, c1, div) {
var r = [];
for (var ii = 0; ii < c0.length; ++ii) {
r[ii] = Math.floor((c0[ii] * mult + c1[ii]) / div);
}
return r;
}
var colorOffset =
srcOffset + ((format == ext.COMPRESSED_RGBA_S3TC_DXT5_EXT) ? 8 : 0);
var color0 = make565(src, colorOffset + 0);
var color1 = make565(src, colorOffset + 2);
var c0gtc1 = color0 > color1 || format == ext.COMPRESSED_RGBA_S3TC_DXT5_EXT;
var rgba0 = make8888From565(color0);
var rgba1 = make8888From565(color1);
var colors = [
rgba0,
rgba1,
c0gtc1 ? mix(2, rgba0, rgba1, 3) : mix(1, rgba0, rgba1, 2),
c0gtc1 ? mix(2, rgba1, rgba0, 3) : [0, 0, 0, 255]
];
// yea I know there is a lot of math in this inner loop.
// so sue me.
for (var yy = 0; yy < 4; ++yy) {
var pixels = src[colorOffset + 4 + yy];
for (var xx = 0; xx < 4; ++xx) {
var dstOff = ((destY + yy) * destWidth + destX + xx) * 4;
var code = (pixels >> (xx * 2)) & 0x3;
var srcColor = colors[code];
var alpha;
switch (format) {
case ext.COMPRESSED_RGB_S3TC_DXT1_EXT:
alpha = 255;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT1_EXT:
alpha = (code == 3 && !c0gtc1) ? 0 : 255;
break;
case ext.COMPRESSED_RGBA_S3TC_DXT5_EXT:
{
var alpha0 = src[srcOffset + 0];
var alpha1 = src[srcOffset + 1];
var alphaOff = Math.floor(yy / 2) * 3 + 2;
var alphaBits =
src[srcOffset + alphaOff + 0] +
src[srcOffset + alphaOff + 1] * 256 +
src[srcOffset + alphaOff + 2] * 65536;
var alphaShift = (yy % 2) * 12 + xx * 3;
var alphaCode = (alphaBits >> alphaShift) & 0x7;
if (alpha0 > alpha1) {
switch (alphaCode) {
case 0:
alpha = alpha0;
break;
case 1:
alpha = alpha1;
break;
default:
alpha = ((8 - alphaCode) * alpha0 + (alphaCode - 1) * alpha1) / 7;
break;
}
} else {
switch (alphaCode) {
case 0:
alpha = alpha0;
break;
case 1:
alpha = alpha1;
break;
case 6:
alpha = 0;
break;
case 7:
alpha = 255;
break;
default:
alpha = ((6 - alphaCode) * alpha0 + (alphaCode - 1) * alpha1) / 5;
break;
}
}
}
break;
default:
throw "bad format";
}
destBuffer[dstOff + 0] = srcColor[0];
destBuffer[dstOff + 1] = srcColor[1];
destBuffer[dstOff + 2] = srcColor[2];
destBuffer[dstOff + 3] = alpha;
}
}
}
function uncompressDXT(width, height, data, format) {
if (width % 4 || height % 4) throw "bad width or height";
var dest = new Uint8Array(width * height * 4);
var blocksAcross = width / 4;
var blocksDown = height / 4;
var blockSize = (format == ext.COMPRESSED_RGBA_S3TC_DXT5_EXT ? 16 : 8);
for (var yy = 0; yy < blocksDown; ++yy) {
for (var xx = 0; xx < blocksAcross; ++xx) {
uncompressDXTBlock(
dest, xx * 4, yy * 4, width, data,
(yy * blocksAcross + xx) * blockSize, format);
}
}
return dest;
}
function testDXTTexture(test) {
var uncompressedData = uncompressDXT(
test.width, test.height, test.data, test.format);
var inner = 4; //test.width == 4 ? 4 : 1
for (var ii = 0; ii < inner; ++ii) {
var width = test.width - ii;
var height = test.height - ii;
canvas.width = width;
canvas.height = height;
gl.viewport(0, 0, width, height);
debug("testing " + formatToString(test.format) + " " +
width + "x" + height);
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
ext.compressedTexImage2D(
gl.TEXTURE_2D, 0, test.format, width, height, 0,
new Uint8Array(test.data));
glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture");
wtu.drawQuad(gl);
compareRect(
width, height, test.channels, test.width, test.height, uncompressedData,
test.data, test.format);
}
gl.compressedTexImage2D(
gl.TEXTURE_2D, 0, test.format, width + 1, height, 0,
new Uint8Array(test.data));
glErrorShouldBe(
gl, gl.INVALID_OPERATION, "data size does not match dimensions");
// TODO: test compressedTexSubImage2D
// TODO: test invalid width, height, xoffset, yoffset
}
function insertImg(element, caption, img) {
var div = document.createElement("div");
div.appendChild(img);
var label = document.createElement("div");
label.appendChild(document.createTextNode(caption));
div.appendChild(label);
element.appendChild(div);
}
function makeImage(imageWidth, imageHeight, dataWidth, data, alpha) {
var scale = 8;
var c = document.createElement("canvas");
c.width = imageWidth * scale;
c.height = imageHeight * scale;
var ctx = c.getContext("2d");
for (var yy = 0; yy < imageWidth; ++yy) {
for (var xx = 0; xx < imageHeight; ++xx) {
var offset = (yy * dataWidth + xx) * 4;
ctx.fillStyle = "rgba(" +
data[offset + 0] + "," +
data[offset + 1] + "," +
data[offset + 2] + "," +
(alpha ? data[offset + 3] / 255 : 1) + ")";
ctx.fillRect(xx * scale, yy * scale, scale, scale);
}
}
var img = document.createElement("img");
img.src = c.toDataURL();
return img;
}
function compareRect(
actualWidth, actualHeight, actualChannels,
dataWidth, dataHeight, expectedData,
testData, testFormat) {
var actual = new Uint8Array(actualWidth * actualHeight * 4);
gl.readPixels(
0, 0, actualWidth, actualHeight, gl.RGBA, gl.UNSIGNED_BYTE, actual);
var div = document.createElement("div");
div.className = "testimages";
insertImg(div, "expected", makeImage(
actualWidth, actualHeight, dataWidth, expectedData,
actualChannels == 4));
insertImg(div, "actual", makeImage(
actualWidth, actualHeight, actualWidth, actual,
actualChannels == 4));
div.appendChild(document.createElement('br'));
document.getElementById("console").appendChild(div);
var failed = false;
for (var yy = 0; yy < actualHeight; ++yy) {
for (var xx = 0; xx < actualWidth; ++xx) {
var actualOffset = (yy * actualWidth + xx) * 4;
var expectedOffset = (yy * dataWidth + xx) * 4;
var expected = [
expectedData[expectedOffset + 0],
expectedData[expectedOffset + 1],
expectedData[expectedOffset + 2],
(actualChannels == 3 ? 255 : expectedData[expectedOffset + 3])
];
for (var jj = 0; jj < 4; ++jj) {
if (actual[actualOffset + jj] != expected[jj]) {
failed = true;
var was = actual[actualOffset + 0].toString();
for (j = 1; j < 4; ++j) {
was += "," + actual[actualOffset + j];
}
testFailed('at (' + xx + ', ' + yy +
') expected: ' + expected + ' was ' + was);
}
}
}
}
if (!failed) {
testPassed("texture rendered correctly");
}
}
function testPVRTCTextures() {
testFailed("PVRTC test not yet implemented");
}
debug("");
successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>

View File

@ -26,44 +26,65 @@ var piConstants = [
"const float k2PI = (kPI * 2.0);"
].join("\n");
var asinImplementation = [
"float asin_impl(float v) {",
" return v + (1.0 / 2.0) * pow(v, 3.0) / 3.0 +",
" ((1.0 * 3.0) / (2.0 * 4.0)) * pow(v, 5.0) / 5.0 +",
" ((1.0 * 3.0 * 5.0) / (2.0 * 4.0 * 6.0)) * pow(v, 7.0) / 7.0 +",
" ((1.0 * 3.0 * 5.0 * 7.0) / (2.0 * 4.0 * 6.0 * 8.0)) * pow(v, 9.0) / 9.0;",
"}"
].join("\n");
var kPI = Math.PI;
var kHalfPI = Math.PI * 0.5;
var k2PI = Math.PI * 2.0;
var acos = Math.acos; // shorthand
GLSLGenerator.runFeatureTest({
GLSLGenerator.runReferenceImageTest({
feature: "acos",
args: "$(type) value",
baseArgs: "value$(field)",
testFunc: "$(func)($(type))",
emuFunc: [
asinImplementation,
"float $(func)_base(float value) {",
" return kHalfPI - asin_impl(value);",
"}"
].join("\n"),
gridRes: 8,
tolerance: 8,
tolerance: 2,
extra: piConstants,
tests: [
["$(output) = vec4(",
" $(func)($(input).x * 0.8) / kPI,",
" $(func)($(input).y * 0.8) / kPI,",
" 0,",
" 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xy * 0.8) / kPI,",
" 0, 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xyz * 0.8) / kPI,",
" 1);"].join("\n"),
["$(output) = ",
" $(func)($(input) * 0.8) / kPI;",
].join("\n")
{
source: ["$(output) = vec4(",
" $(func)($(input).x * 0.8) / kPI,",
" $(func)($(input).y * 0.8) / kPI,",
" 0,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ acos(x * 0.8) / kPI,
acos(y * 0.8) / kPI,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xy * 0.8) / kPI,",
" 0, 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ acos(x * 0.8) / kPI,
acos(y * 0.8) / kPI,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xyz * 0.8) / kPI,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ acos(x * 0.8) / kPI,
acos(y * 0.8) / kPI,
acos(z * 0.8) / kPI,
1 ];
},
},
{
source: ["$(output) = ",
" $(func)($(input) * 0.8) / kPI;",
].join("\n"),
generator: function(x, y, z, w) {
return [ acos(x * 0.8) / kPI,
acos(y * 0.8) / kPI,
acos(z * 0.8) / kPI,
acos(w * 0.8) / kPI ];
},
},
]
});
successfullyParsed = true;

View File

@ -26,44 +26,65 @@ var piConstants = [
"const float k2PI = (kPI * 2.0);"
].join("\n");
var asinImplementation = [
"float asin_impl(float v) {",
" return v + (1.0 / 2.0) * pow(v, 3.0) / 3.0 +",
" ((1.0 * 3.0) / (2.0 * 4.0)) * pow(v, 5.0) / 5.0 +",
" ((1.0 * 3.0 * 5.0) / (2.0 * 4.0 * 6.0)) * pow(v, 7.0) / 7.0 +",
" ((1.0 * 3.0 * 5.0 * 7.0) / (2.0 * 4.0 * 6.0 * 8.0)) * pow(v, 9.0) / 9.0;",
"}"
].join("\n");
var kPI = Math.PI;
var kHalfPI = Math.PI * 0.5;
var k2PI = Math.PI * 2.0;
var asin = Math.asin; // shorthand
GLSLGenerator.runFeatureTest({
GLSLGenerator.runReferenceImageTest({
feature: "asin",
args: "$(type) value",
baseArgs: "value$(field)",
testFunc: "$(func)($(type))",
emuFunc: [
asinImplementation,
"float $(func)_base(float value) {",
" return asin_impl(value);",
"}"
].join("\n"),
gridRes: 8,
tolerance: 2,
extra: piConstants,
tests: [
["$(output) = vec4(",
" $(func)($(input).x * 0.8) / kPI + 0.5,",
" $(func)($(input).y * 0.8) / kPI + 0.5,",
" 0,",
" 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xy * 0.8) / kPI + 0.5,",
" 0, 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xyz * 0.8) / kPI + 0.5,",
" 1);"].join("\n"),
["$(output) = ",
" $(func)($(input) * 0.8) / kPI + 0.5;",
].join("\n")
{
source: ["$(output) = vec4(",
" $(func)($(input).x * 0.8) / kPI + 0.5,",
" $(func)($(input).y * 0.8) / kPI + 0.5,",
" 0,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ asin(x * 0.8) / kPI + 0.5,
asin(y * 0.8) / kPI + 0.5,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xy * 0.8) / kPI + 0.5,",
" 0, 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ asin(x * 0.8) / kPI + 0.5,
asin(y * 0.8) / kPI + 0.5,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xyz * 0.8) / kPI + 0.5,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ asin(x * 0.8) / kPI + 0.5,
asin(y * 0.8) / kPI + 0.5,
asin(z * 0.8) / kPI + 0.5,
1 ];
},
},
{
source: ["$(output) = ",
" $(func)($(input) * 0.8) / kPI + 0.5;",
].join("\n"),
generator: function(x, y, z, w) {
return [ asin(x * 0.8) / kPI + 0.5,
asin(y * 0.8) / kPI + 0.5,
asin(z * 0.8) / kPI + 0.5,
asin(w * 0.8) / kPI + 0.5 ];
},
},
]
});
successfullyParsed = true;

View File

@ -26,75 +26,68 @@ var piConstants = [
"const float k2PI = (kPI * 2.0);"
].join("\n");
var atanImplementation = [
"const float kEpsilon = 0.0001;",
"",
"float atan_impl(float y, float x) {",
" float atan_value = 0.0;",
" float scale = 1.0;",
" float sign = 1.0;",
"",
" if (x > kEpsilon || abs(y) > kEpsilon) {",
" if (x < 0.0 ^^ y < 0.0) {",
" sign = -1.0;",
" }",
"",
" bool y_gt_x = abs(y) < abs(x);",
" float value = y_gt_x ? abs(y / x) : abs(x / y);",
"",
" // Use Taylors series expansion for atan",
" for(int ii = 1; ii < 8; ii += 2) {",
" atan_value += scale * pow(value, float(ii)) / float(ii);",
" scale = -scale;",
" }",
"",
" atan_value = (y_gt_x) ? sign * atan_value : sign * (kHalfPI - atan_value);",
" }",
"",
" if (x < 0.0) {",
" if (y < 0.0) {",
" atan_value -= kHalfPI;",
" } else if (y > 0.0) {",
" atan_value += kHalfPI;",
" }",
" }",
"",
" return atan_value;",
"}"
].join("\n");
var kPI = Math.PI;
var kHalfPI = Math.PI * 0.5;
var k2PI = Math.PI * 2.0;
var atan2 = Math.atan2; // shorthand
GLSLGenerator.runFeatureTest({
GLSLGenerator.runReferenceImageTest({
feature: "atan",
args: "$(type) y, $(type) x",
baseArgs: "y$(field), x$(field)",
testFunc: "$(func)($(type), $(type))",
emuFunc: [
atanImplementation,
"float $(func)_base(float y, float x) {",
" return atan_impl(y, x);",
"}"
].join("\n"),
gridRes: 8,
tolerance: 4,
tolerance: 5,
extra: piConstants,
tests: [
["$(output) = vec4(",
" $(func)($(input).x + 0.1, $(input).y) / k2PI + 0.5,",
" 0,",
" 0,",
" 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xy + vec2(0.1, 0.1), $(input).yx) / ",
" k2PI + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xyz + vec3(0.1, 0.1, 0.1), $(input).yzx) / ",
" k2PI + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
["$(output) = ",
" $(func)($(input) + vec4(0.1, 0.1, 0.1, 0.1), $(input).wzyx) / ",
" k2PI + vec4(0.5, 0.5, 0.5, 0.5);",
].join("\n")
{
source: ["$(output) = vec4(",
" $(func)($(input).x + 0.1, $(input).y) / k2PI + 0.5,",
" 0,",
" 0,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ atan2(x + 0.1, y) / k2PI + 0.5,
0,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xy + vec2(0.1, 0.1), $(input).yx) / ",
" k2PI + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ atan2(x + 0.1, y) / k2PI + 0.5,
atan2(y + 0.1, x) / k2PI + 0.5,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xyz + vec3(0.1, 0.1, 0.1), $(input).yzx) / ",
" k2PI + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ atan2(x + 0.1, y) / k2PI + 0.5,
atan2(y + 0.1, z) / k2PI + 0.5,
atan2(z + 0.1, x) / k2PI + 0.5,
1 ];
},
},
{
source: ["$(output) = ",
" $(func)($(input) + vec4(0.1, 0.1, 0.1, 0.1), $(input).wzyx) / ",
" k2PI + vec4(0.5, 0.5, 0.5, 0.5);",
].join("\n"),
generator: function(x, y, z, w) {
return [ atan2(x + 0.1, w) / k2PI + 0.5,
atan2(y + 0.1, z) / k2PI + 0.5,
atan2(z + 0.1, y) / k2PI + 0.5,
atan2(w + 0.1, x) / k2PI + 0.5 ];
},
},
]
});
successfullyParsed = true;

View File

@ -26,59 +26,65 @@ var piConstants = [
"const float k2PI = (kPI * 2.0);"
].join("\n");
var atanImplementation = [
"float atan_impl(float value) {",
" float atan_value = 0.0;",
" float scale = 1.0;",
" float sign = 1.0;",
"",
" if (value < 0.0) {",
" sign = -1.0;",
" value = -value;",
" }",
"",
" bool value_le_1 = value <= 1.0;",
" value = value_le_1 ? value : 1.0 / value;",
"",
" // Use Taylors series expansion for atan",
" for(int ii = 1; ii < 8; ii += 2) {",
" atan_value += scale * pow(value, float(ii)) / float(ii);",
" scale = -scale;",
" }",
"",
" return value_le_1 ? sign * atan_value : sign * (kHalfPI - atan_value);",
"}",
].join("\n");
var kPI = Math.PI;
var kHalfPI = Math.PI * 0.5;
var k2PI = Math.PI * 2.0;
var atan = Math.atan; // shorthand
GLSLGenerator.runFeatureTest({
GLSLGenerator.runReferenceImageTest({
feature: "atan",
args: "$(type) value",
baseArgs: "value$(field)",
testFunc: "$(func)($(type))",
emuFunc: [
atanImplementation,
"",
"#define $(func)_base(value) atan_impl(value)"
].join("\n"),
gridRes: 8,
tolerance: 4,
extra: piConstants,
tests: [
["$(output) = vec4(",
" $(func)($(input).x * 8.0 - 4.0) / k2PI + 0.5,",
" 0.5,",
" 0,",
" 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xy * 8.0 - vec2(4, 4)) / k2PI + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xyz * 8.0 - vec3(4, 4, 4)) / k2PI + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
["$(output) = ",
" $(func)($(input) * 8.0 - vec4(4, 4, 4, 4)) / k2PI + vec4(0.5, 0.5, 0.5, 0.5);",
].join("\n")
{
source: ["$(output) = vec4(",
" $(func)($(input).x * 8.0 - 4.0) / k2PI + 0.5,",
" 0.5,",
" 0,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ atan(x * 8.0 - 4.0) / k2PI + 0.5,
0.5,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xy * 8.0 - vec2(4, 4)) / k2PI + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ atan(x * 8.0 - 4) / k2PI + 0.5,
atan(y * 8.0 - 4) / k2PI + 0.5,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xyz * 8.0 - vec3(4, 4, 4)) / k2PI + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ atan(x * 8.0 - 4) / k2PI + 0.5,
atan(y * 8.0 - 4) / k2PI + 0.5,
atan(z * 8.0 - 4) / k2PI + 0.5,
1 ];
},
},
{
source: ["$(output) = ",
" $(func)($(input) * 8.0 - vec4(4, 4, 4, 4)) / k2PI + vec4(0.5, 0.5, 0.5, 0.5);",
].join("\n"),
generator: function(x, y, z, w) {
return [ atan(x * 8.0 - 4) / k2PI + 0.5,
atan(y * 8.0 - 4) / k2PI + 0.5,
atan(z * 8.0 - 4) / k2PI + 0.5,
atan(w * 8.0 - 4) / k2PI + 0.5 ];
},
},
]
});
successfullyParsed = true;

View File

@ -26,53 +26,69 @@ var piConstants = [
"const float k2PI = (kPI * 2.0);"
].join("\n");
var sinImplementation = [
"",
"float sin_impl(float value) {",
" value = mod(value + k2PI * 10.0, k2PI);", // only positive values for now
" int quad = int(floor(value / kHalfPI));", // figure out which quad
" float p = mod(value, kHalfPI);", // from 0.0 to PI/2
" if (quad == 1 || quad == 3) { p = kHalfPI - p; }", // backward in quads 1,3
" float c = p - ",
" pow(p, 3.0) / (1.0 * 2.0 * 3.0) + ",
" pow(p, 5.0) / (1.0 * 2.0 * 3.0 * 4.0 * 5.0) - ",
" pow(p, 7.0) / (1.0 * 2.0 * 3.0 * 4.0 * 5.0 * 6.0 * 7.0);",
" if (quad == 2 || quad == 3) { c = -c; }",
" return c;",
"}"
].join('\n');
var kPI = Math.PI;
var kHalfPI = Math.PI * 0.5;
var k2PI = Math.PI * 2.0;
var cos = Math.cos; // shorthand
GLSLGenerator.runFeatureTest({
GLSLGenerator.runReferenceImageTest({
feature: "cos",
args: "$(type) value",
baseArgs: "value$(field)",
testFunc: "$(func)($(type))",
emuFunc: [
sinImplementation,
"float $(func)_base(float value) {",
" return sin_impl(value + kHalfPI);",
"}"
].join("\n"),
gridRes: 8,
tolerance: 2,
extra: piConstants,
tests: [
["$(output) = vec4(",
" $(func)($(input).x * kHalfPI + kHalfPI),",
" $(func)($(input).y * kHalfPI),",
" 0,",
" 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xy * vec2(kPI, k2PI)) * 0.5 + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xyz * vec3(kPI, k2PI, 4.0)) * ",
" 0.5 + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
["$(output) = ",
" $(func)($(input) * vec4(k2PI, 4.0, kHalfPI, kPI)) *",
" 0.5 + vec4(0.5, 0.5, 0.5, 1);",
].join("\n")
{
source: ["$(output) = vec4(",
" $(func)($(input).x * kHalfPI + kHalfPI),",
" $(func)($(input).y * kHalfPI),",
" 0,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ cos(x * kHalfPI + kHalfPI),
cos(y * kHalfPI),
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xy * vec2(kPI, k2PI)) * 0.5 + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ cos(x * kPI) * 0.5 + 0.5,
cos(y * k2PI) * 0.5 + 0.5,
0,
1 ];
},
},
{
// FIXME: for some reason, this test requires a higher tolerance when run in a vertex shader.
source: ["$(output) = vec4(",
" $(func)($(input).xyz * vec3(kPI, k2PI, 4.0)) * ",
" 0.5 + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ cos(x * kPI) * 0.5 + 0.5,
cos(y * k2PI) * 0.5 + 0.5,
cos(z * 4.0) * 0.5 + 0.5,
1 ];
},
tolerance: 7,
},
{
source: ["$(output) = ",
" $(func)($(input) * vec4(k2PI, 4.0, kHalfPI, kPI)) *",
" 0.5 + vec4(0.5, 0.5, 0.5, 1);",
].join("\n"),
generator: function(x, y, z, w) {
return [ cos(x * k2PI) * 0.5 + 0.5,
cos(y * 4.0) * 0.5 + 0.5,
cos(z * kHalfPI) * 0.5 + 0.5,
cos(w * kPI) * 0.5 + 1.0 ];
},
},
]
});
successfullyParsed = true;

View File

@ -26,57 +26,70 @@ var piConstants = [
"const float k2PI = (kPI * 2.0);"
].join("\n");
var sinImplementation = [
"",
"float sin_impl(float value) {",
" value = mod(value + k2PI * 10.0, k2PI);", // only positive values for now
" int quad = int(floor(value / kHalfPI));", // figure out which quad
" float p = mod(value, kHalfPI);", // from 0.0 to PI/2
" if (quad == 1 || quad == 3) { p = kHalfPI - p; }", // backward in quads 1,3
" float c = p - ",
" pow(p, 3.0) / (1.0 * 2.0 * 3.0) + ",
" pow(p, 5.0) / (1.0 * 2.0 * 3.0 * 4.0 * 5.0) - ",
" pow(p, 7.0) / (1.0 * 2.0 * 3.0 * 4.0 * 5.0 * 6.0 * 7.0);",
" if (quad == 2 || quad == 3) { c = -c; }",
" return c;",
"}"
].join('\n');
var kPI = Math.PI;
var kHalfPI = Math.PI * 0.5;
var k2PI = Math.PI * 2.0;
var sin = Math.sin; // shorthand
GLSLGenerator.runFeatureTest({
GLSLGenerator.runReferenceImageTest({
feature: "sin",
args: "$(type) value",
baseArgs: "value$(field)",
testFunc: "$(func)($(type))",
emuFunc: [
sinImplementation,
"float $(func)_base(float value) {",
" return sin_impl(value);",
"}"
].join("\n"),
gridRes: 8,
tolerance: 2,
tolerance: 4,
extra: piConstants,
tests: [
["$(output) = vec4(",
" $(func)($(input).x * kHalfPI + kHalfPI),",
" $(func)($(input).y * kHalfPI),",
" 0,",
" 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xy * vec2(kPI, k2PI)) * 0.5 + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
["$(output) = vec4(",
" $(func)($(input).xyz * vec3(kPI, k2PI, 4.0)) * ",
" 0.5 + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
["$(output) = ",
" $(func)($(input) * vec4(k2PI, 4.0, kHalfPI, kPI)) *",
" 0.5 + vec4(0.5, 0.5, 0.5, 1);",
].join("\n")
{
source: ["$(output) = vec4(",
" $(func)($(input).x * kHalfPI + kHalfPI),",
" $(func)($(input).y * kHalfPI),",
" 0,",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ sin(x * kHalfPI + kHalfPI),
sin(y * kHalfPI),
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xy * vec2(kPI, k2PI)) * 0.5 + vec2(0.5, 0.5),",
" 0, 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ sin(x * kPI) * 0.5 + 0.5,
sin(y * k2PI) * 0.5 + 0.5,
0,
1 ];
},
},
{
source: ["$(output) = vec4(",
" $(func)($(input).xyz * vec3(kPI, k2PI, 4.0)) * ",
" 0.5 + vec3(0.5, 0.5, 0.5),",
" 1);"].join("\n"),
generator: function(x, y, z, w) {
return [ sin(x * kPI) * 0.5 + 0.5,
sin(y * k2PI) * 0.5 + 0.5,
sin(z * 4.0) * 0.5 + 0.5,
1 ];
},
},
{
source: ["$(output) = ",
" $(func)($(input) * vec4(k2PI, 4.0, kHalfPI, kPI)) *",
" 0.5 + vec4(0.5, 0.5, 0.5, 1);",
].join("\n"),
generator: function(x, y, z, w) {
return [ sin(x * k2PI) * 0.5 + 0.5,
sin(y * 4.0) * 0.5 + 0.5,
sin(z * kHalfPI) * 0.5 + 0.5,
sin(w * kPI) * 0.5 + 1 ];
},
},
]
});
successfullyParsed = true;
</script>
</body>
</html>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

View File

@ -9,6 +9,7 @@ found in the LICENSE file.
<meta charset="utf-8">
<title>WebGL GLSL Conformance Tests</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../resources/glsl-feature-tests.css"/>
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/webgl-test-utils.js"></script>
<script src="../../resources/glsl-conformance-test.js"></script>

Some files were not shown because too many files have changed in this diff Show More