diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp index 7c3b426749c..0c5d7b708a2 100644 --- a/src/compiler/glsl/builtin_functions.cpp +++ b/src/compiler/glsl/builtin_functions.cpp @@ -731,6 +731,19 @@ shader_clock_int64(const _mesa_glsl_parse_state *state) state->AMD_gpu_shader_int64_enable); } +static bool +shader_clock_realtime(const _mesa_glsl_parse_state *state) +{ + return state->EXT_shader_realtime_clock_enable; +} + +static bool +shader_clock_realtime_int64(const _mesa_glsl_parse_state *state) +{ + return state->EXT_shader_realtime_clock_enable && + state->ARB_gpu_shader_int64_enable; +} + static bool shader_storage_buffer_object(const _mesa_glsl_parse_state *state) { @@ -1518,6 +1531,11 @@ private: ir_function_signature *_shader_clock(builtin_available_predicate avail, const glsl_type *type); + ir_function_signature *_shader_clock_realtime_intrinsic(builtin_available_predicate avail, + const glsl_type *type); + ir_function_signature *_shader_clock_realtime(builtin_available_predicate avail, + const glsl_type *type); + ir_function_signature *_vote_intrinsic(const glsl_type *type, builtin_available_predicate avail, enum ir_intrinsic_id id); @@ -1926,6 +1944,11 @@ builtin_builder::create_intrinsics() &glsl_type_builtin_uvec2), NULL); + add_function("__intrinsic_shader_clock_realtime", + _shader_clock_realtime_intrinsic(shader_clock, + &glsl_type_builtin_uvec2), + NULL); + add_function("__intrinsic_vote_all", _vote_intrinsic(&glsl_type_builtin_bool, vote_or_v460_desktop, ir_intrinsic_vote_all), @@ -5614,6 +5637,15 @@ builtin_builder::create_builtins() &glsl_type_builtin_uint64_t), NULL); + add_function("clockRealtime2x32EXT", + _shader_clock_realtime(shader_clock_realtime, + &glsl_type_builtin_uvec2), + NULL); + + add_function("clockRealtimeEXT", + _shader_clock_realtime(shader_clock_realtime_int64, + &glsl_type_builtin_uint64_t), + NULL); add_function("beginInvocationInterlockARB", _invocation_interlock( "__intrinsic_begin_invocation_interlock", @@ -9192,6 +9224,34 @@ builtin_builder::_shader_clock(builtin_available_predicate avail, return sig; } +ir_function_signature * +builtin_builder::_shader_clock_realtime_intrinsic(builtin_available_predicate avail, + const glsl_type *type) +{ + MAKE_INTRINSIC(type, ir_intrinsic_shader_clock_realtime, avail, 0); + return sig; +} + +ir_function_signature * +builtin_builder::_shader_clock_realtime(builtin_available_predicate avail, + const glsl_type *type) +{ + MAKE_SIG(type, avail, 0); + + ir_variable *retval = body.make_temp(&glsl_type_builtin_uvec2, "clock_retval"); + + body.emit(call(symbols->get_function("__intrinsic_shader_clock_realtime"), + retval, sig->parameters)); + + if (type == &glsl_type_builtin_uint64_t) { + body.emit(ret(expr(ir_unop_pack_uint_2x32, retval))); + } else { + body.emit(ret(retval)); + } + + return sig; +} + ir_function_signature * builtin_builder::_vote_intrinsic(const glsl_type *type, builtin_available_predicate avail, diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 99e35465ee7..17b44839997 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -829,6 +829,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { EXT(EXT_shader_implicit_conversions), EXT(EXT_shader_integer_mix), EXT_AEP(EXT_shader_io_blocks), + EXT(EXT_shader_realtime_clock), EXT(EXT_shader_samples_identical), EXT(EXT_shadow_samplers), EXT(EXT_tessellation_point_size), diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index de4a409d6d2..77b85de57ac 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -896,6 +896,8 @@ struct _mesa_glsl_parse_state { bool EXT_shader_integer_mix_warn; bool EXT_shader_io_blocks_enable; bool EXT_shader_io_blocks_warn; + bool EXT_shader_realtime_clock_enable; + bool EXT_shader_realtime_clock_warn; bool EXT_shader_samples_identical_enable; bool EXT_shader_samples_identical_warn; bool EXT_shadow_samplers_enable; diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index bfe7b9d5f16..6077a6cace2 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -1127,6 +1127,7 @@ nir_visitor::visit(ir_call *ir) op = nir_intrinsic_image_deref_sparse_load; break; case ir_intrinsic_shader_clock: + case ir_intrinsic_shader_clock_realtime: op = nir_intrinsic_shader_clock; break; case ir_intrinsic_begin_invocation_interlock: @@ -1642,7 +1643,9 @@ nir_visitor::visit(ir_call *ir) break; } case nir_intrinsic_shader_clock: - nir_intrinsic_set_memory_scope(instr, SCOPE_SUBGROUP); + nir_intrinsic_set_memory_scope(instr, + ir->callee->intrinsic_id == ir_intrinsic_shader_clock ? + SCOPE_SUBGROUP : SCOPE_DEVICE); FALLTHROUGH; case nir_intrinsic_begin_invocation_interlock: case nir_intrinsic_end_invocation_interlock: diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h index 79b70db6a7a..55f1c313807 100644 --- a/src/compiler/glsl/ir.h +++ b/src/compiler/glsl/ir.h @@ -1076,6 +1076,7 @@ enum ir_intrinsic_id { ir_intrinsic_memory_barrier, ir_intrinsic_shader_clock, + ir_intrinsic_shader_clock_realtime, ir_intrinsic_group_memory_barrier, ir_intrinsic_memory_barrier_atomic_counter, ir_intrinsic_memory_barrier_buffer, diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 67103048e74..44a47a4d88e 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -909,6 +909,7 @@ struct pipe_caps { bool int64; bool tgsi_tex_txf_lz; bool shader_clock; + bool shader_realtime_clock; bool polygon_mode_fill_rectangle; bool shader_ballot; bool tes_layer_viewport; diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h index c9cba1d1f3c..3e7f7c9bb8a 100644 --- a/src/mesa/main/consts_exts.h +++ b/src/mesa/main/consts_exts.h @@ -187,6 +187,7 @@ struct gl_extensions GLboolean EXT_shader_image_load_formatted; GLboolean EXT_shader_image_load_store; GLboolean EXT_shader_integer_mix; + GLboolean EXT_shader_realtime_clock; GLboolean EXT_shader_samples_identical; GLboolean EXT_sRGB; GLboolean EXT_stencil_two_side; diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index 276c6e4c5a3..82701a98341 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -302,6 +302,7 @@ EXT(EXT_shader_image_load_store , EXT_shader_image_load_store EXT(EXT_shader_implicit_conversions , dummy_true , x , x , x , 31, 2013) EXT(EXT_shader_integer_mix , EXT_shader_integer_mix , GLL, GLC, x , 30, 2013) EXT(EXT_shader_io_blocks , dummy_true , x , x , x , 31, 2014) +EXT(EXT_shader_realtime_clock , EXT_shader_realtime_clock , GLL, GLC, x , x , 2018) EXT(EXT_shader_samples_identical , EXT_shader_samples_identical , GLL, GLC, x , 31, 2015) EXT(EXT_shadow_funcs , ARB_shadow , GLL, x , x , x , 2002) EXT(EXT_shadow_samplers , ARB_shadow , x , x , x , ES2, 2012) diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 23af4f01845..e007c9a1faa 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -1098,6 +1098,7 @@ void st_init_extensions(struct pipe_screen *screen, #else EXT_CAP(EXT_semaphore_win32, fence_signal); #endif + EXT_CAP(EXT_shader_realtime_clock, shader_realtime_clock); EXT_CAP(EXT_shader_samples_identical, shader_samples_identical); EXT_CAP(EXT_texture_array, max_texture_array_layers); EXT_CAP(EXT_texture_compression_astc_decode_mode, astc_decode_mode);