1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2017 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport random
24e5c31af7Sopenharmony_cifrom genutil import *
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_cirandom.seed(0x1234)
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_ciDATA_TYPES	= ["float", "vec4"]
29e5c31af7Sopenharmony_ciARRAY_SIZES	= [16, 32, 64, 128]
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_cis_largeArrayCaseTemplate = """
32e5c31af7Sopenharmony_cicase ${{NAME}}
33e5c31af7Sopenharmony_ci	version 300 es
34e5c31af7Sopenharmony_ci	values
35e5c31af7Sopenharmony_ci	{
36e5c31af7Sopenharmony_ci		${{VALUES}}
37e5c31af7Sopenharmony_ci	}
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_ci	both ""
40e5c31af7Sopenharmony_ci		#version 300 es
41e5c31af7Sopenharmony_ci		precision mediump float;
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ci		${DECLARATIONS}
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ci		void main()
46e5c31af7Sopenharmony_ci		{
47e5c31af7Sopenharmony_ci			${{ARRAY_DECL}}
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_ci			${SETUP}
50e5c31af7Sopenharmony_ci			${{OP}}
51e5c31af7Sopenharmony_ci			${OUTPUT}
52e5c31af7Sopenharmony_ci		}
53e5c31af7Sopenharmony_ci	""
54e5c31af7Sopenharmony_ciend
55e5c31af7Sopenharmony_ci"""[1:]
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ciclass LargeConstantArrayCase(ShaderCase):
59e5c31af7Sopenharmony_ci	def __init__(self, name, array, inputs, outputs):
60e5c31af7Sopenharmony_ci		self.name	= name
61e5c31af7Sopenharmony_ci		self.array	= array
62e5c31af7Sopenharmony_ci		self.inputs	= inputs
63e5c31af7Sopenharmony_ci		self.outputs	= outputs
64e5c31af7Sopenharmony_ci		self.op		= "out0 = array[in0];"
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_ci	def __str__(self):
67e5c31af7Sopenharmony_ci		params = {
68e5c31af7Sopenharmony_ci			"NAME":		self.name,
69e5c31af7Sopenharmony_ci			"VALUES":	genValues(self.inputs, self.outputs),
70e5c31af7Sopenharmony_ci			"ARRAY_DECL":	self.array,
71e5c31af7Sopenharmony_ci			"OP":		self.op
72e5c31af7Sopenharmony_ci		}
73e5c31af7Sopenharmony_ci		return fillTemplate(s_largeArrayCaseTemplate, params)
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_cidef genArray(dataType, size):
77e5c31af7Sopenharmony_ci	elements = []
78e5c31af7Sopenharmony_ci	for i in xrange(size):
79e5c31af7Sopenharmony_ci		if dataType == "float":
80e5c31af7Sopenharmony_ci		    elements.append(Scalar(round(random.uniform(-1.0, 1.0), 6)))
81e5c31af7Sopenharmony_ci		if dataType == "vec4":
82e5c31af7Sopenharmony_ci		    elements.append(Vec4(*[round(random.uniform(-1.0, 1.0), 6) for x in range(4)]))
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_ci	return elements
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_cidef arrayToString(elements):
88e5c31af7Sopenharmony_ci	array = ('const {TYPE} array[{LENGTH}] = {TYPE}[](\n'
89e5c31af7Sopenharmony_ci		.format(TYPE=elements[0].typeString(), LENGTH=len(elements)))
90e5c31af7Sopenharmony_ci
91e5c31af7Sopenharmony_ci	array += "\n".join(str(e) + ',' for e in elements[:-1])
92e5c31af7Sopenharmony_ci	array += "\n" + str(elements[-1])
93e5c31af7Sopenharmony_ci	array += ");"
94e5c31af7Sopenharmony_ci
95e5c31af7Sopenharmony_ci	return array
96e5c31af7Sopenharmony_ci
97e5c31af7Sopenharmony_ciallCases = []
98e5c31af7Sopenharmony_cilargeConstantArrayCases = []
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_cifor dataType in DATA_TYPES:
101e5c31af7Sopenharmony_ci	for arraySize in ARRAY_SIZES:
102e5c31af7Sopenharmony_ci		indexes = random.sample(range(arraySize-1), 10)
103e5c31af7Sopenharmony_ci		array = genArray(dataType, arraySize)
104e5c31af7Sopenharmony_ci		outputs = [array[index] for index in indexes]
105e5c31af7Sopenharmony_ci		outType = outputs[0].typeString()
106e5c31af7Sopenharmony_ci		caseName = "%s_%s" % (dataType, arraySize)
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_ci		case = LargeConstantArrayCase(caseName,
109e5c31af7Sopenharmony_ci					      arrayToString(array),
110e5c31af7Sopenharmony_ci					      [("int in0", indexes)],
111e5c31af7Sopenharmony_ci					      [("%s out0" % outType, outputs)])
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_ci		largeConstantArrayCases.append(case)
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ciallCases.append(CaseGroup("indexing", "Large constant array indexing", largeConstantArrayCases))
116e5c31af7Sopenharmony_ci
117e5c31af7Sopenharmony_ciif __name__ == "__main__":
118e5c31af7Sopenharmony_ci	print("Generating shader case files.")
119e5c31af7Sopenharmony_ci	writeAllCases("large_constant_arrays.test", allCases)
120