# -*- 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)
