mesa: Add support for GL_EXT_shader_realtime_clock

This is similar to ARB_shader_clock

Signed-off-by: Ashley Smith <ashley.smith@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34345>
This commit is contained in:
Ashley Smith 2025-04-02 12:17:33 +01:00 committed by Marge Bot
parent 47619ef538
commit c5500cd12f
9 changed files with 72 additions and 1 deletions

View file

@ -731,6 +731,19 @@ shader_clock_int64(const _mesa_glsl_parse_state *state)
state->AMD_gpu_shader_int64_enable); 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 static bool
shader_storage_buffer_object(const _mesa_glsl_parse_state *state) shader_storage_buffer_object(const _mesa_glsl_parse_state *state)
{ {
@ -1518,6 +1531,11 @@ private:
ir_function_signature *_shader_clock(builtin_available_predicate avail, ir_function_signature *_shader_clock(builtin_available_predicate avail,
const glsl_type *type); 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, ir_function_signature *_vote_intrinsic(const glsl_type *type,
builtin_available_predicate avail, builtin_available_predicate avail,
enum ir_intrinsic_id id); enum ir_intrinsic_id id);
@ -1926,6 +1944,11 @@ builtin_builder::create_intrinsics()
&glsl_type_builtin_uvec2), &glsl_type_builtin_uvec2),
NULL); NULL);
add_function("__intrinsic_shader_clock_realtime",
_shader_clock_realtime_intrinsic(shader_clock,
&glsl_type_builtin_uvec2),
NULL);
add_function("__intrinsic_vote_all", add_function("__intrinsic_vote_all",
_vote_intrinsic(&glsl_type_builtin_bool, vote_or_v460_desktop, _vote_intrinsic(&glsl_type_builtin_bool, vote_or_v460_desktop,
ir_intrinsic_vote_all), ir_intrinsic_vote_all),
@ -5614,6 +5637,15 @@ builtin_builder::create_builtins()
&glsl_type_builtin_uint64_t), &glsl_type_builtin_uint64_t),
NULL); 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", add_function("beginInvocationInterlockARB",
_invocation_interlock( _invocation_interlock(
"__intrinsic_begin_invocation_interlock", "__intrinsic_begin_invocation_interlock",
@ -9192,6 +9224,34 @@ builtin_builder::_shader_clock(builtin_available_predicate avail,
return sig; 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 * ir_function_signature *
builtin_builder::_vote_intrinsic(const glsl_type *type, builtin_builder::_vote_intrinsic(const glsl_type *type,
builtin_available_predicate avail, builtin_available_predicate avail,

View file

@ -829,6 +829,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
EXT(EXT_shader_implicit_conversions), EXT(EXT_shader_implicit_conversions),
EXT(EXT_shader_integer_mix), EXT(EXT_shader_integer_mix),
EXT_AEP(EXT_shader_io_blocks), EXT_AEP(EXT_shader_io_blocks),
EXT(EXT_shader_realtime_clock),
EXT(EXT_shader_samples_identical), EXT(EXT_shader_samples_identical),
EXT(EXT_shadow_samplers), EXT(EXT_shadow_samplers),
EXT(EXT_tessellation_point_size), EXT(EXT_tessellation_point_size),

View file

@ -896,6 +896,8 @@ struct _mesa_glsl_parse_state {
bool EXT_shader_integer_mix_warn; bool EXT_shader_integer_mix_warn;
bool EXT_shader_io_blocks_enable; bool EXT_shader_io_blocks_enable;
bool EXT_shader_io_blocks_warn; 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_enable;
bool EXT_shader_samples_identical_warn; bool EXT_shader_samples_identical_warn;
bool EXT_shadow_samplers_enable; bool EXT_shadow_samplers_enable;

View file

@ -1127,6 +1127,7 @@ nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_image_deref_sparse_load; op = nir_intrinsic_image_deref_sparse_load;
break; break;
case ir_intrinsic_shader_clock: case ir_intrinsic_shader_clock:
case ir_intrinsic_shader_clock_realtime:
op = nir_intrinsic_shader_clock; op = nir_intrinsic_shader_clock;
break; break;
case ir_intrinsic_begin_invocation_interlock: case ir_intrinsic_begin_invocation_interlock:
@ -1642,7 +1643,9 @@ nir_visitor::visit(ir_call *ir)
break; break;
} }
case nir_intrinsic_shader_clock: 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; FALLTHROUGH;
case nir_intrinsic_begin_invocation_interlock: case nir_intrinsic_begin_invocation_interlock:
case nir_intrinsic_end_invocation_interlock: case nir_intrinsic_end_invocation_interlock:

View file

@ -1076,6 +1076,7 @@ enum ir_intrinsic_id {
ir_intrinsic_memory_barrier, ir_intrinsic_memory_barrier,
ir_intrinsic_shader_clock, ir_intrinsic_shader_clock,
ir_intrinsic_shader_clock_realtime,
ir_intrinsic_group_memory_barrier, ir_intrinsic_group_memory_barrier,
ir_intrinsic_memory_barrier_atomic_counter, ir_intrinsic_memory_barrier_atomic_counter,
ir_intrinsic_memory_barrier_buffer, ir_intrinsic_memory_barrier_buffer,

View file

@ -909,6 +909,7 @@ struct pipe_caps {
bool int64; bool int64;
bool tgsi_tex_txf_lz; bool tgsi_tex_txf_lz;
bool shader_clock; bool shader_clock;
bool shader_realtime_clock;
bool polygon_mode_fill_rectangle; bool polygon_mode_fill_rectangle;
bool shader_ballot; bool shader_ballot;
bool tes_layer_viewport; bool tes_layer_viewport;

View file

@ -187,6 +187,7 @@ struct gl_extensions
GLboolean EXT_shader_image_load_formatted; GLboolean EXT_shader_image_load_formatted;
GLboolean EXT_shader_image_load_store; GLboolean EXT_shader_image_load_store;
GLboolean EXT_shader_integer_mix; GLboolean EXT_shader_integer_mix;
GLboolean EXT_shader_realtime_clock;
GLboolean EXT_shader_samples_identical; GLboolean EXT_shader_samples_identical;
GLboolean EXT_sRGB; GLboolean EXT_sRGB;
GLboolean EXT_stencil_two_side; GLboolean EXT_stencil_two_side;

View file

@ -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_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_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_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_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_funcs , ARB_shadow , GLL, x , x , x , 2002)
EXT(EXT_shadow_samplers , ARB_shadow , x , x , x , ES2, 2012) EXT(EXT_shadow_samplers , ARB_shadow , x , x , x , ES2, 2012)

View file

@ -1098,6 +1098,7 @@ void st_init_extensions(struct pipe_screen *screen,
#else #else
EXT_CAP(EXT_semaphore_win32, fence_signal); EXT_CAP(EXT_semaphore_win32, fence_signal);
#endif #endif
EXT_CAP(EXT_shader_realtime_clock, shader_realtime_clock);
EXT_CAP(EXT_shader_samples_identical, shader_samples_identical); EXT_CAP(EXT_shader_samples_identical, shader_samples_identical);
EXT_CAP(EXT_texture_array, max_texture_array_layers); EXT_CAP(EXT_texture_array, max_texture_array_layers);
EXT_CAP(EXT_texture_compression_astc_decode_mode, astc_decode_mode); EXT_CAP(EXT_texture_compression_astc_decode_mode, astc_decode_mode);