mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 11:30:11 +01:00
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:
parent
47619ef538
commit
c5500cd12f
9 changed files with 72 additions and 1 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue