spirv: Add subgroup quad support

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
Jason Ekstrand
2017-08-29 10:21:31 -07:00
parent 493a165544
commit b3a5b0f3fc
3 changed files with 28 additions and 2 deletions

View File

@@ -47,6 +47,7 @@ struct spirv_supported_capabilities {
bool shader_viewport_index_layer; bool shader_viewport_index_layer;
bool subgroup_ballot; bool subgroup_ballot;
bool subgroup_basic; bool subgroup_basic;
bool subgroup_quad;
bool subgroup_shuffle; bool subgroup_shuffle;
bool subgroup_vote; bool subgroup_vote;
}; };

View File

@@ -3310,6 +3310,9 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
spv_check_supported(subgroup_shuffle, cap); spv_check_supported(subgroup_shuffle, cap);
break; break;
case SpvCapabilityGroupNonUniformQuad:
spv_check_supported(subgroup_quad, cap);
case SpvCapabilityVariablePointersStorageBuffer: case SpvCapabilityVariablePointersStorageBuffer:
case SpvCapabilityVariablePointers: case SpvCapabilityVariablePointers:
spv_check_supported(variable_pointers, cap); spv_check_supported(variable_pointers, cap);

View File

@@ -252,6 +252,30 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
break; 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 SpvOpGroupNonUniformIAdd:
case SpvOpGroupNonUniformFAdd: case SpvOpGroupNonUniformFAdd:
case SpvOpGroupNonUniformIMul: case SpvOpGroupNonUniformIMul:
@@ -268,8 +292,6 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
case SpvOpGroupNonUniformLogicalAnd: case SpvOpGroupNonUniformLogicalAnd:
case SpvOpGroupNonUniformLogicalOr: case SpvOpGroupNonUniformLogicalOr:
case SpvOpGroupNonUniformLogicalXor: case SpvOpGroupNonUniformLogicalXor:
case SpvOpGroupNonUniformQuadBroadcast:
case SpvOpGroupNonUniformQuadSwap:
default: default:
unreachable("Invalid SPIR-V opcode"); unreachable("Invalid SPIR-V opcode");
} }