glsl: Add interaction between ARB_gpu_shader_int64 and ARB_shader_clock
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 2 Sep 2016 15:54:48 +0000 (08:54 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 20 Jan 2017 23:41:23 +0000 (15:41 -0800)
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>
src/compiler/glsl/builtin_functions.cpp

index 1044de72dc134dc77d327a89ecb27f7df9cdb025..0749ba1d448f52eb4ffff427cf3d77f698619f7f 100644 (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;
 }