Merge branch 'nir-spirv' into vulkan
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 5 Sep 2015 01:54:15 +0000 (18:54 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 5 Sep 2015 01:54:15 +0000 (18:54 -0700)
src/glsl/nir/nir.h
src/glsl/nir/nir_opt_algebraic.py
src/glsl/nir/nir_types.cpp
src/glsl/nir/spirv_glsl450.h [new file with mode: 0644]
src/glsl/nir/spirv_glsl450_to_nir.c
src/glsl/nir/spirv_to_nir.c
src/mesa/drivers/dri/i965/brw_shader.cpp

index a5abc0438674e8a51b3c1c033dcbe1348def4cd6..7b188fa8ed19354284792aca1cea1bb9ad16e059 100644 (file)
@@ -1444,6 +1444,7 @@ typedef struct nir_function {
 
 typedef struct nir_shader_compiler_options {
    bool lower_ffma;
+   bool lower_fdiv;
    bool lower_flrp;
    bool lower_fpow;
    bool lower_fsat;
index 226e0a8d85c3696584a9406608af49b4f58619eb..880408bc3678c5b0bb4a704b7dd6ca57f16e0e2f 100644 (file)
@@ -66,6 +66,7 @@ optimizations = [
    (('imul', a, 1), a),
    (('fmul', a, -1.0), ('fneg', a)),
    (('imul', a, -1), ('ineg', a)),
+   (('fdiv', a, b), ('fmul', a, ('frcp', b)), 'options->lower_fdiv'),
    (('ffma', 0.0, a, b), b),
    (('ffma', a, 0.0, b), b),
    (('ffma', a, b, 0.0), ('fmul', a, b)),
index 809a7cff79c7730f934307b01e59c166a09cb2b9..69cfac18587d461b866f63403305a21c81f5b8e3 100644 (file)
@@ -252,7 +252,7 @@ glsl_vector_type(enum glsl_base_type base_type, unsigned components)
 const glsl_type *
 glsl_matrix_type(enum glsl_base_type base_type, unsigned rows, unsigned columns)
 {
-   assert(rows > 1 && rows <= 4 && columns > 1 && columns <= 4);
+   assert(rows > 1 && rows <= 4 && columns >= 1 && columns <= 4);
    return glsl_type::get_instance(base_type, rows, columns);
 }
 
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..60bd597820c28a1e7117dd5876e72a8c3b901053 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");
    }
@@ -257,6 +150,7 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSL450Entrypoint entrypoint,
    nir_alu_instr *instr = nir_alu_instr_create(b->shader, op);
    nir_ssa_dest_init(&instr->instr, &instr->dest.dest,
                      glsl_get_vector_elements(val->ssa->type), val->name);
+   instr->dest.write_mask = (1 << instr->dest.dest.ssa.num_components) - 1;
    val->ssa->def = &instr->dest.dest.ssa;
 
    for (unsigned i = 0; i < nir_op_infos[op].num_inputs; i++)
@@ -269,16 +163,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;
index 27a864f59933cf16b61015ec9ddca3654141cbce..7b57ffe44f64d286c144a31872ae04e74f22f946 100644 (file)
@@ -365,6 +365,8 @@ struct_member_decoration_cb(struct vtn_builder *b,
    case SpvDecorationOffset:
       ctx->type->offsets[member] = dec->literals[0];
       break;
+   case SpvDecorationColMajor:
+      break; /* Nothing to do here.  Column-major is the default. */
    default:
       unreachable("Unhandled member decoration");
    }
index 0007e5c07a5ea56f794c490c72a262ceff71826c..4ef2777559f36e2a23952bdce2d0f78c04d3dbea 100644 (file)
@@ -96,6 +96,7 @@ brw_compiler_create(void *mem_ctx, const struct brw_device_info *devinfo)
     */
    nir_options->lower_ffma = true;
    nir_options->lower_sub = true;
+   nir_options->lower_fdiv = true;
 
    /* We want the GLSL compiler to emit code that uses condition codes */
    for (int i = 0; i < MESA_SHADER_STAGES; i++) {