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

Zoltán Gilián zoltan.gilian at gmail.com
Mon Aug 3 08:49:10 PDT 2015


Ping.

On Tue, Jul 21, 2015 at 8:12 PM, Zoltan Gilian <zoltan.gilian at gmail.com> 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                              |  6 ++
>  r600/lib/image/get_image_attributes_impl.ll   | 87 +++++++++++++++++++++++++++
>  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, 183 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/get_image_attributes_impl.ll
>  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..349df7e 100644
> --- a/r600/lib/SOURCES
> +++ b/r600/lib/SOURCES
> @@ -10,3 +10,9 @@ 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
> +image/get_image_attributes_impl.ll
> diff --git a/r600/lib/image/get_image_attributes_impl.ll b/r600/lib/image/get_image_attributes_impl.ll
> new file mode 100644
> index 0000000..7f1965d
> --- /dev/null
> +++ b/r600/lib/image/get_image_attributes_impl.ll
> @@ -0,0 +1,87 @@
> +%opencl.image2d_t = type opaque
> +%opencl.image3d_t = type opaque
> +
> +declare i32 @llvm.OpenCL.image.get.resource.id.2d(
> +  %opencl.image2d_t addrspace(1)*) nounwind readnone
> +declare i32 @llvm.OpenCL.image.get.resource.id.3d(
> +  %opencl.image3d_t addrspace(1)*) nounwind readnone
> +
> +declare [3 x i32] @llvm.OpenCL.image.get.size.2d(
> +  %opencl.image2d_t addrspace(1)*) nounwind readnone
> +declare [3 x i32] @llvm.OpenCL.image.get.size.3d(
> +  %opencl.image3d_t addrspace(1)*) nounwind readnone
> +
> +declare [2 x i32] @llvm.OpenCL.image.get.format.2d(
> +  %opencl.image2d_t addrspace(1)*) nounwind readnone
> +declare [2 x i32] @llvm.OpenCL.image.get.format.3d(
> +  %opencl.image3d_t addrspace(1)*) nounwind readnone
> +
> +define i32 @__clc_get_image_width_2d(
> +                          %opencl.image2d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [3 x i32] @llvm.OpenCL.image.get.size.2d(
> +    %opencl.image2d_t addrspace(1)* %img)
> +  %2 = extractvalue [3 x i32] %1, 0
> +  ret i32 %2
> +}
> +define i32 @__clc_get_image_width_3d(
> +                          %opencl.image3d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [3 x i32] @llvm.OpenCL.image.get.size.3d(
> +    %opencl.image3d_t addrspace(1)* %img)
> +  %2 = extractvalue [3 x i32] %1, 0
> +  ret i32 %2
> +}
> +
> +define i32 @__clc_get_image_height_2d(
> +                          %opencl.image2d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [3 x i32] @llvm.OpenCL.image.get.size.2d(
> +    %opencl.image2d_t addrspace(1)* %img)
> +  %2 = extractvalue [3 x i32] %1, 1
> +  ret i32 %2
> +}
> +define i32 @__clc_get_image_height_3d(
> +                          %opencl.image3d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [3 x i32] @llvm.OpenCL.image.get.size.3d(
> +    %opencl.image3d_t addrspace(1)* %img)
> +  %2 = extractvalue [3 x i32] %1, 1
> +  ret i32 %2
> +}
> +
> +define i32 @__clc_get_image_depth_3d(
> +                          %opencl.image3d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [3 x i32] @llvm.OpenCL.image.get.size.3d(
> +    %opencl.image3d_t addrspace(1)* %img)
> +  %2 = extractvalue [3 x i32] %1, 2
> +  ret i32 %2
> +}
> +
> +define i32 @__clc_get_image_channel_data_type_2d(
> +                          %opencl.image2d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [2 x i32] @llvm.OpenCL.image.get.format.2d(
> +    %opencl.image2d_t addrspace(1)* %img)
> +  %2 = extractvalue [2 x i32] %1, 0
> +  ret i32 %2
> +}
> +define i32 @__clc_get_image_channel_data_type_3d(
> +                          %opencl.image3d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [2 x i32] @llvm.OpenCL.image.get.format.3d(
> +    %opencl.image3d_t addrspace(1)* %img)
> +  %2 = extractvalue [2 x i32] %1, 0
> +  ret i32 %2
> +}
> +
> +define i32 @__clc_get_image_channel_order_2d(
> +                          %opencl.image2d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [2 x i32] @llvm.OpenCL.image.get.format.2d(
> +    %opencl.image2d_t addrspace(1)* %img)
> +  %2 = extractvalue [2 x i32] %1, 1
> +  ret i32 %2
> +}
> +define i32 @__clc_get_image_channel_order_3d(
> +                          %opencl.image3d_t addrspace(1)* nocapture %img) #0 {
> +  %1 = tail call [2 x i32] @llvm.OpenCL.image.get.format.3d(
> +    %opencl.image3d_t addrspace(1)* %img)
> +  %2 = extractvalue [2 x i32] %1, 1
> +  ret i32 %2
> +}
> +
> +attributes #0 = { nounwind readnone alwaysinline }
> 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..2a2478f
> --- /dev/null
> +++ b/r600/lib/image/get_image_channel_data_type.cl
> @@ -0,0 +1,13 @@
> +#include <clc/clc.h>
> +
> +_CLC_DECL int __clc_get_image_channel_data_type_2d(image2d_t);
> +_CLC_DECL int __clc_get_image_channel_data_type_3d(image3d_t);
> +
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_channel_data_type(image2d_t image) {
> +  return __clc_get_image_channel_data_type_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_channel_data_type(image3d_t image) {
> +  return __clc_get_image_channel_data_type_3d(image);
> +}
> 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..91e9b89
> --- /dev/null
> +++ b/r600/lib/image/get_image_channel_order.cl
> @@ -0,0 +1,13 @@
> +#include <clc/clc.h>
> +
> +_CLC_DECL int __clc_get_image_channel_order_2d(image2d_t);
> +_CLC_DECL int __clc_get_image_channel_order_3d(image3d_t);
> +
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_channel_order(image2d_t image) {
> +  return __clc_get_image_channel_order_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_channel_order(image3d_t image) {
> +  return __clc_get_image_channel_order_3d(image);
> +}
> diff --git a/r600/lib/image/get_image_depth.cl b/r600/lib/image/get_image_depth.cl
> new file mode 100644
> index 0000000..1864645
> --- /dev/null
> +++ b/r600/lib/image/get_image_depth.cl
> @@ -0,0 +1,8 @@
> +#include <clc/clc.h>
> +
> +_CLC_DECL int __clc_get_image_depth_3d(image3d_t);
> +
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_depth(image3d_t image) {
> +       return __clc_get_image_depth_3d(image);
> +}
> diff --git a/r600/lib/image/get_image_height.cl b/r600/lib/image/get_image_height.cl
> new file mode 100644
> index 0000000..80b3640
> --- /dev/null
> +++ b/r600/lib/image/get_image_height.cl
> @@ -0,0 +1,13 @@
> +#include <clc/clc.h>
> +
> +_CLC_DECL int __clc_get_image_height_2d(image2d_t);
> +_CLC_DECL int __clc_get_image_height_3d(image3d_t);
> +
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_height(image2d_t image) {
> +  return __clc_get_image_height_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_height(image3d_t image) {
> +  return __clc_get_image_height_3d(image);
> +}
> diff --git a/r600/lib/image/get_image_width.cl b/r600/lib/image/get_image_width.cl
> new file mode 100644
> index 0000000..29e4e94
> --- /dev/null
> +++ b/r600/lib/image/get_image_width.cl
> @@ -0,0 +1,13 @@
> +#include <clc/clc.h>
> +
> +_CLC_DECL int __clc_get_image_width_2d(image2d_t);
> +_CLC_DECL int __clc_get_image_width_3d(image3d_t);
> +
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_width(image2d_t image) {
> +  return __clc_get_image_width_2d(image);
> +}
> +_CLC_OVERLOAD _CLC_DEF int
> +get_image_width(image3d_t image) {
> +  return __clc_get_image_width_3d(image);
> +}
> --
> 2.4.6
>




More information about the Libclc-dev mailing list