mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-28 03:18:41 +00:00
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:
parent
29a8024910
commit
444179b6b6
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
30
content/canvas/test/webgl/conformance/LICENSE_CHROMIUM
Normal file
30
content/canvas/test/webgl/conformance/LICENSE_CHROMIUM
Normal 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.
|
@ -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;
|
||||
|
@ -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");
|
||||
|
||||
|
@ -59,7 +59,7 @@ function go() {
|
||||
|
||||
debug("");
|
||||
|
||||
gl1 = create3DContext(document.getElementById("c"));
|
||||
gl1 = wtu.create3DContext("c");
|
||||
if (!gl1) {
|
||||
finishTest();
|
||||
return;
|
||||
|
@ -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');
|
||||
|
@ -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');
|
||||
|
@ -196,7 +196,6 @@ SAMPLE_COVERAGE_INVERT : 0x80AB,
|
||||
/* TEXTURE_WRAP_S */
|
||||
/* TEXTURE_WRAP_T */
|
||||
|
||||
NUM_COMPRESSED_TEXTURE_FORMATS : 0x86A2,
|
||||
COMPRESSED_TEXTURE_FORMATS : 0x86A3,
|
||||
|
||||
/* HintMode */
|
||||
|
@ -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>
|
@ -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
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
var img_4x4_rgb_dxt1 = [
|
||||
0xe0,0x07,0x00,0xf8,0x11,0x10,0x15,0x00,
|
||||
];
|
@ -1,3 +0,0 @@
|
||||
var img_4x4_rgba_dxt1 = [
|
||||
0xe0,0x07,0x00,0xf8,0x13,0x10,0x15,0x00,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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,
|
||||
];
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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>
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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>
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user