glsl: Add built-in functions for NV_shader_atomic_float

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
Ian Romanick
2018-03-29 15:16:38 -07:00
parent 9527bb4e70
commit 88b6c7bc14
+48 -3
View File
@@ -570,7 +570,14 @@ shader_image_atomic_exchange_float(const _mesa_glsl_parse_state *state)
{
return (state->is_version(450, 320) ||
state->ARB_ES3_1_compatibility_enable ||
state->OES_shader_image_atomic_enable);
state->OES_shader_image_atomic_enable ||
state->NV_shader_atomic_float_enable);
}
static bool
shader_image_atomic_add_float(const _mesa_glsl_parse_state *state)
{
return state->NV_shader_atomic_float_enable;
}
static bool
@@ -653,6 +660,24 @@ integer_functions_supported(const _mesa_glsl_parse_state *state)
{
return state->extensions->MESA_shader_integer_functions;
}
static bool
NV_shader_atomic_float_supported(const _mesa_glsl_parse_state *state)
{
return state->extensions->NV_shader_atomic_float;
}
static bool
shader_atomic_float_add(const _mesa_glsl_parse_state *state)
{
return state->NV_shader_atomic_float_enable;
}
static bool
shader_atomic_float_exchange(const _mesa_glsl_parse_state *state)
{
return state->NV_shader_atomic_float_enable;
}
/** @} */
/******************************************************************************/
@@ -1031,7 +1056,8 @@ enum image_function_flags {
IMAGE_FUNCTION_WRITE_ONLY = (1 << 5),
IMAGE_FUNCTION_AVAIL_ATOMIC = (1 << 6),
IMAGE_FUNCTION_MS_ONLY = (1 << 7),
IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE = (1 << 8)
IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE = (1 << 8),
IMAGE_FUNCTION_AVAIL_ATOMIC_ADD = (1 << 9),
};
} /* anonymous namespace */
@@ -1139,6 +1165,9 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(buffer_atomics_supported,
glsl_type::int_type,
ir_intrinsic_generic_atomic_add),
_atomic_intrinsic2(NV_shader_atomic_float_supported,
glsl_type::float_type,
ir_intrinsic_generic_atomic_add),
_atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_add),
NULL);
@@ -1199,6 +1228,9 @@ builtin_builder::create_intrinsics()
_atomic_intrinsic2(buffer_atomics_supported,
glsl_type::int_type,
ir_intrinsic_generic_atomic_exchange),
_atomic_intrinsic2(NV_shader_atomic_float_supported,
glsl_type::float_type,
ir_intrinsic_generic_atomic_exchange),
_atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
ir_intrinsic_atomic_counter_exchange),
NULL);
@@ -3143,6 +3175,9 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_add",
buffer_atomics_supported,
glsl_type::int_type),
_atomic_op2("__intrinsic_atomic_add",
shader_atomic_float_add,
glsl_type::float_type),
NULL);
add_function("atomicMin",
_atomic_op2("__intrinsic_atomic_min",
@@ -3191,6 +3226,9 @@ builtin_builder::create_builtins()
_atomic_op2("__intrinsic_atomic_exchange",
buffer_atomics_supported,
glsl_type::int_type),
_atomic_op2("__intrinsic_atomic_exchange",
shader_atomic_float_exchange,
glsl_type::float_type),
NULL);
add_function("atomicCompSwap",
_atomic_op3("__intrinsic_atomic_comp_swap",
@@ -3514,7 +3552,9 @@ builtin_builder::add_image_functions(bool glsl)
add_image_function(glsl ? "imageAtomicAdd" : "__intrinsic_image_atomic_add",
"__intrinsic_image_atomic_add",
&builtin_builder::_image_prototype, 1, atom_flags,
&builtin_builder::_image_prototype, 1,
(flags | IMAGE_FUNCTION_AVAIL_ATOMIC_ADD |
IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE),
ir_intrinsic_image_atomic_add);
add_image_function(glsl ? "imageAtomicMin" : "__intrinsic_image_atomic_min",
@@ -6039,7 +6079,12 @@ get_image_available_predicate(const glsl_type *type, unsigned flags)
type->sampled_type == GLSL_TYPE_FLOAT)
return shader_image_atomic_exchange_float;
if ((flags & IMAGE_FUNCTION_AVAIL_ATOMIC_ADD) &&
type->sampled_type == GLSL_TYPE_FLOAT)
return shader_image_atomic_add_float;
else if (flags & (IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE |
IMAGE_FUNCTION_AVAIL_ATOMIC_ADD |
IMAGE_FUNCTION_AVAIL_ATOMIC))
return shader_image_atomic;