[Libclc-dev] [PATCH] Add image attribute getter builtins
Tom Stellard
tom at stellard.net
Fri Jul 10 14:10:18 PDT 2015
On Fri, Jul 10, 2015 at 03:43:22PM +0200, Zoltan Gilian wrote:
> 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");
You should replace these with calls to __builtin_amdgpu_* calls.
> 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