spirv: Add subgroup quad support
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 29 Aug 2017 17:21:31 +0000 (10:21 -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 b3b56fb273c842825d32ee43de2cbbd0eeb3038b..fd740e0d489ffcc53c4cbd17900100c82c1a9491 100644 (file)
@@ -47,6 +47,7 @@ struct spirv_supported_capabilities {
    bool shader_viewport_index_layer;
    bool subgroup_ballot;
    bool subgroup_basic;
+   bool subgroup_quad;
    bool subgroup_shuffle;
    bool subgroup_vote;
 };
index b719ea831ffc9048b73de5c0f0cc27816488ac62..a8b545ec866d58fdcab25381751920fa213bbf49 100644 (file)
@@ -3310,6 +3310,9 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
          spv_check_supported(subgroup_shuffle, cap);
          break;
 
+      case SpvCapabilityGroupNonUniformQuad:
+         spv_check_supported(subgroup_quad, cap);
+
       case SpvCapabilityVariablePointersStorageBuffer:
       case SpvCapabilityVariablePointers:
          spv_check_supported(variable_pointers, cap);
index b999439264bb60f18e8ee1f9e1b195ac8a96aa7c..1204c5945c8bfd070f7385864c63a4439862d10b 100644 (file)
@@ -252,6 +252,30 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
       break;
    }
 
+   case SpvOpGroupNonUniformQuadBroadcast:
+      vtn_build_subgroup_instr(b, nir_intrinsic_quad_broadcast,
+                               val->ssa, vtn_ssa_value(b, w[4]),
+                               vtn_ssa_value(b, w[5])->def);
+      break;
+
+   case SpvOpGroupNonUniformQuadSwap: {
+      unsigned direction = vtn_constant_value(b, w[5])->values[0].u32[0];
+      nir_intrinsic_op op;
+      switch (direction) {
+      case 0:
+         op = nir_intrinsic_quad_swap_horizontal;
+         break;
+      case 1:
+         op = nir_intrinsic_quad_swap_vertical;
+         break;
+      case 2:
+         op = nir_intrinsic_quad_swap_diagonal;
+         break;
+      }
+      vtn_build_subgroup_instr(b, op, val->ssa, vtn_ssa_value(b, w[4]), NULL);
+      break;
+   }
+
    case SpvOpGroupNonUniformIAdd:
    case SpvOpGroupNonUniformFAdd:
    case SpvOpGroupNonUniformIMul:
@@ -268,8 +292,6 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
    case SpvOpGroupNonUniformLogicalAnd:
    case SpvOpGroupNonUniformLogicalOr:
    case SpvOpGroupNonUniformLogicalXor:
-   case SpvOpGroupNonUniformQuadBroadcast:
-   case SpvOpGroupNonUniformQuadSwap:
    default:
       unreachable("Invalid SPIR-V opcode");
    }