diff options
author | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-04-19 12:15:16 -0700 |
---|---|---|
committer | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-10-07 09:12:12 -0700 |
commit | f20cea016214ed27d50a6974fa108d360fda1da8 (patch) | |
tree | abb0231c0c28c52077252212bb3a5ef5fcb8e307 /src/compiler | |
parent | 3f304617cb39066b30594f7e0f6e991707c3930a (diff) |
spirv: Implement SPV_KHR_shader_clock
We only have the subgroup variant in NIR (equivalent to clockARB), so
only support that for now.
Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/shader_info.h | 1 | ||||
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 35 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 8b0176f0438..740b75b756a 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -60,6 +60,7 @@ struct spirv_supported_capabilities { bool post_depth_coverage; bool runtime_descriptor_array; bool float_controls; + bool shader_clock; bool shader_viewport_index_layer; bool stencil_export; bool storage_8bit; diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index edffcb0a53f..abfd8eaef70 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3652,6 +3652,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, spv_check_supported(demote_to_helper_invocation, cap); break; + case SpvCapabilityShaderClockKHR: + spv_check_supported(shader_clock, cap); + break; + default: vtn_fail("Unhandled capability: %s (%u)", spirv_capability_to_string(cap), cap); @@ -4554,6 +4558,37 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode, break; } + case SpvOpReadClockKHR: { + assert(vtn_constant_uint(b, w[3]) == SpvScopeSubgroup); + + /* Operation supports two result types: uvec2 and uint64_t. The NIR + * intrinsic gives uvec2, so pack the result for the other case. + */ + nir_intrinsic_instr *intrin = + nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_shader_clock); + nir_ssa_dest_init(&intrin->instr, &intrin->dest, 2, 32, NULL); + nir_builder_instr_insert(&b->nb, &intrin->instr); + + struct vtn_type *type = vtn_value(b, w[1], vtn_value_type_type)->type; + const struct glsl_type *dest_type = type->type; + nir_ssa_def *result; + + if (glsl_type_is_vector(dest_type)) { + assert(dest_type == glsl_vector_type(GLSL_TYPE_UINT, 2)); + result = &intrin->dest.ssa; + } else { + assert(glsl_type_is_scalar(dest_type)); + assert(glsl_get_base_type(dest_type) == GLSL_TYPE_UINT64); + result = nir_pack_64_2x32(&b->nb, &intrin->dest.ssa); + } + + struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa); + val->type = type; + val->ssa = vtn_create_ssa_value(b, dest_type); + val->ssa->def = result; + break; + } + default: vtn_fail_with_opcode("Unhandled opcode", opcode); } |