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