[Beignet] [PATCH] support clGetImageInfo

Homer Hsing homer.xing at intel.com
Tue Jul 9 23:20:57 PDT 2013


clGetImageInfo() is an OpenCL API. It returns information of an image.

This patch makes Piglit test case "clGetImageInfo" pass.

Signed-off-by: Homer Hsing <homer.xing at intel.com>
---
 src/cl_api.c |  7 +++++--
 src/cl_mem.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/cl_mem.h |  3 +++
 3 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/src/cl_api.c b/src/cl_api.c
index dc52f0a..277f7a9 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -573,8 +573,11 @@ clGetImageInfo(cl_mem         image,
                void *         param_value,
                size_t *       param_value_size_ret)
 {
-  NOT_IMPLEMENTED;
-  return 0;
+  return cl_get_image_info(image,
+                           param_name,
+                           param_value_size,
+                           param_value,
+                           param_value_size_ret);
 }
 
 cl_int
diff --git a/src/cl_mem.c b/src/cl_mem.c
index 5465aa9..064ecb3 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -90,6 +90,57 @@ cl_get_mem_object_info(cl_mem mem,
   return CL_SUCCESS;
 }
 
+LOCAL cl_int
+cl_get_image_info(cl_mem mem,
+                  cl_image_info param_name,
+                  size_t param_value_size,
+                  void *param_value,
+                  size_t *param_value_size_ret)
+{
+  if(!mem || !mem->is_image)
+    return CL_INVALID_MEM_OBJECT;
+
+  switch(param_name)
+  {
+    FIELD_SIZE(IMAGE_FORMAT, cl_image_format);
+    FIELD_SIZE(IMAGE_ELEMENT_SIZE, size_t);
+    FIELD_SIZE(IMAGE_ROW_PITCH, size_t);
+    FIELD_SIZE(IMAGE_SLICE_PITCH, size_t);
+    FIELD_SIZE(IMAGE_WIDTH, size_t);
+    FIELD_SIZE(IMAGE_HEIGHT, size_t);
+    FIELD_SIZE(IMAGE_DEPTH, size_t);
+  default:
+    return CL_INVALID_VALUE;
+  }
+
+  switch(param_name)
+  {
+  case CL_IMAGE_FORMAT:
+    *(cl_image_format *)param_value = mem->fmt;
+    break;
+  case CL_IMAGE_ELEMENT_SIZE:
+    *(size_t *)param_value = mem->bpp;
+    break;
+  case CL_IMAGE_ROW_PITCH:
+    *(size_t *)param_value = mem->row_pitch;
+    break;
+  case CL_IMAGE_SLICE_PITCH:
+    *(size_t *)param_value = mem->slice_pitch;
+    break;
+  case CL_IMAGE_WIDTH:
+    *(size_t *)param_value = mem->w;
+    break;
+  case CL_IMAGE_HEIGHT:
+    *(size_t *)param_value = mem->h;
+    break;
+  case CL_IMAGE_DEPTH:
+    *(size_t *)param_value = mem->depth;
+    break;
+  }
+
+  return CL_SUCCESS;
+}
+
 #undef FIELD_SIZE
 
 static cl_mem
diff --git a/src/cl_mem.h b/src/cl_mem.h
index c204992..c63bf6c 100644
--- a/src/cl_mem.h
+++ b/src/cl_mem.h
@@ -73,6 +73,9 @@ struct _cl_mem {
 /* Query information about a memory object */
 extern cl_int cl_get_mem_object_info(cl_mem, cl_mem_info, size_t, void *, size_t *);
 
+/* Query information about an image */
+extern cl_int cl_get_image_info(cl_mem, cl_image_info, size_t, void *, size_t *);
+
 /* Create a new memory object and initialize it with possible user data */
 extern cl_mem cl_mem_new(cl_context, cl_mem_flags, size_t, void*, cl_int*);
 
-- 
1.8.1.2



More information about the Beignet mailing list