Source code
Revision control
Copy as Markdown
Other Tools
<!--
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>Global variable initializer restrictions</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>
<script src="../../../js/glsl-conformance-test.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script id="constGlobalShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
const float c = 1.0;
float f = c;
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="globalShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
float c = 1.0;
float f = c;
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="uniformShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
uniform float u;
float f = u;
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="builtinFunctionShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
float c = 1.0;
float f = sin(c);
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="builtinTextureFunctionShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
uniform sampler2D s;
float f = texture2DLod(s, vec2(0.5, 0.5), 0.0).x;
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="attributeShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
float f = aPosition.x;
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="userDefinedFunctionShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
float foo() {
return 1.0;
}
float f = foo();
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="varyingShader" type="x-shader/x-fragment">
precision mediump float;
varying float v;
float f = v;
void main() {
gl_FragColor = vec4(f);
}
</script>
<script id="globalLValueShader" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
float c = 1.0;
float f = (c = 0.0);
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="globalLValueShader2" type="x-shader/x-vertex">
precision mediump float;
attribute vec4 aPosition;
varying float v;
float c = 1.0;
float f = (c++);
void main() {
v = f;
gl_Position = aPosition;
}
</script>
<script id="globalNonConstTernary" type="x-shader/x-fragment">
precision mediump float;
float green = 1.0;
float black = 0.0;
float f = true ? green : black;
void main() {
gl_FragColor = vec4(0.0, f, 0.0, 1.0);
}
</script>
<script id="globalUniformTernary" type="x-shader/x-fragment">
precision mediump float;
uniform float u_zero;
float green = 1.0 + u_zero;
float f = true ? green : u_zero;
void main() {
gl_FragColor = vec4(0.0, f, 0.0, 1.0);
}
</script>
<script id="globalUniformTernary2" type="x-shader/x-fragment">
precision mediump float;
uniform float u_zero;
float green = 1.0;
float f = (u_zero < 0.1) ? green : 0.0;
void main() {
gl_FragColor = vec4(0.0, f, 0.0, 1.0);
}
</script>
<script id="globalUniformStruct" type="x-shader/x-fragment">
precision mediump float;
struct S {
float zero;
int one;
};
uniform S us;
S s = us;
void main() {
float green = (s.one == 1) ? 1.0 : 0.0;
gl_FragColor = vec4(0.0, green, 0.0, 1.0);
}
</script>
<script id="builtInConstant" type="x-shader/x-fragment">
precision mediump float;
int i = gl_MaxFragmentUniformVectors;
void main() {
float green = (i > 0) ? 1.0 : 0.0;
gl_FragColor = vec4(0.0, green, 0.0, 1.0);
}
</script>
<script id="builtInNonConstant" type="x-shader/x-fragment">
precision mediump float;
vec4 v = gl_FragCoord;
void main() {
gl_FragColor = v;
}
</script>
<script type="application/javascript">
"use strict";
description();
GLSLConformanceTester.runTests([
{
vShaderId: "constGlobalShader",
vShaderSuccess: true,
linkSuccess: true,
passMsg: "A const global in a global variable initializer should be accepted by WebGL."
},
{
vShaderId: "globalShader",
vShaderSuccess: true,
linkSuccess: true,
passMsg: "Another global in a global variable initializer should be accepted by WebGL."
},
{
vShaderId: "uniformShader",
vShaderSuccess: true,
linkSuccess: true,
passMsg: "A uniform in a global variable initializer should be accepted by WebGL."
},
{
vShaderId: "builtinFunctionShader",
vShaderSuccess: true,
linkSuccess: true,
passMsg: "A built-in math function in a global variable initializer should be accepted by WebGL."
},
{
vShaderId: "builtinTextureFunctionShader",
vShaderSuccess: false,
linkSuccess: false,
passMsg: "A texture lookup function in a global variable initializer should not be accepted by WebGL."
},
{
vShaderId: "attributeShader",
vShaderSuccess: false,
linkSuccess: false,
passMsg: "An attribute in a global variable initializer should not be accepted by WebGL."
},
{
vShaderId: "userDefinedFunctionShader",
vShaderSuccess: false,
linkSuccess: false,
passMsg: "A user-defined function call in a global variable initializer should not be accepted by WebGL."
},
{
vShaderId: "constGlobalShader",
vShaderSuccess: true,
fShaderId: "varyingShader",
fShaderSuccess: false,
linkSuccess: false,
passMsg: "A varying in a global variable initializer should not be accepted by WebGL."
},
{
vShaderId: "globalLValueShader",
vShaderSuccess: false,
linkSuccess: false,
passMsg: "Another global as an l-value in a global variable initializer should not be accepted by WebGL."
},
{
vShaderId: "globalLValueShader2",
vShaderSuccess: false,
linkSuccess: false,
passMsg: "Another global as an l-value (parameter of ++) in a global variable initializer should not be accepted by WebGL."
},
{
fShaderId: "globalNonConstTernary",
fShaderSuccess: true,
linkSuccess: true,
render: true,
passMsg: "Non-const global variables as operands for a ternary operator in a global variable initializer should be accepted by WebGL."
},
{
fShaderId: "globalUniformTernary",
fShaderSuccess: true,
linkSuccess: true,
render: true,
passMsg: "A uniform as the second operand for a ternary operator in a global variable initializer should be accepted by WebGL."
},
{
fShaderId: "globalUniformTernary2",
fShaderSuccess: true,
linkSuccess: true,
render: true,
passMsg: "Referencing a uniform inside the first operand for a ternary operator in a global variable initializer should be accepted by WebGL."
},
{
fShaderId: "globalUniformStruct",
fShaderSuccess: true,
linkSuccess: true,
render: true,
uniforms: [
{ name: 'us.one', functionName: 'uniform1i', value: 1 }
],
passMsg: "A global struct initialized with a uniform struct should be accepted by WebGL."
},
{
fShaderId: "builtInConstant",
fShaderSuccess: true,
linkSuccess: true,
render: true,
passMsg: "Referencing a built-in constant in a global variable initializer should be accepted by WebGL."
},
{
fShaderId: "builtInNonConstant",
fShaderSuccess: false,
linkSuccess: false,
passMsg: "Referencing a built-in non-constant in a global variable initializer should not be accepted by WebGL."
}
]);
var successfullyParsed = true;
</script>
</body>
</html>