nir/spirv: Use the actual GLSL 450 extension header from Khronos
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 5 Sep 2015 01:39:57 +0000 (18:39 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 5 Sep 2015 01:50:14 +0000 (18:50 -0700)
src/glsl/nir/spirv_glsl450.h [new file with mode: 0644]
src/glsl/nir/spirv_glsl450_to_nir.c

diff --git a/src/glsl/nir/spirv_glsl450.h b/src/glsl/nir/spirv_glsl450.h
new file mode 100644 (file)
index 0000000..d828b15
--- /dev/null
@@ -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
index 52b048820f305f1f5b1dcdd28413af1ca469c1f0..8bfa16e6d2f252bf22ae3aa1be8f1252c73631bf 100644 (file)
  */
 
 #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;