summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Eric Pelloux-Prayer <[email protected]>2019-07-12 16:38:44 +0200
committerMarek Olšák <[email protected]>2019-08-06 17:41:00 -0400
commitfc0a2e5d017dcb9e7f236d69745dff89e116b92e (patch)
tree6698f874e9dd3389180554055aa6c299926e89e9
parent70a47fb0327b85b3a71c12ceff6997e23efa3440 (diff)
glsl: add EXT_shader_image_load_store new image functions
This extension has 2 functions that are missing from the ARB versions: - imageAtomicIncWrap - imageAtomicDecWrap Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r--src/compiler/glsl/builtin_functions.cpp12
-rw-r--r--src/compiler/glsl/ir.h2
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp8
3 files changed, 22 insertions, 0 deletions
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
index 095eb84055a..95d45033a01 100644
--- a/src/compiler/glsl/builtin_functions.cpp
+++ b/src/compiler/glsl/builtin_functions.cpp
@@ -4423,6 +4423,18 @@ builtin_builder::add_image_functions(bool glsl)
flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE |
IMAGE_FUNCTION_MS_ONLY,
ir_intrinsic_image_samples);
+
+ /* EXT_shader_image_load_store */
+ add_image_function(glsl ? "imageAtomicIncWrap" : "__intrinsic_image_atomic_inc_wrap",
+ "__intrinsic_image_atomic_inc_wrap",
+ &builtin_builder::_image_prototype, 1,
+ (atom_flags | IMAGE_FUNCTION_EXT_ONLY),
+ ir_intrinsic_image_atomic_inc_wrap);
+ add_image_function(glsl ? "imageAtomicDecWrap" : "__intrinsic_image_atomic_dec_wrap",
+ "__intrinsic_image_atomic_dec_wrap",
+ &builtin_builder::_image_prototype, 1,
+ (atom_flags | IMAGE_FUNCTION_EXT_ONLY),
+ ir_intrinsic_image_atomic_dec_wrap);
}
ir_variable *
diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
index 6f7b4542b1d..441500ec31e 100644
--- a/src/compiler/glsl/ir.h
+++ b/src/compiler/glsl/ir.h
@@ -1106,6 +1106,8 @@ enum ir_intrinsic_id {
ir_intrinsic_image_atomic_comp_swap,
ir_intrinsic_image_size,
ir_intrinsic_image_samples,
+ ir_intrinsic_image_atomic_inc_wrap,
+ ir_intrinsic_image_atomic_dec_wrap,
ir_intrinsic_ssbo_load,
ir_intrinsic_ssbo_store = MAKE_INTRINSIC_FOR_TYPE(store, ssbo),
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index ad5c2f5e623..ff2ec0726e8 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -3938,6 +3938,12 @@ glsl_to_tgsi_visitor::visit_image_intrinsic(ir_call *ir)
case ir_intrinsic_image_atomic_comp_swap:
opcode = TGSI_OPCODE_ATOMCAS;
break;
+ case ir_intrinsic_image_atomic_inc_wrap:
+ opcode = TGSI_OPCODE_ATOMINC_WRAP;
+ break;
+ case ir_intrinsic_image_atomic_dec_wrap:
+ opcode = TGSI_OPCODE_ATOMDEC_WRAP;
+ break;
default:
assert(!"Unexpected intrinsic");
return;
@@ -4063,6 +4069,8 @@ glsl_to_tgsi_visitor::visit(ir_call *ir)
case ir_intrinsic_image_atomic_comp_swap:
case ir_intrinsic_image_size:
case ir_intrinsic_image_samples:
+ case ir_intrinsic_image_atomic_inc_wrap:
+ case ir_intrinsic_image_atomic_dec_wrap:
visit_image_intrinsic(ir);
return;