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.
Don't generate INVALID_VALUE in shaderSource. (KhronosGroup#3206)
- Loading branch information
Showing
2 changed files
with
143 additions
and
152 deletions.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,138 +1,116 @@ | ||
<!-- | ||
Copyright (c) 2020 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>Character Set</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> | ||
<script src="../../../js/glsl-conformance-test.js"></script> | ||
</head> | ||
<body> | ||
|
||
<script id="fs-invalid-0" type="x-shader/x-fragment"> | ||
precision mediump float; | ||
$ | ||
void main() { | ||
gl_FragColor = vec4(1, 0, 0, 1); | ||
} | ||
</script> | ||
|
||
<script id="fs-invalid-1" type="x-shader/x-fragment"> | ||
precision mediump float; | ||
一些注释 | ||
void main() { | ||
gl_FragColor = vec4(1, 0, 0, 1); | ||
} | ||
</script> | ||
|
||
<script id="fs-invalid-2" type="x-shader/x-fragment"> | ||
precision mediump float; | ||
#if defined(NOT_DEFINED_FOO) | ||
一些注释 | ||
#endif | ||
void main() { | ||
gl_FragColor = vec4(1, 0, 0, 1); | ||
} | ||
</script> | ||
|
||
<script id="fs-comment-valid" type="x-shader/x-fragment"> | ||
precision mediump float; | ||
// some comment: asdf1234~!@#$%^&*()-=[];',./{}:"?><_+ | ||
// some comment: 一些注释 (╯‵□′)╯︵┻━┻ | ||
// some comment: \\\\\\\\\ | ||
// some comment: \n\\r\n | ||
void main() { | ||
gl_FragColor = vec4(1, 0, 0, 1); | ||
} | ||
</script> | ||
|
||
<script id="fs-cleared-by-preprocessing-valid" type="x-shader/x-fragment"> | ||
precision mediump float; | ||
#if defined(GL_GOOGLE_cpp_style_line_directive) | ||
#line 9 "foo.txt" | ||
#endif | ||
void main() { | ||
gl_FragColor = vec4(1, 0, 0, 1); | ||
} | ||
</script> | ||
|
||
<div id="description"></div> | ||
<div id="console"></div> | ||
<canvas id="canvas" width="2" height="2"> </canvas> | ||
<script> | ||
"use strict"; | ||
// See http://crbug.com/1108588 for original failing case. | ||
// Check "OpenGL Registry The OpenGL ES Shading Language" | ||
// Section 3.2 Character Sets For more info | ||
description("This test checks character set validation for glsl."); | ||
|
||
debug(""); | ||
debug("Canvas.getContext"); | ||
|
||
let wtu = WebGLTestUtils; | ||
let gl = wtu.create3DContext("canvas"); | ||
let consoleDiv = document.getElementById("console"); | ||
if (!gl) { | ||
testFailed("context does not exist"); | ||
} else { | ||
testPassed("context exists"); | ||
|
||
debug(""); | ||
debug("Checking shader character set validation and compilation"); | ||
|
||
runTest(); | ||
} | ||
|
||
function testShaderSource(shaderId, expected, msg) { | ||
let shaderSource = document.getElementById(shaderId).text; | ||
if (!quietMode()) { | ||
wtu.addShaderSource(consoleDiv, "test fragment shader", shaderSource); | ||
} | ||
|
||
let shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
if (shader == null) { | ||
testFailed("*** Error: unable to create shader '" + shaderSource + "'"); | ||
return; | ||
} | ||
|
||
gl.shaderSource(shader, shaderSource); | ||
wtu.glErrorShouldBe(gl, expected, msg); | ||
} | ||
|
||
function runTest() { | ||
|
||
testShaderSource('fs-invalid-0', gl.INVALID_VALUE, 'Unallowed characters detected'); | ||
testShaderSource('fs-invalid-1', gl.INVALID_VALUE, 'Unallowed characters detected'); | ||
testShaderSource('fs-invalid-2', gl.INVALID_VALUE, 'Non ASCII characters detected that would be cleared by preprocessing step is still invalid'); | ||
|
||
GLSLConformanceTester.runTests([ | ||
{ | ||
fShaderId: 'fs-comment-valid', | ||
fShaderSuccess: true, | ||
linkSuccess: true, | ||
passMsg: 'Unallowed characters and UTF-8 characters in comment are valid' | ||
}, | ||
{ | ||
fShaderId: 'fs-cleared-by-preprocessing-valid', | ||
fShaderSuccess: true, | ||
linkSuccess: true, | ||
passMsg: 'Unsupported shader extensions (with invalid ASCII characters) cleared by preprocessing step is valid' | ||
}, | ||
]); | ||
} | ||
|
||
debug(""); | ||
var successfullyParsed = true; | ||
|
||
</script> | ||
<script src="../../../js/js-test-post.js"></script> | ||
|
||
</body> | ||
</html> | ||
<!-- | ||
Copyright (c) 2020 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>Character Set</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> | ||
<script src="../../../js/glsl-conformance-test.js"></script> | ||
</head> | ||
<body> | ||
|
||
<div id="description"></div> | ||
<div id="console"></div> | ||
<canvas id="canvas" width="2" height="2"> </canvas> | ||
<script> | ||
"use strict"; | ||
// See http://crbug.com/1108588 for original failing case. | ||
// Check "OpenGL Registry The OpenGL ES Shading Language" | ||
// Section 3.2 Character Sets For more info | ||
description("This test checks character set validation for glsl."); | ||
|
||
debug(""); | ||
debug("Canvas.getContext"); | ||
|
||
let wtu = WebGLTestUtils; | ||
let gl = wtu.create3DContext("canvas"); | ||
let consoleDiv = document.getElementById("console"); | ||
if (!gl) { | ||
testFailed("context does not exist"); | ||
} else { | ||
testPassed("context exists"); | ||
|
||
debug(""); | ||
debug("Checking shader character set validation and compilation"); | ||
|
||
runTest(); | ||
} | ||
|
||
function testShaderSource(shaderSource, msg) { | ||
if (!quietMode()) { | ||
wtu.addShaderSource(consoleDiv, "test fragment shader", shaderSource); | ||
} | ||
|
||
let shader = gl.createShader(gl.FRAGMENT_SHADER); | ||
if (shader == null) { | ||
testFailed("*** Error: unable to create shader '" + shaderSource + "'"); | ||
return; | ||
} | ||
|
||
gl.shaderSource(shader, shaderSource); | ||
wtu.glErrorShouldBe(gl, gl.NO_ERROR, msg); | ||
} | ||
|
||
function MUST(ifTruthy) { | ||
return ifTruthy ? 'MUST' : 'MUST NOT'; | ||
} | ||
|
||
function runTest() { | ||
|
||
const BAD_STRINGS = [ | ||
'$', | ||
'"', | ||
'一些注释', | ||
'#line 42 "foo.glsl"', | ||
]; | ||
const TESTS = [ | ||
['in identifier', s => s, false], | ||
['in comment', s => `// ${s}`, true, true], | ||
['in ifdef-out', s => `#if 0 \n${s} \n#endif`, true], | ||
['in ifdef-out #preproc', s => `#if 0 \n#${s} \n#endif`, true], | ||
['in #preproc', s => `#${s}`, false], | ||
]; | ||
|
||
const glsl_tests = []; | ||
|
||
for (const s of BAD_STRINGS) { | ||
for (const [where, template, validCompile] of TESTS) { | ||
const st = template(s); | ||
const src = ` | ||
precision mediump float; | ||
${st} | ||
void main() { | ||
gl_FragColor = vec4(1, 0, 0, 1); | ||
}`.trim(); | ||
|
||
testShaderSource(src, `shaderSource allows Out-of-charset string '${s}' ${where} until compilation.`); | ||
|
||
glsl_tests.push( | ||
{ | ||
fShaderSource: src, | ||
fShaderSuccess: validCompile, | ||
linkSuccess: validCompile, | ||
passMsg: `Out-of-charset string '${s}' ${where} ${MUST(validCompile)} compile.` | ||
} | ||
); | ||
} | ||
} | ||
|
||
GLSLConformanceTester.runTests(glsl_tests); | ||
} | ||
|
||
debug(""); | ||
var successfullyParsed = true; | ||
|
||
</script> | ||
<script src="../../../js/js-test-post.js"></script> | ||
|
||
</body> | ||
</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