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