OSDN Git Service

spirv: Add subgroup shuffle support
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 29 Aug 2017 16:44:44 +0000 (09:44 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 7 Mar 2018 20:13:47 +0000 (12:13 -0800)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/compiler/shader_info.h
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_subgroup.c

index c8ac0b9..b3b56fb 100644 (file)
@@ -47,6 +47,7 @@ struct spirv_supported_capabilities {
    bool shader_viewport_index_layer;
    bool subgroup_ballot;
    bool subgroup_basic;
+   bool subgroup_shuffle;
    bool subgroup_vote;
 };
 
index 1358d07..b719ea8 100644 (file)
@@ -3305,6 +3305,11 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
          spv_check_supported(subgroup_ballot, cap);
          break;
 
+      case SpvCapabilityGroupNonUniformShuffle:
+      case SpvCapabilityGroupNonUniformShuffleRelative:
+         spv_check_supported(subgroup_shuffle, cap);
+         break;
+
       case SpvCapabilityVariablePointersStorageBuffer:
       case SpvCapabilityVariablePointers:
          spv_check_supported(variable_pointers, cap);
index 09e4e59..b999439 100644 (file)
@@ -229,7 +229,29 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
    case SpvOpGroupNonUniformShuffle:
    case SpvOpGroupNonUniformShuffleXor:
    case SpvOpGroupNonUniformShuffleUp:
-   case SpvOpGroupNonUniformShuffleDown:
+   case SpvOpGroupNonUniformShuffleDown: {
+      nir_intrinsic_op op;
+      switch (opcode) {
+      case SpvOpGroupNonUniformShuffle:
+         op = nir_intrinsic_shuffle;
+         break;
+      case SpvOpGroupNonUniformShuffleXor:
+         op = nir_intrinsic_shuffle_xor;
+         break;
+      case SpvOpGroupNonUniformShuffleUp:
+         op = nir_intrinsic_shuffle_up;
+         break;
+      case SpvOpGroupNonUniformShuffleDown:
+         op = nir_intrinsic_shuffle_down;
+         break;
+      default:
+         unreachable("Invalid opcode");
+      }
+      vtn_build_subgroup_instr(b, op, val->ssa, vtn_ssa_value(b, w[4]),
+                               vtn_ssa_value(b, w[5])->def);
+      break;
+   }
+
    case SpvOpGroupNonUniformIAdd:
    case SpvOpGroupNonUniformFAdd:
    case SpvOpGroupNonUniformIMul: