summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/builtin_functions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/glsl/builtin_functions.cpp')
-rw-r--r--src/compiler/glsl/builtin_functions.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
index eef5737128d..67ed936478f 100644
--- a/src/compiler/glsl/builtin_functions.cpp
+++ b/src/compiler/glsl/builtin_functions.cpp
@@ -819,6 +819,13 @@ shader_atomic_float_minmax(const _mesa_glsl_parse_state *state)
{
return state->INTEL_shader_atomic_float_minmax_enable;
}
+
+static bool
+demote_to_helper_invocation(const _mesa_glsl_parse_state *state)
+{
+ return state->EXT_demote_to_helper_invocation_enable;
+}
+
/** @} */
/******************************************************************************/
@@ -1182,6 +1189,9 @@ private:
ir_function_signature *_vote(const char *intrinsic_name,
builtin_available_predicate avail);
+ ir_function_signature *_helper_invocation_intrinsic();
+ ir_function_signature *_helper_invocation();
+
#undef B0
#undef B1
#undef B2
@@ -1491,6 +1501,8 @@ builtin_builder::create_intrinsics()
_read_first_invocation_intrinsic(glsl_type::uvec4_type),
NULL);
+ add_function("__intrinsic_helper_invocation",
+ _helper_invocation_intrinsic(), NULL);
}
/**
@@ -4230,6 +4242,8 @@ builtin_builder::create_builtins()
_vote("__intrinsic_vote_eq", v460_desktop),
NULL);
+ add_function("helperInvocationEXT", _helper_invocation(), NULL);
+
add_function("__builtin_idiv64",
generate_ir::idiv64(mem_ctx, integer_functions_supported),
NULL);
@@ -7274,6 +7288,28 @@ builtin_builder::_vote(const char *intrinsic_name,
return sig;
}
+ir_function_signature *
+builtin_builder::_helper_invocation_intrinsic()
+{
+ MAKE_INTRINSIC(glsl_type::bool_type, ir_intrinsic_helper_invocation,
+ demote_to_helper_invocation, 0);
+ return sig;
+}
+
+ir_function_signature *
+builtin_builder::_helper_invocation()
+{
+ MAKE_SIG(glsl_type::bool_type, demote_to_helper_invocation, 0);
+
+ ir_variable *retval = body.make_temp(glsl_type::bool_type, "retval");
+
+ body.emit(call(shader->symbols->get_function("__intrinsic_helper_invocation"),
+ retval, sig->parameters));
+ body.emit(ret(retval));
+
+ return sig;
+}
+
/** @} */
/******************************************************************************/