189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#! /usr/bin/python2 29076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 39076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef type_has_size(type_): 49076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return type_[-1:].isdigit() 59076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 69076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef type_sizes(type_): 79076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_.endswith("8"): 89076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return [8] 99076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott elif type_.endswith("16"): 109076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return [16] 119076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott elif type_.endswith("32"): 129076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return [32] 139076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott elif type_.endswith("64"): 149076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return [64] 159076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott else: 169076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return [32, 64] 179076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 189076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef type_add_size(type_, size): 199076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_has_size(type_): 209076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return type_ 219076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return type_ + str(size) 229076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 239076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef get_const_field(type_): 249076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "int32": 25084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "i32" 269076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "uint32": 27084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "u32" 289076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "int64": 29084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "i64" 309076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "uint64": 31084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "u64" 329076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "bool32": 33084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "u32" 349076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "float32": 35084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "f32" 369076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott if type_ == "float64": 37084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga return "f64" 389076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott raise Exception(str(type_)) 399076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott assert(0) 409076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 4189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandtemplate = """\ 4289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/* 4389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Copyright (C) 2014 Intel Corporation 4489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 4589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 4689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * copy of this software and associated documentation files (the "Software"), 4789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * to deal in the Software without restriction, including without limitation 4889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 4989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 5089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Software is furnished to do so, subject to the following conditions: 5189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 5289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The above copyright notice and this permission notice (including the next 5389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 5489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Software. 5589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 5689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 5789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 5889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 5989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 6089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 6189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 6289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * IN THE SOFTWARE. 6389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 6489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Authors: 6589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Jason Ekstrand (jason@jlekstrand.net) 6689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 6789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 6889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#include <math.h> 6989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#include "main/core.h" 70dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner#include "util/rounding.h" /* for _mesa_roundeven */ 71183db3a64557d5d231ef58ab5666286f323ff333Rob Clark#include "util/half_float.h" 7289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#include "nir_constant_expressions.h" 7389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 7489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 7589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of packSnorm4x8. 7689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 7789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint8_t 7889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_snorm_1x8(float x) 7989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 8089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL 4.30 spec: 8189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 8289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packSnorm4x8 8389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * ------------ 8489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for component c of v to fixed point is done as 8589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * follows: 8689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 8789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packSnorm4x8: round(clamp(c, -1, +1) * 127.0) 8889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 8989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * We must first cast the float to an int, because casting a negative 9089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * float to a uint is undefined. 9189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 92dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner return (uint8_t) (int) 93dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner _mesa_roundevenf(CLAMP(x, -1.0f, +1.0f) * 127.0f); 9489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 9589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 9689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 9789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of packSnorm2x16. 9889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 9989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint16_t 10089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_snorm_1x16(float x) 10189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 10289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL ES 3.00 spec: 10389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 10489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packSnorm2x16 10589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * ------------- 10689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for component c of v to fixed point is done as 10789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * follows: 10889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 10989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packSnorm2x16: round(clamp(c, -1, +1) * 32767.0) 11089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 11189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * We must first cast the float to an int, because casting a negative 11289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * float to a uint is undefined. 11389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 114dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner return (uint16_t) (int) 115dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner _mesa_roundevenf(CLAMP(x, -1.0f, +1.0f) * 32767.0f); 11689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 11789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 11889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 11989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackSnorm4x8. 12089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 12189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float 12289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_snorm_1x8(uint8_t u) 12389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 12489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL 4.30 spec: 12589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 12689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackSnorm4x8 12789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * -------------- 12889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for unpacked fixed-point value f to floating point is 12989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * done as follows: 13089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 13189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackSnorm4x8: clamp(f / 127.0, -1, +1) 13289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 13389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return CLAMP((int8_t) u / 127.0f, -1.0f, +1.0f); 13489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 13589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 13689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 13789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackSnorm2x16. 13889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 13989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float 14089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_snorm_1x16(uint16_t u) 14189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 14289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL ES 3.00 spec: 14389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 14489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackSnorm2x16 14589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * --------------- 14689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for unpacked fixed-point value f to floating point is 14789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * done as follows: 14889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 14989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackSnorm2x16: clamp(f / 32767.0, -1, +1) 15089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 15189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return CLAMP((int16_t) u / 32767.0f, -1.0f, +1.0f); 15289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 15389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 15489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 15589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component packUnorm4x8. 15689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 15789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint8_t 15889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_unorm_1x8(float x) 15989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 16089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL 4.30 spec: 16189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 16289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packUnorm4x8 16389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * ------------ 16489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for component c of v to fixed point is done as 16589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * follows: 16689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 16789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packUnorm4x8: round(clamp(c, 0, +1) * 255.0) 16889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 169dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner return (uint8_t) (int) 170dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner _mesa_roundevenf(CLAMP(x, 0.0f, 1.0f) * 255.0f); 17189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 17289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 17389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 17489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component packUnorm2x16. 17589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 17689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint16_t 17789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_unorm_1x16(float x) 17889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 17989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL ES 3.00 spec: 18089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 18189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packUnorm2x16 18289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * ------------- 18389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for component c of v to fixed point is done as 18489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * follows: 18589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 18689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) 18789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 188dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner return (uint16_t) (int) 189dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner _mesa_roundevenf(CLAMP(x, 0.0f, 1.0f) * 65535.0f); 19089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 19189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 19289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 19389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackUnorm4x8. 19489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 19589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float 19689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_unorm_1x8(uint8_t u) 19789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 19889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL 4.30 spec: 19989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 20089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackUnorm4x8 20189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * -------------- 20289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for unpacked fixed-point value f to floating point is 20389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * done as follows: 20489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 20589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackUnorm4x8: f / 255.0 20689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 20789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return (float) u / 255.0f; 20889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 20989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 21089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 21189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackUnorm2x16. 21289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 21389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float 21489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_unorm_1x16(uint16_t u) 21589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 21689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand /* From section 8.4 of the GLSL ES 3.00 spec: 21789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 21889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackUnorm2x16 21989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * --------------- 22089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The conversion for unpacked fixed-point value f to floating point is 22189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * done as follows: 22289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * 22389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * unpackUnorm2x16: f / 65535.0 22489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 22589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return (float) u / 65535.0f; 22689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 22789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 22889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 22989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of packHalf2x16. 23089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 23189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint16_t 23289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_half_1x16(float x) 23389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 23489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return _mesa_float_to_half(x); 23589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 23689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 23789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/** 23889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackHalf2x16. 23989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */ 24089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float 24189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_half_1x16(uint16_t u) 24289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 24389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return _mesa_half_to_float(u); 24489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 24589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 24689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/* Some typed vector structures to make things like src0.y work */ 2479076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbotttypedef float float32_t; 2489076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbotttypedef double float64_t; 2499076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbotttypedef bool bool32_t; 2509076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott% for type in ["float", "int", "uint"]: 2519076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott% for width in [32, 64]: 2529076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottstruct ${type}${width}_vec { 2539076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${type}${width}_t x; 2549076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${type}${width}_t y; 2559076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${type}${width}_t z; 2569076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${type}${width}_t w; 25789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}; 25889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% endfor 2599076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott% endfor 2609076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 2619076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottstruct bool32_vec { 2629076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott bool x; 2639076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott bool y; 2649076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott bool z; 2659076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott bool w; 2669076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott}; 26789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 26889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% for name, op in sorted(opcodes.iteritems()): 26989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic nir_const_value 2703c7066c1ed1b9f004813995d9a097a083a8bf4d0Ian Romanickevaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size, 2713c7066c1ed1b9f004813995d9a097a083a8bf4d0Ian Romanick MAYBE_UNUSED nir_const_value *_src) 27289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 27315e553daf0cd5fe70994b6ac5377ff11002357a3Jason Ekstrand nir_const_value _dst_val = { {0, } }; 27489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 2759076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott switch (bit_size) { 2769076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % for bit_size in [32, 64]: 2779076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott case ${bit_size}: { 2789076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott <% 2799076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott output_type = type_add_size(op.output_type, bit_size) 2809076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott input_types = [type_add_size(type_, bit_size) for type_ in op.input_types] 2819076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott %> 2829076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 2839076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## For each non-per-component input, create a variable srcN that 2849076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## contains x, y, z, and w elements which are filled in with the 2859076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## appropriately-typed values. 2869076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % for j in range(op.num_inputs): 2879076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if op.input_sizes[j] == 0: 2889076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott <% continue %> 2899076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % elif "src" + str(j) not in op.const_expr: 2909076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Avoid unused variable warnings 2919076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott <% continue %> 2929076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott %endif 29389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 294ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick const struct ${input_types[j]}_vec src${j} = { 2959076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % for k in range(op.input_sizes[j]): 2969076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if input_types[j] == "bool32": 297084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga _src[${j}].u32[${k}] != 0, 29889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % else: 2999076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott _src[${j}].${get_const_field(input_types[j])}[${k}], 30089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % endif 30189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % endfor 3024300693a078ee29e2be3c05dc0c9383b571786d0Ian Romanick % for k in range(op.input_sizes[j], 4): 3034300693a078ee29e2be3c05dc0c9383b571786d0Ian Romanick 0, 3044300693a078ee29e2be3c05dc0c9383b571786d0Ian Romanick % endfor 3059076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott }; 3069076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endfor 3079076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 3089076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if op.output_size == 0: 3099076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## For per-component instructions, we need to iterate over the 3109076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## components and apply the constant expression one component 3119076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## at a time. 3129076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott for (unsigned _i = 0; _i < num_components; _i++) { 3139076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## For each per-component input, create a variable srcN that 3149076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## contains the value of the current (_i'th) component. 3159076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % for j in range(op.num_inputs): 3169076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if op.input_sizes[j] != 0: 3179076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott <% continue %> 3189076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % elif "src" + str(j) not in op.const_expr: 3199076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Avoid unused variable warnings 3209076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott <% continue %> 3219076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % elif input_types[j] == "bool32": 322ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick const bool src${j} = _src[${j}].u32[_i] != 0; 3239076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % else: 324ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick const ${input_types[j]}_t src${j} = 3259076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott _src[${j}].${get_const_field(input_types[j])}[_i]; 3269076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endif 3279076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endfor 3289076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 3299076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Create an appropriately-typed variable dst and assign the 3309076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## result of the const_expr to it. If const_expr already contains 3319076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## writes to dst, just include const_expr directly. 3329076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if "dst" in op.const_expr: 3339076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${output_type}_t dst; 334ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick 3359076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${op.const_expr} 3369076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % else: 3379076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ${output_type}_t dst = ${op.const_expr}; 3389076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endif 3399076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 3409076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Store the current component of the actual destination to the 3419076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## value of dst. 3429076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if output_type == "bool32": 3439076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Sanitize the C value to a proper NIR bool 344084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE; 3459076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % else: 3469076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott _dst_val.${get_const_field(output_type)}[_i] = dst; 3479076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endif 3489076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott } 3499076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % else: 3509076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## In the non-per-component case, create a struct dst with 3519076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## appropriately-typed elements x, y, z, and w and assign the result 3529076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## of the const_expr to all components of dst, or include the 3539076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## const_expr directly if it writes to dst already. 3549076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott struct ${output_type}_vec dst; 35589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 35689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % if "dst" in op.const_expr: 35789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand ${op.const_expr} 35889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % else: 3599076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Splat the value to all components. This way expressions which 3609076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## write the same value to all components don't need to explicitly 3619076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## write to dest. One such example is fnoise which has a 3629076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## const_expr of 0.0f. 3639076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott dst.x = dst.y = dst.z = dst.w = ${op.const_expr}; 36489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % endif 36589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 3669076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## For each component in the destination, copy the value of dst to 3679076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## the actual destination. 3689076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % for k in range(op.output_size): 3699076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % if output_type == "bool32": 3709076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott ## Sanitize the C value to a proper NIR bool 371084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga _dst_val.u32[${k}] = dst.${"xyzw"[k]} ? NIR_TRUE : NIR_FALSE; 3729076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % else: 3739076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott _dst_val.${get_const_field(output_type)}[${k}] = dst.${"xyzw"[k]}; 3749076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endif 3759076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endfor 37689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand % endif 37789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 3789076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott break; 3799076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott } 3809076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott % endfor 3819076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott 3829076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott default: 3839076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott unreachable("unknown bit width"); 3849076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott } 38589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 38689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand return _dst_val; 38789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand} 38889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% endfor 38989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 39089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandnir_const_value 39189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandnir_eval_const_opcode(nir_op op, unsigned num_components, 3929076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott unsigned bit_width, nir_const_value *src) 39389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{ 39489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand switch (op) { 39589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% for name in sorted(opcodes.iterkeys()): 396ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick case nir_op_${name}: 3979076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott return evaluate_${name}(num_components, bit_width, src); 39889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% endfor 39989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand default: 40089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand unreachable("shouldn't get here"); 40189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand } 40289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}""" 40389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 40489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandfrom nir_opcodes import opcodes 40589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandfrom mako.template import Template 40689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand 4079076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottprint Template(template).render(opcodes=opcodes, type_sizes=type_sizes, 4089076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott type_has_size=type_has_size, 4099076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott type_add_size=type_add_size, 4109076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott get_const_field=get_const_field) 411