Handle size queries in clGetDeviceInfo better
authorSimon Richter <Simon.Richter@hogyros.de>
Fri, 19 Apr 2013 11:39:11 +0000 (13:39 +0200)
committerZhigang Gong <zhigang.gong@linux.intel.com>
Wed, 24 Apr 2013 08:40:59 +0000 (16:40 +0800)
This allows size queries on all fields.

Signed-off-by: Simon Richter <Simon.Richter@hogyros.de>
Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
src/cl_device_id.c

index 9f8e6ad..114a0ce 100644 (file)
@@ -135,30 +135,28 @@ cl_get_device_ids(cl_platform_id    platform,
 
 #define DECL_FIELD(CASE,FIELD)                                      \
   case JOIN(CL_DEVICE_,CASE):                                       \
-      if (param_value_size < sizeof(((cl_device_id)NULL)->FIELD))   \
-        return CL_INVALID_VALUE;                                    \
-      if (param_value_size_ret != NULL)                             \
-        *param_value_size_ret = sizeof(((cl_device_id)NULL)->FIELD);\
-      memcpy(param_value,                                           \
-             &device->FIELD,                                        \
-             sizeof(((cl_device_id)NULL)->FIELD));                  \
-        return CL_SUCCESS;
+    if (param_value_size_ret) {                                     \
+      *param_value_size_ret = sizeof device->FIELD;                 \
+      if (!param_value)                                             \
+        return CL_SUCCESS;                                          \
+    }                                                               \
+    if (param_value_size < sizeof device->FIELD)                    \
+      return CL_INVALID_VALUE;                                      \
+    memcpy(param_value, &device->FIELD, sizeof device->FIELD);      \
+    return CL_SUCCESS;
 
 #define DECL_STRING_FIELD(CASE,FIELD)                               \
   case JOIN(CL_DEVICE_,CASE):                                       \
+    if (param_value_size_ret) {                                     \
+      *param_value_size_ret = device->JOIN(FIELD,_sz);              \
+      if (!param_value)                                             \
+        return CL_SUCCESS;                                          \
+    }                                                               \
     if (param_value_size < device->JOIN(FIELD,_sz))                 \
       return CL_INVALID_VALUE;                                      \
-    if (param_value_size_ret != NULL)                               \
-      *param_value_size_ret = device->JOIN(FIELD,_sz);              \
     memcpy(param_value, device->FIELD, device->JOIN(FIELD,_sz));    \
     return CL_SUCCESS;
 
-#define GET_STRING_FIELD_SIZE(CASE,FIELD)                           \
-  case JOIN(CL_DEVICE_,CASE):                                       \
-    if (param_value_size_ret != NULL)                               \
-      *param_value_size_ret = device->JOIN(FIELD,_sz);              \
-    return CL_SUCCESS;
-
 LOCAL cl_int
 cl_get_device_info(cl_device_id     device,
                    cl_device_info   param_name,
@@ -171,18 +169,6 @@ cl_get_device_info(cl_device_id     device,
                device != &intel_hsw_device))
     return CL_INVALID_DEVICE;
 
-  if (param_value == NULL) {
-    switch (param_name) {
-      GET_STRING_FIELD_SIZE(NAME, name)
-      GET_STRING_FIELD_SIZE(VENDOR, vendor)
-      GET_STRING_FIELD_SIZE(VERSION, version)
-      GET_STRING_FIELD_SIZE(PROFILE, profile)
-      GET_STRING_FIELD_SIZE(OPENCL_C_VERSION, opencl_c_version)
-      GET_STRING_FIELD_SIZE(EXTENSIONS, extensions)
-      default: return CL_INVALID_VALUE;
-    }
-  }
-
   /* Find the correct parameter */
   switch (param_name) {
     DECL_FIELD(TYPE, device_type)