blob: dc4bf17feee0ff1c90210b3f582d6eff059183f0 [file] [log] [blame]
<!--
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>WebGL GLSL Conformance Tests - Non Reserved Words</title>
<link rel="stylesheet" href="../../../../webgl_test_files/resources/js-test-style.css"/>
<link rel="stylesheet" href="../../../../webgl_test_files/resources/glsl-feature-tests.css"/>
<script src="../../../../webgl_test_files/js/js-test-pre.js"></script>
<script src="../../../../webgl_test_files/js/webgl-test-utils.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script id="vertexShader0" type="text/something-not-javascript">
struct $replaceMe {
vec4 $replaceMe;
};
struct Foo {
$replaceMe $replaceMe;
};
attribute vec4 position;
void main()
{
Foo f;
f.$replaceMe.$replaceMe = position;
gl_Position = f.$replaceMe.$replaceMe;
}
</script>
<script id="fragmentShader0" type="text/something-not-javascript">
precision mediump float;
vec4 $replaceMe() {
return vec4(0,1,0,1);
}
void main()
{
gl_FragColor = $replaceMe();
}
</script>
<script id="vertexShader1" type="text/something-not-javascript">
attribute vec4 $replaceMe;
void main()
{
gl_Position = $replaceMe;
}
</script>
<script id="fragmentShader1" type="text/something-not-javascript">
precision mediump float;
vec4 foo(vec4 $replaceMe) {
return $replaceMe;
}
void main()
{
gl_FragColor = foo(vec4(1,0,1,1));
}
</script>
<script id="vertexShader2" type="text/something-not-javascript">
varying vec4 $replaceMe;
attribute vec4 position;
void main()
{
gl_Position = position;
$replaceMe = position;
}
</script>
<script id="fragmentShader2" type="text/something-not-javascript">
precision mediump float;
varying vec4 $replaceMe;
void main()
{
gl_FragColor = $replaceMe;
}
</script>
<script id="vertexShader3" type="text/something-not-javascript">
attribute vec4 position;
void main()
{
gl_Position = position;
}
</script>
<script id="fragmentShader3" type="text/something-not-javascript">
precision mediump float;
uniform vec4 $replaceMe;
void main()
{
gl_FragColor = $replaceMe;
}
</script>
<script>
"use strict";
var MetalWords = [
"alignas",
"alignof",
"as_type",
"and",
"auto",
"catch",
"char",
"const_cast",
"constant",
"constexpr",
"decltype",
"delete",
"device",
"dynamic_cast",
"explicit",
"export",
"fragment",
"friend",
"int16_t",
"int32_t",
"int64_t",
"int8_t",
"kernel",
"main0",
"metal",
"mutable",
"new",
"noexcept",
"nullptr_t",
"nullptr",
"operator",
"override",
"or",
"private",
"protected",
"ptrdiff_t",
"ray_data",
"register",
"signed",
"size_t",
"stage_in",
"static_assert",
"static_cast",
"thread_local",
"thread",
"threadgroup_imageblock",
"threadgroup",
"throw",
"try",
"typeid",
"typename",
"uchar",
"uint16_t",
"uint32_t",
"uint64_t",
"uint8_t",
"ushort",
"vertex",
"virtual",
"wchar_t",
"xor",
"NAN",
"INFINITY",
"Pragma",
"_Pragma",
"ANGLE_1",
"INT_MAX",
];
description();
var wtu = WebGLTestUtils;
var gl = wtu.create3DContext();
var sources = [];
for (var ii = 0; ii < 4; ++ii) {
var vsrc = document.getElementById("vertexShader" + ii).text;
var fsrc = document.getElementById("fragmentShader" + ii).text;
sources.push({vsrc: vsrc, fsrc: fsrc});
}
var badWordNdx = 0;
var listNdx = 0;
function testNextWord() {
var list = MetalWords;
if (listNdx >= list.length) {
finishTest();
return;
}
testWord(list[listNdx]);
++listNdx;
setTimeout(testNextWord, 0);
}
testNextWord();
function testWord(word) {
debug("");
debug("testing: " + word);
sources.forEach(src => {
var vs = src.vsrc.replace(/\$replaceMe/g, word);
var fs = src.fsrc.replace(/\$replaceMe/g, word);
var success = true;
var program = wtu.loadProgram(gl, vs, fs, function(msg) {
debug(msg);
success = false;
}, true);
if (success) {
testPassed("shader with: '" + word + "' compiled");
} else {
testFailed("shader with: '" + word + "' failed to compile");
}
if (program) {
gl.deleteProgram(program);
}
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no GL errors");
});
}
var successfullyParsed = true;
</script>
</body>
</html>