glsl: Add interaction between ARB_gpu_shader_int64 and ARB_shader_clock

If ARB_gpu_shader_int64 is supported, ARB_shader_clock also adds
clockARB() that returns a uint64_t.  Rather than add new opcodes and
intrinsics for this, just wrap the existing intrinsic with a
packUint2x32.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Ian Romanick 2016-09-02 08:54:48 -07:00
parent bfc4080d38
commit 0d14fec345
1 changed files with 19 additions and 1 deletions

View File

@ -470,6 +470,13 @@ shader_clock(const _mesa_glsl_parse_state *state)
return state->ARB_shader_clock_enable;
}
static bool
shader_clock_int64(const _mesa_glsl_parse_state *state)
{
return state->ARB_shader_clock_enable &&
state->ARB_gpu_shader_int64_enable;
}
static bool
shader_storage_buffer_object(const _mesa_glsl_parse_state *state)
{
@ -3077,6 +3084,11 @@ builtin_builder::create_builtins()
glsl_type::uvec2_type),
NULL);
add_function("clockARB",
_shader_clock(shader_clock_int64,
glsl_type::uint64_t_type),
NULL);
add_function("anyInvocationARB", _vote(ir_unop_vote_any), NULL);
add_function("allInvocationsARB", _vote(ir_unop_vote_all), NULL);
add_function("allInvocationsEqualARB", _vote(ir_unop_vote_eq), NULL);
@ -5858,7 +5870,13 @@ builtin_builder::_shader_clock(builtin_available_predicate avail,
body.emit(call(shader->symbols->get_function("__intrinsic_shader_clock"),
retval, sig->parameters));
body.emit(ret(retval));
if (type == glsl_type::uint64_t_type) {
body.emit(ret(expr(ir_unop_pack_uint_2x32, retval)));
} else {
body.emit(ret(retval));
}
return sig;
}