# -*- coding: utf-8 -*- #------------------------------------------------------------------------- # drawElements Quality Program utilities # -------------------------------------- # # Copyright 2017 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. # #------------------------------------------------------------------------- import random from genutil import * random.seed(0x1234) DATA_TYPES = ["float", "vec4"] ARRAY_SIZES = [16, 32, 64, 128] s_largeArrayCaseTemplate = """ case ${{NAME}} version 300 es values { ${{VALUES}} } both "" #version 300 es precision mediump float; ${DECLARATIONS} void main() { ${{ARRAY_DECL}} ${SETUP} ${{OP}} ${OUTPUT} } "" end """[1:] class LargeConstantArrayCase(ShaderCase): def __init__(self, name, array, inputs, outputs): self.name = name self.array = array self.inputs = inputs self.outputs = outputs self.op = "out0 = array[in0];" def __str__(self): params = { "NAME": self.name, "VALUES": genValues(self.inputs, self.outputs), "ARRAY_DECL": self.array, "OP": self.op } return fillTemplate(s_largeArrayCaseTemplate, params) def genArray(dataType, size): elements = [] for i in xrange(size): if dataType == "float": elements.append(Scalar(round(random.uniform(-1.0, 1.0), 6))) if dataType == "vec4": elements.append(Vec4(*[round(random.uniform(-1.0, 1.0), 6) for x in range(4)])) return elements def arrayToString(elements): array = ('const {TYPE} array[{LENGTH}] = {TYPE}[](\n' .format(TYPE=elements[0].typeString(), LENGTH=len(elements))) array += "\n".join(str(e) + ',' for e in elements[:-1]) array += "\n" + str(elements[-1]) array += ");" return array allCases = [] largeConstantArrayCases = [] for dataType in DATA_TYPES: for arraySize in ARRAY_SIZES: indexes = random.sample(range(arraySize-1), 10) array = genArray(dataType, arraySize) outputs = [array[index] for index in indexes] outType = outputs[0].typeString() caseName = "%s_%s" % (dataType, arraySize) case = LargeConstantArrayCase(caseName, arrayToString(array), [("int in0", indexes)], [("%s out0" % outType, outputs)]) largeConstantArrayCases.append(case) allCases.append(CaseGroup("indexing", "Large constant array indexing", largeConstantArrayCases)) if __name__ == "__main__": print("Generating shader case files.") writeAllCases("large_constant_arrays.test", allCases)