[Libclc-dev] [PATCH] Add image attribute getter builtins

Zoltan Gilian zoltan.gilian at gmail.com
Fri Jul 10 06:43:22 PDT 2015


Added get_image_* OpenCL builtins to the headers.
Added implementation to the r600 target.
---
 generic/include/clc/clc.h                     |  4 ++++
 generic/include/clc/image/image.h             | 16 ++++++++++++++++
 generic/lib/SOURCES                           |  1 +
 generic/lib/image/get_image_dim.cl            |  9 +++++++++
 r600/lib/SOURCES                              |  5 +++++
 r600/lib/image/attributes.h                   | 11 +++++++++++
 r600/lib/image/get_image_channel_data_type.cl | 13 +++++++++++++
 r600/lib/image/get_image_channel_order.cl     | 13 +++++++++++++
 r600/lib/image/get_image_depth.cl             |  8 ++++++++
 r600/lib/image/get_image_height.cl            | 13 +++++++++++++
 r600/lib/image/get_image_width.cl             | 13 +++++++++++++
 11 files changed, 106 insertions(+)
 create mode 100644 generic/include/clc/image/image.h
 create mode 100644 generic/lib/image/get_image_dim.cl
 create mode 100644 r600/lib/image/attributes.h
 create mode 100644 r600/lib/image/get_image_channel_data_type.cl
 create mode 100644 r600/lib/image/get_image_channel_order.cl
 create mode 100644 r600/lib/image/get_image_depth.cl
 create mode 100644 r600/lib/image/get_image_height.cl
 create mode 100644 r600/lib/image/get_image_width.cl

diff --git a/generic/include/clc/clc.h b/generic/include/clc/clc.h
index cab751d..4199842 100644
--- a/generic/include/clc/clc.h
+++ b/generic/include/clc/clc.h
@@ -210,6 +210,10 @@
 #include <clc/cl_khr_local_int32_extended_atomics/atom_or.h>
 #include <clc/cl_khr_local_int32_extended_atomics/atom_xor.h>
 
+/* 6.11.13 Image Read and Write Functions */
+
+#include <clc/image/image.h>
+
 /* libclc internal defintions */
 #ifdef __CLC_INTERNAL
 #include <math/clc_nextafter.h>
diff --git a/generic/include/clc/image/image.h b/generic/include/clc/image/image.h
new file mode 100644
index 0000000..9c97563
--- /dev/null
+++ b/generic/include/clc/image/image.h
@@ -0,0 +1,16 @@
+_CLC_OVERLOAD _CLC_DECL int get_image_width (image2d_t image);
+_CLC_OVERLOAD _CLC_DECL int get_image_width (image3d_t image);
+
+_CLC_OVERLOAD _CLC_DECL int get_image_height (image2d_t image);
+_CLC_OVERLOAD _CLC_DECL int get_image_height (image3d_t image);
+
+_CLC_OVERLOAD _CLC_DECL int get_image_depth (image3d_t image);
+
+_CLC_OVERLOAD _CLC_DECL int get_image_channel_data_type (image2d_t image);
+_CLC_OVERLOAD _CLC_DECL int get_image_channel_data_type (image3d_t image);
+
+_CLC_OVERLOAD _CLC_DECL int get_image_channel_order (image2d_t image);
+_CLC_OVERLOAD _CLC_DECL int get_image_channel_order (image3d_t image);
+
+_CLC_OVERLOAD _CLC_DECL int2 get_image_dim (image2d_t image);
+_CLC_OVERLOAD _CLC_DECL int4 get_image_dim (image3d_t image);
diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
index 565404b..d39c19b 100644
--- a/generic/lib/SOURCES
+++ b/generic/lib/SOURCES
@@ -129,3 +129,4 @@ shared/vload.cl
 shared/vstore.cl
 workitem/get_global_id.cl
 workitem/get_global_size.cl
+image/get_image_dim.cl
diff --git a/generic/lib/image/get_image_dim.cl b/generic/lib/image/get_image_dim.cl
new file mode 100644
index 0000000..26dbd00
--- /dev/null
+++ b/generic/lib/image/get_image_dim.cl
@@ -0,0 +1,9 @@
+#include <clc/clc.h>
+
+_CLC_OVERLOAD _CLC_DEF int2 get_image_dim (image2d_t image) {
+  return (int2)(get_image_width(image), get_image_height(image));
+}
+_CLC_OVERLOAD _CLC_DEF int4 get_image_dim (image3d_t image) {
+  return (int4)(get_image_width(image), get_image_height(image),
+                get_image_depth(image), 0);
+}
diff --git a/r600/lib/SOURCES b/r600/lib/SOURCES
index 5cdb14a..afb7c07 100644
--- a/r600/lib/SOURCES
+++ b/r600/lib/SOURCES
@@ -10,3 +10,8 @@ workitem/get_global_size.ll
 workitem/get_work_dim.ll
 synchronization/barrier.cl
 synchronization/barrier_impl.ll
+image/get_image_width.cl
+image/get_image_height.cl
+image/get_image_depth.cl
+image/get_image_channel_data_type.cl
+image/get_image_channel_order.cl
diff --git a/r600/lib/image/attributes.h b/r600/lib/image/attributes.h
new file mode 100644
index 0000000..3f34f77
--- /dev/null
+++ b/r600/lib/image/attributes.h
@@ -0,0 +1,11 @@
+enum {
+	IMAGE_WIDTH = 0,
+	IMAGE_HEIGHT = 1,
+	IMAGE_DEPTH = 2,
+	IMAGE_CHANNEL_DATA_TYPE = 3,
+	IMAGE_CHANNEL_ORDER = 4,
+};
+
+int __clc_read_image_attribute(int img_id, int attr_id) __asm("llvm.r600.read.image.attribute");
+int __clc_get_image_id_2d(image2d_t) __asm("llvm.AMDGPU.get.image.id.2d");
+int __clc_get_image_id_3d(image3d_t) __asm("llvm.AMDGPU.get.image.id.3d");
diff --git a/r600/lib/image/get_image_channel_data_type.cl b/r600/lib/image/get_image_channel_data_type.cl
new file mode 100644
index 0000000..f8e73c5
--- /dev/null
+++ b/r600/lib/image/get_image_channel_data_type.cl
@@ -0,0 +1,13 @@
+#include <clc/clc.h>
+#include "attributes.h"
+
+_CLC_OVERLOAD _CLC_DEF int
+get_image_channel_data_type(image2d_t image) {
+	int image_id = __clc_get_image_id_2d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_CHANNEL_DATA_TYPE);
+}
+_CLC_OVERLOAD _CLC_DEF int
+get_image_channel_data_type(image3d_t image) {
+	int image_id = __clc_get_image_id_3d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_CHANNEL_DATA_TYPE);
+}
diff --git a/r600/lib/image/get_image_channel_order.cl b/r600/lib/image/get_image_channel_order.cl
new file mode 100644
index 0000000..77516fd
--- /dev/null
+++ b/r600/lib/image/get_image_channel_order.cl
@@ -0,0 +1,13 @@
+#include <clc/clc.h>
+#include "attributes.h"
+
+_CLC_OVERLOAD _CLC_DEF int
+get_image_channel_order(image2d_t image) {
+	int image_id = __clc_get_image_id_2d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_CHANNEL_ORDER);
+}
+_CLC_OVERLOAD _CLC_DEF int
+get_image_channel_order(image3d_t image) {
+	int image_id = __clc_get_image_id_3d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_CHANNEL_ORDER);
+}
diff --git a/r600/lib/image/get_image_depth.cl b/r600/lib/image/get_image_depth.cl
new file mode 100644
index 0000000..8dfc123
--- /dev/null
+++ b/r600/lib/image/get_image_depth.cl
@@ -0,0 +1,8 @@
+#include <clc/clc.h>
+#include "attributes.h"
+
+_CLC_OVERLOAD _CLC_DEF int
+get_image_depth(image3d_t image) {
+	int image_id = __clc_get_image_id_3d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_DEPTH);
+}
diff --git a/r600/lib/image/get_image_height.cl b/r600/lib/image/get_image_height.cl
new file mode 100644
index 0000000..5609e1a
--- /dev/null
+++ b/r600/lib/image/get_image_height.cl
@@ -0,0 +1,13 @@
+#include <clc/clc.h>
+#include "attributes.h"
+
+_CLC_OVERLOAD _CLC_DEF int
+get_image_height(image2d_t image) {
+	int image_id = __clc_get_image_id_2d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_HEIGHT);
+}
+_CLC_OVERLOAD _CLC_DEF int
+get_image_height(image3d_t image) {
+	int image_id = __clc_get_image_id_3d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_HEIGHT);
+}
diff --git a/r600/lib/image/get_image_width.cl b/r600/lib/image/get_image_width.cl
new file mode 100644
index 0000000..e21182e
--- /dev/null
+++ b/r600/lib/image/get_image_width.cl
@@ -0,0 +1,13 @@
+#include <clc/clc.h>
+#include "attributes.h"
+
+_CLC_OVERLOAD _CLC_DEF int
+get_image_width(image2d_t image) {
+	int image_id = __clc_get_image_id_2d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_WIDTH);
+}
+_CLC_OVERLOAD _CLC_DEF int
+get_image_width(image3d_t image) {
+	int image_id = __clc_get_image_id_3d(image);
+	return __clc_read_image_attribute(image_id, IMAGE_WIDTH);
+}
-- 
2.4.2





More information about the Libclc-dev mailing list