You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
911 lines
19 KiB
911 lines
19 KiB
# -*- coding: utf-8 -*-
|
|
|
|
#-------------------------------------------------------------------------
|
|
# drawElements Quality Program utilities
|
|
# --------------------------------------
|
|
#
|
|
# Copyright 2015 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
#-------------------------------------------------------------------------
|
|
|
|
from genutil import *
|
|
|
|
allCases = []
|
|
|
|
VERTEX = "VERTEX"
|
|
FRAGMENT = "FRAGMENT"
|
|
|
|
CASE_FRAGMENT_SHADER_TEMPLATE = """
|
|
case ${{NAME}}
|
|
version 300 es
|
|
expect ${{EXPECT}}
|
|
|
|
vertex ""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
in vec4 a_pos;
|
|
|
|
void main()
|
|
{
|
|
gl_Position = a_pos;
|
|
}
|
|
""
|
|
|
|
fragment ""
|
|
${{SOURCE}}
|
|
""
|
|
end"""[1:]
|
|
|
|
CASE_VERTEX_SHADER_TEMPLATE = """
|
|
case ${{NAME}}
|
|
version 300 es
|
|
expect ${{EXPECT}}
|
|
|
|
vertex ""
|
|
${{SOURCE}}
|
|
""
|
|
|
|
fragment ""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
layout(location=0) out vec4 o_color;
|
|
|
|
void main()
|
|
{
|
|
o_color = vec4(1.0);
|
|
}
|
|
""
|
|
end"""[1:]
|
|
|
|
class UniformBlockCase(ShaderCase):
|
|
def __init__(self, name, shaderType, source, valid):
|
|
self.name = name
|
|
self.shaderType = shaderType
|
|
self.source = source
|
|
self.valid = valid
|
|
|
|
def __str__(self):
|
|
if self.shaderType == FRAGMENT:
|
|
sourceParams = {
|
|
"OUTPUT": "o_color",
|
|
"OUTPUT_DECLARATION": "layout(location=0) out vec4 o_color;"
|
|
}
|
|
|
|
source = fillTemplate(self.source, sourceParams)
|
|
|
|
testCaseParams = {
|
|
"NAME": self.name,
|
|
"SOURCE": source,
|
|
"EXPECT": ("build_successful" if self.valid else "compile_fail")
|
|
}
|
|
|
|
return fillTemplate(CASE_FRAGMENT_SHADER_TEMPLATE, testCaseParams)
|
|
elif self.shaderType == VERTEX:
|
|
sourceParams = {
|
|
"OUTPUT": "gl_Position",
|
|
"OUTPUT_DECLARATION": ""
|
|
}
|
|
|
|
source = fillTemplate(self.source, sourceParams)
|
|
|
|
testCaseParams = {
|
|
"NAME": self.name,
|
|
"SOURCE": source,
|
|
"EXPECT": ("build_successful" if self.valid else "compile_fail")
|
|
}
|
|
|
|
return fillTemplate(CASE_VERTEX_SHADER_TEMPLATE, testCaseParams)
|
|
|
|
assert False
|
|
|
|
def createCases(name, source, valid):
|
|
return [UniformBlockCase(name + "_vertex", VERTEX, source, valid),
|
|
UniformBlockCase(name + "_fragment", FRAGMENT, source, valid)]
|
|
|
|
repeatShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
uniform vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
layoutQualifierShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
layout(%s) uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
layoutGlobalQualifierShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
layout(%s) uniform;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
layoutMemberQualifierShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
layout(%s) mat4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember[0];
|
|
}"""[1:]
|
|
|
|
layoutMemberVec4QualifierShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
layout(%s) vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
noInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
};
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformMember;
|
|
}"""[1:]
|
|
|
|
sameVariableAndInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
vec4 uniformBlock = vec4(0.0);
|
|
${{OUTPUT}} = uniformBlock;
|
|
}"""[1:]
|
|
|
|
sameVariableAndBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
vec4 UniformBlock = vec4(0.0);
|
|
${{OUTPUT}} = UniformBlock + uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
repeatedBlockShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlockA;
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlockB;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlockA.uniformMember + uniformBlockB.uniformMember;
|
|
}"""[1:]
|
|
|
|
repeatedBlockNoInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
};
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember + uniformMember;
|
|
}"""[1:]
|
|
|
|
structMemberShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
struct Struct
|
|
{
|
|
vec4 uniformMember;
|
|
};
|
|
|
|
uniform UniformBlock
|
|
{
|
|
Struct st;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.st.uniformMember;
|
|
}"""[1:]
|
|
|
|
layoutStructMemberQualifierShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
struct Struct
|
|
{
|
|
vec4 uniformMember;
|
|
};
|
|
|
|
uniform UniformBlock
|
|
{
|
|
layout(%s) Struct st;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.st.uniformMember;
|
|
}"""[1:]
|
|
|
|
longIdentifierBlockNameShaderTemplate = ("""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
// Total of 1024 characters
|
|
uniform """ + ("a" * 1024) + """
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}""")[1:]
|
|
|
|
longIdentifierInstanceNameShaderTemplate = ("""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} """ + ("a" * 1024) + """;
|
|
// Total of 1024 characters
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = """ + ("a" * 1024) + """.uniformMember;
|
|
}""")[1:]
|
|
|
|
underscoreIdentifierInstanceNameShaderTemplate = ("""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} _;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = _.uniformMember;
|
|
}""")[1:]
|
|
|
|
underscoreIdentifierBlockNameShaderTemplate = ("""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform _
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}""")[1:]
|
|
|
|
validCases = (createCases("repeat_interface_qualifier", repeatShaderTemplate, True)
|
|
+ sum([createCases("layout_%s" % qualifier, layoutQualifierShaderTemplate % qualifier, True)
|
|
for qualifier in ["shared", "packed", "std140", "row_major", "column_major"]], [])
|
|
+ createCases("layout_all", layoutQualifierShaderTemplate % "shared, packed, std140, row_major, column_major", True)
|
|
+ createCases("layout_all_8_times", layoutQualifierShaderTemplate % str.join(", ", ["shared", "packed", "std140", "row_major", "column_major"] * 8), True)
|
|
+ sum([createCases("global_layout_%s" % qualifier, layoutGlobalQualifierShaderTemplate % qualifier, True)
|
|
for qualifier in ["shared", "packed", "std140", "row_major", "column_major"]], [])
|
|
+ createCases("global_layout_all", layoutGlobalQualifierShaderTemplate % "shared, packed, std140, row_major, column_major", True)
|
|
+ createCases("global_layout_all_8_times", layoutGlobalQualifierShaderTemplate % str.join(", ", ["shared", "packed", "std140", "row_major", "column_major"] * 8), True)
|
|
+ sum([createCases("member_layout_%s" % qualifier, layoutMemberQualifierShaderTemplate % qualifier, True)
|
|
for qualifier in ["row_major", "column_major"]], [])
|
|
+ sum([createCases("member_layout_%s_vec4" % qualifier, layoutMemberVec4QualifierShaderTemplate % qualifier, True)
|
|
for qualifier in ["row_major", "column_major"]], [])
|
|
+ createCases("member_layout_all", layoutMemberQualifierShaderTemplate % "row_major, column_major", True)
|
|
+ createCases("member_layout_all_8_times", layoutMemberQualifierShaderTemplate % str.join(", ", ["row_major", "column_major"] * 8), True)
|
|
+ createCases("no_instance_name", noInstanceNameShaderTemplate, True)
|
|
+ createCases("same_variable_and_block_name", sameVariableAndBlockNameShaderTemplate, True)
|
|
+ createCases("same_variable_and_instance_name", sameVariableAndInstanceNameShaderTemplate, True)
|
|
+ createCases("struct_member", structMemberShaderTemplate, True)
|
|
+ sum([createCases("struct_member_layout_%s" % qualifier, layoutStructMemberQualifierShaderTemplate % qualifier, True)
|
|
for qualifier in ["row_major", "column_major"]], [])
|
|
+ createCases("struct_member_layout_all", layoutStructMemberQualifierShaderTemplate % "row_major, column_major", True)
|
|
+ createCases("struct_member_layout_all_8_times", layoutStructMemberQualifierShaderTemplate % str.join(", ", ["row_major", "column_major"] * 8), True)
|
|
+ createCases("long_block_name", longIdentifierBlockNameShaderTemplate, True)
|
|
+ createCases("long_instance_name", longIdentifierInstanceNameShaderTemplate, True)
|
|
+ createCases("underscore_block_name", underscoreIdentifierBlockNameShaderTemplate, True)
|
|
+ createCases("underscore_instance_name", underscoreIdentifierInstanceNameShaderTemplate, True))
|
|
|
|
invalidMemberInterfaceQualifierShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
%s vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
conflictingInstanceNamesShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlockA
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
uniform UniformBlockB
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
conflictingFunctionAndInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
float uniformBlock (float x)
|
|
{
|
|
return x;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
conflictingFunctionAndBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
float UniformBlock (float x)
|
|
{
|
|
return x;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
conflictingVariableAndInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
%s vec4 uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
conflictingVariableAndBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
%s vec4 UniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
|
|
matchingInstanceAndBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} UniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = UniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
referenceUsingBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = UniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
emptyBlockShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = vec4(0.0);
|
|
}"""[1:]
|
|
|
|
emptyLayoutShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
layout() uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
emptyGlobalLayoutShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
layout() uniform;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
emptyMemberLayoutShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
layout() vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidMemberLayoutShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
layout(%s) vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
structureDefinitionShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
struct A
|
|
{
|
|
vec4 uniformMember;
|
|
} a;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.a.uniformMember;
|
|
}"""[1:]
|
|
|
|
samplerShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
sampler2D sampler;
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
missingBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidNumberBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform 0UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidHashBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform #UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidDollarBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform $UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidIdentifierBlockNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform gl_UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
tooLongIdentifierBlockNameShaderTemplate = ("""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
// Total of 1025 characters
|
|
uniform """ + ("a" * 1025) + """
|
|
{
|
|
vec4 uniformMember;
|
|
} uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = uniformBlock.uniformMember;
|
|
}""")[1:]
|
|
|
|
invalidNumberInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformInstance
|
|
{
|
|
vec4 uniformMember;
|
|
} 0uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = 0uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidHashInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformInstance
|
|
{
|
|
vec4 uniformMember;
|
|
} #uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = #uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidDollarInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformInstance
|
|
{
|
|
vec4 uniformMember;
|
|
} $uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = $uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
invalidIdentifierInstanceNameShaderTemplate = """
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} gl_uniformBlock;
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = gl_uniformBlock.uniformMember;
|
|
}"""[1:]
|
|
|
|
tooLongIdentifierInstanceNameShaderTemplate = ("""
|
|
#version 300 es
|
|
precision highp float;
|
|
|
|
${{OUTPUT_DECLARATION}}
|
|
|
|
uniform UniformBlock
|
|
{
|
|
vec4 uniformMember;
|
|
} """ + ("a" * 1025) + """;
|
|
// Total of 1025 characters
|
|
|
|
void main()
|
|
{
|
|
${{OUTPUT}} = """ + ("a" * 1025) + """.uniformMember;
|
|
}""")[1:]
|
|
|
|
invalidCases = (
|
|
sum([createCases("member_%s_interface_qualifier" % qualifier, invalidMemberInterfaceQualifierShaderTemplate % qualifier, False)
|
|
for qualifier in ["in", "out", "buffer", "attribute", "varying"]], [])
|
|
+ createCases("conflicting_instance_names", conflictingInstanceNamesShaderTemplate, False)
|
|
+ createCases("conflicting_function_and_instance_name", conflictingFunctionAndInstanceNameShaderTemplate, False)
|
|
+ createCases("conflicting_function_and_block_name", conflictingFunctionAndBlockNameShaderTemplate, False)
|
|
+ sum([createCases("conflicting_%s_and_instance_name" % qualifier, conflictingVariableAndInstanceNameShaderTemplate % qualifier, False)
|
|
for qualifier in ["uniform", "in", "out"]], [])
|
|
+ sum([createCases("conflicting_%s_and_block_name" % qualifier, conflictingVariableAndBlockNameShaderTemplate % qualifier, False)
|
|
for qualifier in ["uniform", "in", "out"]], [])
|
|
+ createCases("matching_instance_and_block_name", matchingInstanceAndBlockNameShaderTemplate, False)
|
|
+ createCases("reference_using_block_name", referenceUsingBlockNameShaderTemplate, False)
|
|
+ createCases("empty_block", emptyBlockShaderTemplate, False)
|
|
+ createCases("empty_layout", emptyLayoutShaderTemplate, False)
|
|
+ createCases("empty_member_layout", emptyMemberLayoutShaderTemplate, False)
|
|
+ createCases("empty_global_layout", emptyGlobalLayoutShaderTemplate, False)
|
|
+ createCases("structure_definition", structureDefinitionShaderTemplate, False)
|
|
+ sum([createCases("member_layout_%s" % qualifier, invalidMemberLayoutShaderTemplate % qualifier, False)
|
|
for qualifier in ["shared", "packed", "std140"]], [])
|
|
+ createCases("missing_block_name", missingBlockNameShaderTemplate, False)
|
|
+ createCases("invalid_number_block_name", invalidNumberBlockNameShaderTemplate, False)
|
|
+ createCases("invalid_hash_block_name", invalidHashBlockNameShaderTemplate, False)
|
|
+ createCases("invalid_dollar_block_name", invalidDollarBlockNameShaderTemplate, False)
|
|
+ createCases("invalid_identifier_block_name", invalidIdentifierBlockNameShaderTemplate, False)
|
|
+ createCases("too_long_block_name", tooLongIdentifierBlockNameShaderTemplate, False)
|
|
+ createCases("invalid_number_instance_name", invalidNumberInstanceNameShaderTemplate, False)
|
|
+ createCases("invalid_hash_instance_name", invalidDollarInstanceNameShaderTemplate, False)
|
|
+ createCases("invalid_dollar_instance_name", invalidDollarInstanceNameShaderTemplate, False)
|
|
+ createCases("invalid_identifier_instance_name", invalidIdentifierInstanceNameShaderTemplate, False)
|
|
+ createCases("repeated_block", repeatedBlockShaderTemplate, False)
|
|
+ createCases("repeated_block_no_instance_name", repeatedBlockNoInstanceNameShaderTemplate, False)
|
|
)
|
|
|
|
allCases.append(CaseGroup("valid", "Valid uniform interface block syntax tests.", validCases))
|
|
allCases.append(CaseGroup("invalid", "Invalid uniform interface block syntax tests.", invalidCases))
|
|
|
|
if __name__ == "__main__":
|
|
print("Generating shader case files.")
|
|
writeAllCases("uniform_block.test", allCases)
|