From: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/compiler/glsl/builtin_functions.cpp | 86 +++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-)
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp index 6a45e5a..f7fad0b 100644 --- a/src/compiler/glsl/builtin_functions.cpp +++ b/src/compiler/glsl/builtin_functions.cpp @@ -941,22 +941,25 @@ private: unsigned num_arguments, unsigned flags, enum ir_intrinsic_id id); ir_function_signature *_memory_barrier_intrinsic( builtin_available_predicate avail, enum ir_intrinsic_id id); ir_function_signature *_memory_barrier(const char *intrinsic_name, builtin_available_predicate avail); + ir_function_signature *_ballot_intrinsic(); ir_function_signature *_ballot(); + ir_function_signature *_read_first_invocation_intrinsic(const glsl_type *type); ir_function_signature *_read_first_invocation(const glsl_type *type); + ir_function_signature *_read_invocation_intrinsic(const glsl_type *type); ir_function_signature *_read_invocation(const glsl_type *type); ir_function_signature *_shader_clock_intrinsic(builtin_available_predicate avail, const glsl_type *type); ir_function_signature *_shader_clock(builtin_available_predicate avail, const glsl_type *type); ir_function_signature *_vote_intrinsic(builtin_available_predicate avail, enum ir_intrinsic_id id); ir_function_signature *_vote(const char *intrinsic_name); @@ -1195,20 +1198,57 @@ builtin_builder::create_intrinsics() add_function("__intrinsic_vote_all", _vote_intrinsic(vote, ir_intrinsic_vote_all), NULL); add_function("__intrinsic_vote_any", _vote_intrinsic(vote, ir_intrinsic_vote_any), NULL); add_function("__intrinsic_vote_eq", _vote_intrinsic(vote, ir_intrinsic_vote_eq), NULL); + + add_function("__intrinsic_ballot", _ballot_intrinsic(), NULL); + + add_function("__intrinsic_read_invocation", + _read_invocation_intrinsic(glsl_type::float_type), + _read_invocation_intrinsic(glsl_type::vec2_type), + _read_invocation_intrinsic(glsl_type::vec3_type), + _read_invocation_intrinsic(glsl_type::vec4_type), + + _read_invocation_intrinsic(glsl_type::int_type), + _read_invocation_intrinsic(glsl_type::ivec2_type), + _read_invocation_intrinsic(glsl_type::ivec3_type), + _read_invocation_intrinsic(glsl_type::ivec4_type), + + _read_invocation_intrinsic(glsl_type::uint_type), + _read_invocation_intrinsic(glsl_type::uvec2_type), + _read_invocation_intrinsic(glsl_type::uvec3_type), + _read_invocation_intrinsic(glsl_type::uvec4_type), + NULL); + + add_function("__intrinsic_read_first_invocation", + _read_first_invocation_intrinsic(glsl_type::float_type), + _read_first_invocation_intrinsic(glsl_type::vec2_type), + _read_first_invocation_intrinsic(glsl_type::vec3_type), + _read_first_invocation_intrinsic(glsl_type::vec4_type), + + _read_first_invocation_intrinsic(glsl_type::int_type), + _read_first_invocation_intrinsic(glsl_type::ivec2_type), + _read_first_invocation_intrinsic(glsl_type::ivec3_type), + _read_first_invocation_intrinsic(glsl_type::ivec4_type), + + _read_first_invocation_intrinsic(glsl_type::uint_type), + _read_first_invocation_intrinsic(glsl_type::uvec2_type), + _read_first_invocation_intrinsic(glsl_type::uvec3_type), + _read_first_invocation_intrinsic(glsl_type::uvec4_type), + NULL); + } /** * Create ir_function and ir_function_signature objects for each built-in. * * Contains a list of every available built-in. */ void builtin_builder::create_builtins() { @@ -6008,47 +6048,87 @@ ir_function_signature * builtin_builder::_memory_barrier(const char *intrinsic_name, builtin_available_predicate avail) { MAKE_SIG(glsl_type::void_type, avail, 0); body.emit(call(shader->symbols->get_function(intrinsic_name), NULL, sig->parameters)); return sig; } ir_function_signature * +builtin_builder::_ballot_intrinsic() +{ + ir_variable *value = in_var(glsl_type::bool_type, "value"); + MAKE_INTRINSIC(glsl_type::uint64_t_type, ir_intrinsic_ballot, shader_ballot, + 1, value); + return sig; +} + +ir_function_signature * builtin_builder::_ballot() { ir_variable *value = in_var(glsl_type::bool_type, "value"); MAKE_SIG(glsl_type::uint64_t_type, shader_ballot, 1, value); - body.emit(ret(expr(ir_unop_ballot, value))); + ir_variable *retval = body.make_temp(glsl_type::uint64_t_type, "retval"); + + body.emit(call(shader->symbols->get_function("__intrinsic_ballot"), + retval, sig->parameters)); + body.emit(ret(retval)); + return sig; +} + +ir_function_signature * +builtin_builder::_read_first_invocation_intrinsic(const glsl_type *type) +{ + ir_variable *value = in_var(type, "value"); + MAKE_INTRINSIC(type, ir_intrinsic_read_first_invocation, shader_ballot, + 1, value); return sig; } ir_function_signature * builtin_builder::_read_first_invocation(const glsl_type *type) { ir_variable *value = in_var(type, "value"); MAKE_SIG(type, shader_ballot, 1, value); - body.emit(ret(expr(ir_unop_read_first_invocation, value))); + ir_variable *retval = body.make_temp(type, "retval"); + + body.emit(call(shader->symbols->get_function("__intrinsic_read_first_invocation"), + retval, sig->parameters)); + body.emit(ret(retval)); + return sig; +} + +ir_function_signature * +builtin_builder::_read_invocation_intrinsic(const glsl_type *type) +{ + ir_variable *value = in_var(type, "value"); + ir_variable *invocation = in_var(glsl_type::uint_type, "invocation"); + MAKE_INTRINSIC(type, ir_intrinsic_read_invocation, shader_ballot, + 2, value, invocation); return sig; } ir_function_signature * builtin_builder::_read_invocation(const glsl_type *type) { ir_variable *value = in_var(type, "value"); ir_variable *invocation = in_var(glsl_type::uint_type, "invocation"); MAKE_SIG(type, shader_ballot, 2, value, invocation); - body.emit(ret(expr(ir_binop_read_invocation, value, invocation))); + ir_variable *retval = body.make_temp(type, "retval"); + + body.emit(call(shader->symbols->get_function("__intrinsic_read_invocation"), + retval, sig->parameters)); + body.emit(ret(retval)); return sig; } ir_function_signature * builtin_builder::_shader_clock_intrinsic(builtin_available_predicate avail, const glsl_type *type) { MAKE_INTRINSIC(type, ir_intrinsic_shader_clock, avail, 0); return sig; } -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev