blob: 4849d8d1d5d7dbe5691e817cc2d19cef8b12e8df [file] [log] [blame]
<!--
Copyright (c) 2019 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="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../../resources/glsl-feature-tests.css"/>
<script src="../../../js/js-test-pre.js"></script>
<script src="../../../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 DXWords = [
"Buffer",
"double",
"uint",
"half",
"dword",
"string",
"texture",
"pixelshader",
"vertexshader",
"switch",
"min16float",
"min10float",
"min16int",
"min12int",
"min16uint",
"vector",
"matrix",
"float2",
"float3",
"float4",
"float1x1",
"float1x2",
"float1x3",
"float1x4",
"float2x1",
"float2x2",
"float2x3",
"float2x4",
"float3x1",
"float3x2",
"float3x3",
"float3x4",
"float4x1",
"float4x2",
"float4x3",
"float4x4",
"int1x1",
"int1x2",
"int1x3",
"int1x4",
"int2x1",
"int2x2",
"int2x3",
"int2x4",
"int3x1",
"int3x2",
"int3x3",
"int3x4",
"int4x1",
"int4x2",
"int4x3",
"int4x4",
"double1x1",
"double1x2",
"double1x3",
"double1x4",
"double2x1",
"double2x2",
"double2x3",
"double2x4",
"double3x1",
"double3x2",
"double3x3",
"double3x4",
"double4x1",
"double4x2",
"double4x3",
"double4x4",
"abort",
"abs",
"acos",
"all",
"AllMemoryBarrier",
"AllMemoryBarrierWithGroupSync",
"any",
"asdouble",
"asfloat",
"asin",
"asint",
"asint",
"asuint",
"asuint",
"atan",
"atan2",
"ceil",
"clamp",
"clip",
"cos",
"cosh",
"countbits",
"cross",
"D3DCOLORtoUBYTE4",
"ddx",
"ddx_coarse",
"ddx_fine",
"ddy",
"ddy_coarse",
"ddy_fine",
"degrees",
"determinant",
"DeviceMemoryBarrier",
"DeviceMemoryBarrierWithGroupSync",
"distance",
"dot",
"dst",
"errorf",
"EvaluateAttributeAtCentroid",
"EvaluateAttributeAtSample",
"EvaluateAttributeSnapped",
"exp",
"exp2",
"f16tof32",
"f32tof16",
"faceforward",
"firstbithigh",
"firstbitlow",
"floor",
"fma",
"fmod",
"frac",
"frexp",
"fwidth",
"GetRenderTargetSampleCount",
"GetRenderTargetSamplePosition",
"GroupMemoryBarrier",
"GroupMemoryBarrierWithGroupSync",
"InterlockedAdd",
"InterlockedAnd",
"InterlockedCompareExchange",
"InterlockedCompareStore",
"InterlockedExchange",
"InterlockedMax",
"InterlockedMin",
"InterlockedOr",
"InterlockedXor",
"isfinite",
"isinf",
"isnan",
"ldexp",
"length",
"lerp",
"lit",
"log",
"log10",
"log2",
"mad",
"max",
"min",
"modf",
"msad4",
"mul",
"noise",
"normalize",
"pow",
"printf",
"Process2DQuadTessFactorsAvg",
"Process2DQuadTessFactorsMax",
"Process2DQuadTessFactorsMin",
"ProcessIsolineTessFactors",
"ProcessQuadTessFactorsAvg",
"ProcessQuadTessFactorsMax",
"ProcessQuadTessFactorsMin",
"ProcessTriTessFactorsAvg",
"ProcessTriTessFactorsMax",
"ProcessTriTessFactorsMin",
"radians",
"rcp",
"reflect",
"refract",
"reversebits",
"round",
"rsqrt",
"saturate",
"sign",
"sin",
"sincos",
"sinh",
"smoothstep",
"sqrt",
"step",
"tan",
"tanh",
"tex1D",
"tex1D",
"tex1Dbias",
"tex1Dgrad",
"tex1Dlod",
"tex1Dproj",
"tex2D",
"tex2D",
"tex2Dbias",
"tex2Dgrad",
"tex2Dlod",
"tex2Dproj",
"tex3D",
"tex3D",
"tex3Dbias",
"tex3Dgrad",
"tex3Dlod",
"tex3Dproj",
"texCUBE",
"texCUBE",
"texCUBEbias",
"texCUBEgrad",
"texCUBElod",
"texCUBEproj",
"transpose",
"trunc"
];
var GLSL_4_20_11_words = [
"attribute",
"const",
"uniform",
"varying",
"coherent",
"volatile",
"restrict",
"readonly",
"writeonly",
"atomic_uint",
"layout",
"centroid",
"flat",
"smooth",
"noperspective",
"patch",
"sample",
"break",
"continue",
"do",
"for",
"while",
"switch",
"case",
"default",
"if",
"else",
"subroutine",
"in",
"out",
"inout",
"float",
"double",
"int",
"void",
"bool",
"true",
"false",
"invariant",
"discard",
"return",
"mat2",
"mat3",
"mat4",
"dmat2",
"dmat3",
"dmat4",
"mat2x2",
"mat2x3",
"mat2x4",
"dmat2x2",
"dmat2x3",
"dmat2x4",
"mat3x2",
"mat3x3",
"mat3x4",
"dmat3x2",
"dmat3x3",
"dmat3x4",
"mat4x2",
"mat4x3",
"mat4x4",
"dmat4x2",
"dmat4x3",
"dmat4x4",
"vec2",
"vec3",
"vec4",
"ivec2",
"ivec3",
"ivec4",
"bvec2",
"bvec3",
"bvec4",
"dvec2",
"dvec3",
"dvec4",
"uint",
"uvec2",
"uvec3",
"uvec4",
"lowp",
"mediump",
"highp",
"precision",
"sampler1D",
"sampler2D",
"sampler3D",
"samplerCube",
"sampler1DShadow",
"sampler2DShadow",
"samplerCubeShadow",
"sampler1DArray",
"sampler2DArray",
"sampler1DArrayShadow",
"sampler2DArrayShadow",
"isampler1D",
"isampler2D",
"isampler3D",
"isamplerCube",
"isampler1DArray",
"isampler2DArray",
"usampler1D",
"usampler2D",
"usampler3D",
"usamplerCube",
"usampler1DArray",
"usampler2DArray",
"sampler2DRect",
"sampler2DRectShadow",
"isampler2DRect",
"usampler2DRect",
"samplerBuffer",
"isamplerBuffer",
"usamplerBuffer",
"sampler2DMS",
"isampler2DMS",
"usampler2DMS",
"sampler2DMSArray",
"isampler2DMSArray",
"usampler2DMSArray",
"samplerCubeArray",
"samplerCubeArrayShadow",
"isamplerCubeArray",
"usamplerCubeArray",
"image1D",
"iimage1D",
"uimage1D",
"image2D",
"iimage2D",
"uimage2D",
"image3D",
"iimage3D",
"uimage3D",
"image2DRect",
"iimage2DRect",
"uimage2DRect",
"imageCube",
"iimageCube",
"uimageCube",
"imageBuffer",
"iimageBuffer",
"uimageBuffer",
"image1DArray",
"iimage1DArray",
"uimage1DArray",
"image2DArray",
"iimage2DArray",
"uimage2DArray",
"imageCubeArray",
"iimageCubeArray",
"uimageCubeArray",
"image2DMS",
"iimage2DMS",
"uimage2DMS",
"image2DMSArray",
"iimage2DMSArray",
"uimage2DMSArray",
"struct"
];
var GLSL_4_20_11_future_words = [
"common",
"partition",
"active",
"asm",
"class",
"union",
"enum",
"typedef",
"template",
"this",
"packed",
"resource",
"goto",
"inline",
"noinline",
"public",
"static",
"extern",
"external",
"interface",
"long",
"short",
"half",
"fixed",
"unsigned",
"superp",
"input",
"output",
"hvec2",
"hvec3",
"hvec4",
"fvec2",
"fvec3",
"fvec4",
"sampler3DRect",
"filter",
"sizeof",
"cast",
"namespace",
"using",
"row_major"
];
var GLSL_1_0_17_words = [
"attribute",
"const",
"uniform",
"varying",
"break",
"continue",
"do",
"for",
"while",
"if",
"else",
"in",
"out",
"inout",
"float",
"int",
"void",
"bool",
"true",
"false",
"lowp",
"mediump",
"highp",
"precision",
"invariant",
"discard",
"return",
"mat2",
"mat3",
"mat4",
"vec2",
"vec3",
"vec4",
"ivec2",
"ivec3",
"ivec4",
"bvec2",
"bvec3",
"bvec4",
"sampler2D",
"samplerCube",
"struct"
]
var GLSL_1_0_17_FutureWords = [
"asm",
"class",
"union",
"enum",
"typedef",
"template",
"this",
"packed",
"goto",
"switch",
"default",
"inline",
"noinline",
"volatile",
"public",
"static",
"extern",
"external",
"interface",
"flat",
"long",
"short",
"double",
"half",
"fixed",
"unsigned",
"superp",
"input",
"output",
"hvec2",
"hvec3",
"hvec4",
"dvec2",
"dvec3",
"dvec4",
"fvec2",
"fvec3",
"fvec4",
"sampler1D",
"sampler3D",
"sampler1DShadow",
"sampler2DShadow",
"sampler2DRect",
"sampler3DRect",
"sampler2DRectShadow",
"sizeof",
"cast",
"namespace",
"using"
];
description();
var wtu = WebGLTestUtils;
var gl = wtu.create3DContext();
var badWords = [
{ words: DXWords },
{ words: GLSL_4_20_11_words, },
{ words: GLSL_4_20_11_future_words, }
];
var reservedWordsLists = [
GLSL_1_0_17_words,
GLSL_1_0_17_FutureWords
];
var reservedWords = { };
for (var ii = 0; ii < reservedWordsLists.length; ++ii) {
var list = reservedWordsLists[ii];
for (var jj = 0; jj < list.length; ++jj) {
reservedWords[list[jj]] = true;
}
}
var checkedWords = {};
var src = [];
for (var ii = 0; ii < 4; ++ii) {
var vsrc = document.getElementById("vertexShader" + ii).text;
var fsrc = document.getElementById("fragmentShader" + ii).text;
src.push({vsrc: vsrc, fsrc: fsrc});
}
var badWordNdx = 0;
var listNdx = 0;
function testNextWord() {
var list = badWords[badWordNdx].words;
if (listNdx >= list.length) {
++badWordNdx;
if (badWordNdx >= badWords.length) {
finishTest();
return;
}
listNdx = 0;
list = badWords[badWordNdx].words;
}
testWord(list[listNdx]);
++listNdx;
setTimeout(testNextWord, 0);
}
testNextWord();
function testWord(word) {
if (word in reservedWords || word in checkedWords) {
return;
}
checkedWords[word] = true;
debug("");
debug("testing: " + word);
for (var ii = 0; ii < src.length; ++ii) {
var vs = src[ii].vsrc.replace(/\$replaceMe/g, word);
var fs = src[ii].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>