mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 09:20:12 +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);
|
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,
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue