forked from KhronosGroup/WebGL
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Expose bug in SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS workaround. (K…
…hronosGroup#3214) Test case adapted from Shadertoy by Fabrice Neyret. Also added a test of a shader whose compilation was previously broken by this workaround. Regression test for http://crbug.com/1165751 .
- Loading branch information
1 parent
b6fdf0e
commit accfd6e
Showing
2 changed files
with
181 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
179 changes: 179 additions & 0 deletions
179
sdk/tests/conformance/glsl/bugs/vector-matrix-constructor-scalarization.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,179 @@ | ||
<!-- | ||
Copyright (c) 2021 The Khronos Group Inc. | ||
Use of this source code is governed by an MIT-style license that can be | ||
found in the LICENSE.txt file. | ||
--> | ||
|
||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="utf-8"> | ||
<title></title> | ||
<link rel="stylesheet" href="../../../resources/js-test-style.css"/> | ||
<script src="../../../js/js-test-pre.js"></script> | ||
<script src="../../../js/webgl-test-utils.js"></script> | ||
|
||
<!-- | ||
Original Shadertoy: | ||
https://www.shadertoy.com/view/ttGyzh | ||
float a = 0.; // bug | ||
#define A 0. // ok | ||
//#define A min(0.,iTime) // bug | ||
#define r(a) mat2( cos( a + vec4(0,-1.5708,1.5708,0) ) ) // bug | ||
//#define r(a) mat2( cos(a), -sin(a), sin(a), cos(a) ) // no bug | ||
//#define r(a) cos(a),sin(a)) // no bug ( vec instead of mat ) | ||
//#define r(a) cos(a+vec2(0,-1.5708)) // no bug ( vec instead of mat ) | ||
vec2 c; | ||
#define f(U,a) ( c = (U) * r(a) , sin(10.*c.x) ) | ||
void mainImage( out vec4 O, vec2 U ) | ||
{ | ||
U /= iResolution.xy; | ||
O = U.y > .5 | ||
? vec4( f(U,a) , f(U*4.,a) , 0,0) // top | ||
: vec4( f(U,A) , f(U*4.,A) , 0,0); // bottom | ||
} | ||
--> | ||
|
||
<script id="vshader" type="x-shader/x-vertex"> | ||
attribute vec2 aPosition; | ||
attribute vec2 aTexCoord; | ||
|
||
varying vec2 vTexCoord; | ||
|
||
void main(void) { | ||
gl_Position = vec4(aPosition, 0.0, 1.0); | ||
vTexCoord = aTexCoord; | ||
} | ||
</script> | ||
<script id="fshader" type="x-shader/x-fragment"> | ||
precision mediump float; | ||
|
||
varying vec2 vTexCoord; | ||
|
||
float a = 0.; | ||
#define A 0. | ||
|
||
#define r(a) mat2( cos( a + vec4(0,-1.5708,1.5708,0) ) ) | ||
vec2 c; | ||
#define f(U,a) ( c = (U) * r(a) , sin(10.*c.x) ) | ||
|
||
void main() { | ||
vec2 U = vTexCoord; | ||
|
||
gl_FragColor = U.y > .5 | ||
? vec4( f(U,a) , f(U*4.,a) , 0,1.0) // top | ||
: vec4( f(U,A) , f(U*4.,A) , 0,1.0); // bottom | ||
} | ||
</script> | ||
|
||
<script id="compileVShader" type="x-shader/x-vertex"> | ||
varying vec2 v_texcoord; | ||
|
||
void main() { | ||
v_texcoord = vec2(0.0, 0.0); | ||
gl_Position = vec4(1.0, 0.0, 0.0, 1.0); | ||
} | ||
</script> | ||
<script id="compileFShader" type="x-shader/x-fragment"> | ||
// From http://crbug.com/398694 | ||
precision mediump float; | ||
uniform sampler2D s_texture; | ||
uniform vec4 color_weights; | ||
varying vec2 v_texcoord; | ||
void main() { | ||
gl_FragColor = color_weights * mat4( | ||
vec4(texture2D(s_texture, v_texcoord).rgb, 1.0), | ||
vec4(texture2D(s_texture, v_texcoord).rgb, 1.0), | ||
vec4(texture2D(s_texture, v_texcoord).rgb, 1.0), | ||
vec4(texture2D(s_texture, v_texcoord).rgb, 1.0)); | ||
} | ||
</script> | ||
|
||
</head> | ||
<body> | ||
<canvas id="example"></canvas> | ||
<div id="description"></div> | ||
<div id="console"></div> | ||
<script> | ||
"use strict"; | ||
debug(""); | ||
|
||
description("Vector and matrix constructor scalarization workaround (SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS) caused bugs"); | ||
debug('Regression test for <a href="http://crbug.com/1165751">crbug.com/1165751</a>'); | ||
|
||
// Note: Firefox reports that without this workaround, there are | ||
// failures on at least Windows / Intel GPU / OpenGL on: | ||
// conformance/glsl/constructors/glsl-construct-mat2.html | ||
// https://searchfox.org/mozilla-central/source/dom/canvas/WebGLShaderValidator.cpp#63 | ||
|
||
// Chromium reported that | ||
// conformance/glsl/misc/shader-struct-scope.html failed on macOS and | ||
// on Linux AMD without this workaround enabled: | ||
// http://crbug.com/angleproject/701 | ||
|
||
const wtu = WebGLTestUtils; | ||
const canvas = document.getElementById("example"); | ||
const sz = canvas.width = canvas.height = 256; | ||
const gl = wtu.create3DContext(canvas, undefined); | ||
|
||
if (!gl) { | ||
testFailed("WebGL context creation failed"); | ||
finishTest(); | ||
} else { | ||
testPassed("WebGL context creation succeeded"); | ||
runDrawTest(); | ||
runCompileTest(); | ||
finishTest(); | ||
} | ||
|
||
function runDrawTest() { | ||
debug("Ensure that shader translation isn't broken by the vector and matrix constructor scalarization workaround"); | ||
let positionLocation = 0; | ||
let texCoordLocation = 1; | ||
wtu.setupUnitQuad(gl, positionLocation, texCoordLocation); | ||
let program = wtu.setupProgram(gl, ["vshader", "fshader"], | ||
["aPosition", "aTexCoord"], | ||
[positionLocation, texCoordLocation], true); | ||
if (!program) { | ||
testFailed("Error compiling shaders"); | ||
return; | ||
} | ||
gl.useProgram(program); | ||
// Buffers returned from setupQuad above, and ignored, are already bound. | ||
wtu.drawUnitQuad(gl); | ||
|
||
// Top and bottom halves should be equal. Go through one | ||
// horizontal scanline in the middle. | ||
const compareHeight = sz / 4; | ||
let pixelValue = new Uint8Array(4); | ||
let allEqual = true; | ||
const tolerance = 3; | ||
let tempBuf = new Uint8Array(4); | ||
// Step over some pixels to spew slightly fewer comparison messages. | ||
for (let x = 0; x < sz; x += 4) { | ||
gl.readPixels(x, compareHeight, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixelValue); | ||
wtu.checkCanvasRect(gl, x, sz - compareHeight, 1, 1, pixelValue, undefined, tolerance, tempBuf); | ||
} | ||
} | ||
|
||
function runCompileTest() { | ||
debug("Running compilation test"); | ||
let program = wtu.setupProgram(gl, ["compileVShader", "compileFShader"], [], [], true); | ||
if (program) { | ||
testPassed("Shader previously requiring SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS compiled successfully"); | ||
} else { | ||
testFailed("Shader previously requiring SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS failed to compile"); | ||
} | ||
} | ||
|
||
</script> | ||
|
||
</body> | ||
</html> |