[Mesa-dev] [PATCH 3/5] glsl: Implement the required built-in functions when OES_shader_image_atomic is enabled.

Francisco Jerez currojerez at riseup.net
Tue Feb 23 02:40:37 UTC 2016


This is basically just the same atomic functions exposed by
ARB_shader_image_load_store, with one exception:

    "highp float imageAtomicExchange(
         coherent IMAGE_PARAMS,
         float data);"

There's no float atomic exchange overload in the original
ARB_shader_image_load_store or GL 4.2, so this seems like new
functionality that requires specific back-end support and a separate
availability condition in the built-in function generator.
---
 src/compiler/glsl/builtin_functions.cpp | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
index f488434..db74672 100644
--- a/src/compiler/glsl/builtin_functions.cpp
+++ b/src/compiler/glsl/builtin_functions.cpp
@@ -448,8 +448,16 @@ shader_image_load_store(const _mesa_glsl_parse_state *state)
 static bool
 shader_image_atomic(const _mesa_glsl_parse_state *state)
 {
-   return (state->is_version(420, 0) ||
-           state->ARB_shader_image_load_store_enable);
+   return (state->is_version(420, 320) ||
+           state->ARB_shader_image_load_store_enable ||
+           state->OES_shader_image_atomic_enable);
+}
+
+static bool
+shader_image_atomic_exchange_float(const _mesa_glsl_parse_state *state)
+{
+   return (state->is_version(450, 320) ||
+           state->OES_shader_image_atomic_enable);
 }
 
 static bool
@@ -586,6 +594,7 @@ private:
       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)
    };
 
    /**
@@ -2981,7 +2990,9 @@ builtin_builder::add_image_functions(bool glsl)
    add_image_function((glsl ? "imageAtomicExchange" :
                        "__intrinsic_image_atomic_exchange"),
                       "__intrinsic_image_atomic_exchange",
-                      &builtin_builder::_image_prototype, 1, atom_flags);
+                      &builtin_builder::_image_prototype, 1,
+                      (flags | IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE |
+                       IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE));
 
    add_image_function((glsl ? "imageAtomicCompSwap" :
                        "__intrinsic_image_atomic_comp_swap"),
@@ -5250,7 +5261,11 @@ builtin_builder::_image_prototype(const glsl_type *image_type,
       glsl_type::ivec(image_type->coordinate_components()), "coord");
 
    const builtin_available_predicate avail =
-      (flags & IMAGE_FUNCTION_AVAIL_ATOMIC ? shader_image_atomic :
+      (((flags & IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE) &&
+        image_type->sampled_type == GLSL_TYPE_FLOAT) ?
+       shader_image_atomic_exchange_float :
+       flags & (IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE |
+                IMAGE_FUNCTION_AVAIL_ATOMIC) ? shader_image_atomic :
        shader_image_load_store);
    ir_function_signature *sig = new_sig(ret_type, avail, 2, image, coord);
 
-- 
2.7.0



More information about the mesa-dev mailing list