From f32d16a9f060225d24eed5c248da4639c126b88d Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 4 Sep 2015 18:39:57 -0700 Subject: [PATCH] nir/spirv: Use the actual GLSL 450 extension header from Khronos --- src/glsl/nir/spirv_glsl450.h | 130 ++++++++++++++ src/glsl/nir/spirv_glsl450_to_nir.c | 259 ++++++++-------------------- 2 files changed, 206 insertions(+), 183 deletions(-) create mode 100644 src/glsl/nir/spirv_glsl450.h diff --git a/src/glsl/nir/spirv_glsl450.h b/src/glsl/nir/spirv_glsl450.h new file mode 100644 index 00000000000..d828b152f43 --- /dev/null +++ b/src/glsl/nir/spirv_glsl450.h @@ -0,0 +1,130 @@ +/* +** Copyright (c) 2014-2015 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a copy +** of this software and/or associated documentation files (the "Materials"), +** to deal in the Materials without restriction, including without limitation +** the rights to use, copy, modify, merge, publish, distribute, sublicense, +** and/or sell copies of the Materials, and to permit persons to whom the +** Materials are furnished to do so, subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in +** all copies or substantial portions of the Materials. +** +** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +** IN THE MATERIALS. +*/ + +#ifndef GLSLstd450_H +#define GLSLstd450_H + +const int GLSLstd450Version = 99; +const int GLSLstd450Revision = 2; + +enum GLSLstd450 { + GLSLstd450Bad = 0, // Don't use + + GLSLstd450Round = 1, + GLSLstd450RoundEven = 2, + GLSLstd450Trunc = 3, + GLSLstd450FAbs = 4, + GLSLstd450SAbs = 5, + GLSLstd450FSign = 6, + GLSLstd450SSign = 7, + GLSLstd450Floor = 8, + GLSLstd450Ceil = 9, + GLSLstd450Fract = 10, + + GLSLstd450Radians = 11, + GLSLstd450Degrees = 12, + GLSLstd450Sin = 13, + GLSLstd450Cos = 14, + GLSLstd450Tan = 15, + GLSLstd450Asin = 16, + GLSLstd450Acos = 17, + GLSLstd450Atan = 18, + GLSLstd450Sinh = 19, + GLSLstd450Cosh = 20, + GLSLstd450Tanh = 21, + GLSLstd450Asinh = 22, + GLSLstd450Acosh = 23, + GLSLstd450Atanh = 24, + GLSLstd450Atan2 = 25, + + GLSLstd450Pow = 26, + GLSLstd450Exp = 27, + GLSLstd450Log = 28, + GLSLstd450Exp2 = 29, + GLSLstd450Log2 = 30, + GLSLstd450Sqrt = 31, + GLSLstd450InverseSqrt = 32, + + GLSLstd450Determinant = 33, + GLSLstd450MatrixInverse = 34, + + GLSLstd450Modf = 35, // second operand needs an OpVariable to write to + GLSLstd450ModfStruct = 36, // no OpVariable operand + GLSLstd450FMin = 37, + GLSLstd450UMin = 38, + GLSLstd450SMin = 39, + GLSLstd450FMax = 40, + GLSLstd450UMax = 41, + GLSLstd450SMax = 42, + GLSLstd450FClamp = 43, + GLSLstd450UClamp = 44, + GLSLstd450SClamp = 45, + GLSLstd450Mix = 46, + GLSLstd450Step = 47, + GLSLstd450SmoothStep = 48, + + GLSLstd450Fma = 49, + GLSLstd450Frexp = 50, // second operand needs an OpVariable to write to + GLSLstd450FrexpStruct = 51, // no OpVariable operand + GLSLstd450Ldexp = 52, + + GLSLstd450PackSnorm4x8 = 53, + GLSLstd450PackUnorm4x8 = 54, + GLSLstd450PackSnorm2x16 = 55, + GLSLstd450PackUnorm2x16 = 56, + GLSLstd450PackHalf2x16 = 57, + GLSLstd450PackDouble2x32 = 58, + GLSLstd450UnpackSnorm2x16 = 59, + GLSLstd450UnpackUnorm2x16 = 60, + GLSLstd450UnpackHalf2x16 = 61, + GLSLstd450UnpackSnorm4x8 = 62, + GLSLstd450UnpackUnorm4x8 = 63, + GLSLstd450UnpackDouble2x32 = 64, + + GLSLstd450Length = 65, + GLSLstd450Distance = 66, + GLSLstd450Cross = 67, + GLSLstd450Normalize = 68, + GLSLstd450FaceForward = 69, + GLSLstd450Reflect = 70, + GLSLstd450Refract = 71, + + GLSLstd450FindILSB = 72, + GLSLstd450FindSMSB = 73, + GLSLstd450FindUMSB = 74, + + GLSLstd450InterpolateAtCentroid = 75, + GLSLstd450InterpolateAtSample = 76, + GLSLstd450InterpolateAtOffset = 77, + + GLSLstd450AddCarry = 78, // These three should move to the core instruction set + GLSLstd450SubBorrow = 79, + GLSLstd450MulExtended = 80, + + GLSLstd450Count +}; + +#endif // #ifndef GLSLstd450_H diff --git a/src/glsl/nir/spirv_glsl450_to_nir.c b/src/glsl/nir/spirv_glsl450_to_nir.c index 52b048820f3..8bfa16e6d2f 100644 --- a/src/glsl/nir/spirv_glsl450_to_nir.c +++ b/src/glsl/nir/spirv_glsl450_to_nir.c @@ -26,100 +26,7 @@ */ #include "spirv_to_nir_private.h" - -enum GLSL450Entrypoint { - Round = 0, - RoundEven = 1, - Trunc = 2, - Abs = 3, - Sign = 4, - Floor = 5, - Ceil = 6, - Fract = 7, - - Radians = 8, - Degrees = 9, - Sin = 10, - Cos = 11, - Tan = 12, - Asin = 13, - Acos = 14, - Atan = 15, - Sinh = 16, - Cosh = 17, - Tanh = 18, - Asinh = 19, - Acosh = 20, - Atanh = 21, - Atan2 = 22, - - Pow = 23, - Exp = 24, - Log = 25, - Exp2 = 26, - Log2 = 27, - Sqrt = 28, - InverseSqrt = 29, - - Determinant = 30, - MatrixInverse = 31, - - Modf = 32, // second argument needs the OpVariable = , not an OpLoad - Min = 33, - Max = 34, - Clamp = 35, - Mix = 36, - Step = 37, - SmoothStep = 38, - - FloatBitsToInt = 39, - FloatBitsToUint = 40, - IntBitsToFloat = 41, - UintBitsToFloat = 42, - - Fma = 43, - Frexp = 44, - Ldexp = 45, - - PackSnorm4x8 = 46, - PackUnorm4x8 = 47, - PackSnorm2x16 = 48, - PackUnorm2x16 = 49, - PackHalf2x16 = 50, - PackDouble2x32 = 51, - UnpackSnorm2x16 = 52, - UnpackUnorm2x16 = 53, - UnpackHalf2x16 = 54, - UnpackSnorm4x8 = 55, - UnpackUnorm4x8 = 56, - UnpackDouble2x32 = 57, - - Length = 58, - Distance = 59, - Cross = 60, - Normalize = 61, - Ftransform = 62, - FaceForward = 63, - Reflect = 64, - Refract = 65, - - UaddCarry = 66, - UsubBorrow = 67, - UmulExtended = 68, - ImulExtended = 69, - BitfieldExtract = 70, - BitfieldInsert = 71, - BitfieldReverse = 72, - BitCount = 73, - FindLSB = 74, - FindMSB = 75, - - InterpolateAtCentroid = 76, - InterpolateAtSample = 77, - InterpolateAtOffset = 78, - - Count -}; +#include "spirv_glsl450.h" static nir_ssa_def* build_length(nir_builder *b, nir_ssa_def *vec) @@ -135,7 +42,7 @@ build_length(nir_builder *b, nir_ssa_def *vec) } static void -handle_glsl450_alu(struct vtn_builder *b, enum GLSL450Entrypoint entrypoint, +handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint, const uint32_t *w, unsigned count) { struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa); @@ -150,106 +57,92 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSL450Entrypoint entrypoint, nir_op op; switch (entrypoint) { - case Round: op = nir_op_fround_even; break; /* TODO */ - case RoundEven: op = nir_op_fround_even; break; - case Trunc: op = nir_op_ftrunc; break; - case Abs: op = nir_op_fabs; break; - case Sign: op = nir_op_fsign; break; - case Floor: op = nir_op_ffloor; break; - case Ceil: op = nir_op_fceil; break; - case Fract: op = nir_op_ffract; break; - case Radians: + case GLSLstd450Round: op = nir_op_fround_even; break; /* TODO */ + case GLSLstd450RoundEven: op = nir_op_fround_even; break; + case GLSLstd450Trunc: op = nir_op_ftrunc; break; + case GLSLstd450FAbs: op = nir_op_fabs; break; + case GLSLstd450FSign: op = nir_op_fsign; break; + case GLSLstd450Floor: op = nir_op_ffloor; break; + case GLSLstd450Ceil: op = nir_op_fceil; break; + case GLSLstd450Fract: op = nir_op_ffract; break; + case GLSLstd450Radians: val->ssa->def = nir_fmul(&b->nb, src[0], nir_imm_float(&b->nb, 0.01745329251)); return; - case Degrees: + case GLSLstd450Degrees: val->ssa->def = nir_fmul(&b->nb, src[0], nir_imm_float(&b->nb, 57.2957795131)); return; - case Sin: op = nir_op_fsin; break; - case Cos: op = nir_op_fcos; break; - case Tan: + case GLSLstd450Sin: op = nir_op_fsin; break; + case GLSLstd450Cos: op = nir_op_fcos; break; + case GLSLstd450Tan: val->ssa->def = nir_fdiv(&b->nb, nir_fsin(&b->nb, src[0]), nir_fcos(&b->nb, src[0])); return; - case Pow: op = nir_op_fpow; break; - case Exp2: op = nir_op_fexp2; break; - case Log2: op = nir_op_flog2; break; - case Sqrt: op = nir_op_fsqrt; break; - case InverseSqrt: op = nir_op_frsq; break; - - case Modf: op = nir_op_fmod; break; - case Min: op = nir_op_fmin; break; - case Max: op = nir_op_fmax; break; - case Mix: op = nir_op_flrp; break; - case Step: + case GLSLstd450Pow: op = nir_op_fpow; break; + case GLSLstd450Exp2: op = nir_op_fexp2; break; + case GLSLstd450Log2: op = nir_op_flog2; break; + case GLSLstd450Sqrt: op = nir_op_fsqrt; break; + case GLSLstd450InverseSqrt: op = nir_op_frsq; break; + + case GLSLstd450Modf: op = nir_op_fmod; break; + case GLSLstd450FMin: op = nir_op_fmin; break; + case GLSLstd450FMax: op = nir_op_fmax; break; + case GLSLstd450Mix: op = nir_op_flrp; break; + case GLSLstd450Step: val->ssa->def = nir_sge(&b->nb, src[1], src[0]); return; - case FloatBitsToInt: - case FloatBitsToUint: - case IntBitsToFloat: - case UintBitsToFloat: - /* Probably going to be removed from the final version of the spec. */ - val->ssa->def = src[0]; - return; - - case Fma: op = nir_op_ffma; break; - case Ldexp: op = nir_op_ldexp; break; + case GLSLstd450Fma: op = nir_op_ffma; break; + case GLSLstd450Ldexp: op = nir_op_ldexp; break; /* Packing/Unpacking functions */ - case PackSnorm4x8: op = nir_op_pack_snorm_4x8; break; - case PackUnorm4x8: op = nir_op_pack_unorm_4x8; break; - case PackSnorm2x16: op = nir_op_pack_snorm_2x16; break; - case PackUnorm2x16: op = nir_op_pack_unorm_2x16; break; - case PackHalf2x16: op = nir_op_pack_half_2x16; break; - case UnpackSnorm4x8: op = nir_op_unpack_snorm_4x8; break; - case UnpackUnorm4x8: op = nir_op_unpack_unorm_4x8; break; - case UnpackSnorm2x16: op = nir_op_unpack_snorm_2x16; break; - case UnpackUnorm2x16: op = nir_op_unpack_unorm_2x16; break; - case UnpackHalf2x16: op = nir_op_unpack_half_2x16; break; - - case Length: + case GLSLstd450PackSnorm4x8: op = nir_op_pack_snorm_4x8; break; + case GLSLstd450PackUnorm4x8: op = nir_op_pack_unorm_4x8; break; + case GLSLstd450PackSnorm2x16: op = nir_op_pack_snorm_2x16; break; + case GLSLstd450PackUnorm2x16: op = nir_op_pack_unorm_2x16; break; + case GLSLstd450PackHalf2x16: op = nir_op_pack_half_2x16; break; + case GLSLstd450UnpackSnorm4x8: op = nir_op_unpack_snorm_4x8; break; + case GLSLstd450UnpackUnorm4x8: op = nir_op_unpack_unorm_4x8; break; + case GLSLstd450UnpackSnorm2x16: op = nir_op_unpack_snorm_2x16; break; + case GLSLstd450UnpackUnorm2x16: op = nir_op_unpack_unorm_2x16; break; + case GLSLstd450UnpackHalf2x16: op = nir_op_unpack_half_2x16; break; + + case GLSLstd450Length: val->ssa->def = build_length(&b->nb, src[0]); return; - case Distance: + case GLSLstd450Distance: val->ssa->def = build_length(&b->nb, nir_fsub(&b->nb, src[0], src[1])); return; - case Normalize: + case GLSLstd450Normalize: val->ssa->def = nir_fdiv(&b->nb, src[0], build_length(&b->nb, src[0])); return; - case UaddCarry: op = nir_op_uadd_carry; break; - case UsubBorrow: op = nir_op_usub_borrow; break; - case BitfieldExtract: op = nir_op_ubitfield_extract; break; /* TODO */ - case BitfieldInsert: op = nir_op_bitfield_insert; break; - case BitfieldReverse: op = nir_op_bitfield_reverse; break; - case BitCount: op = nir_op_bit_count; break; - case FindLSB: op = nir_op_find_lsb; break; - case FindMSB: op = nir_op_ufind_msb; break; /* TODO */ - - case Exp: - case Log: - case Clamp: - case Asin: - case Acos: - case Atan: - case Atan2: - case Sinh: - case Cosh: - case Tanh: - case Asinh: - case Acosh: - case Atanh: - case SmoothStep: - case Frexp: - case PackDouble2x32: - case UnpackDouble2x32: - case Cross: - case Ftransform: - case FaceForward: - case Reflect: - case Refract: - case UmulExtended: - case ImulExtended: + case GLSLstd450AddCarry: op = nir_op_uadd_carry; break; + case GLSLstd450SubBorrow: op = nir_op_usub_borrow; break; + + case GLSLstd450Exp: + case GLSLstd450Log: + case GLSLstd450FClamp: + case GLSLstd450UClamp: + case GLSLstd450SClamp: + case GLSLstd450Asin: + case GLSLstd450Acos: + case GLSLstd450Atan: + case GLSLstd450Atan2: + case GLSLstd450Sinh: + case GLSLstd450Cosh: + case GLSLstd450Tanh: + case GLSLstd450Asinh: + case GLSLstd450Acosh: + case GLSLstd450Atanh: + case GLSLstd450SmoothStep: + case GLSLstd450Frexp: + case GLSLstd450PackDouble2x32: + case GLSLstd450UnpackDouble2x32: + case GLSLstd450Cross: + case GLSLstd450FaceForward: + case GLSLstd450Reflect: + case GLSLstd450Refract: + case GLSLstd450MulExtended: default: unreachable("Unhandled opcode"); } @@ -269,16 +162,16 @@ bool vtn_handle_glsl450_instruction(struct vtn_builder *b, uint32_t ext_opcode, const uint32_t *words, unsigned count) { - switch ((enum GLSL450Entrypoint)ext_opcode) { - case Determinant: - case MatrixInverse: - case InterpolateAtCentroid: - case InterpolateAtSample: - case InterpolateAtOffset: + switch ((enum GLSLstd450)ext_opcode) { + case GLSLstd450Determinant: + case GLSLstd450MatrixInverse: + case GLSLstd450InterpolateAtCentroid: + case GLSLstd450InterpolateAtSample: + case GLSLstd450InterpolateAtOffset: unreachable("Unhandled opcode"); default: - handle_glsl450_alu(b, (enum GLSL450Entrypoint)ext_opcode, words, count); + handle_glsl450_alu(b, (enum GLSLstd450)ext_opcode, words, count); } return true; -- 2.30.2