On Mon, 2015-09-07 at 00:42 +0200, Serge Martin (EdB) wrote:
> From: Serge Martin <[email protected]>
> 
> ---
>  tests/cl/api/get-mem-object-info.c | 253
> +++++++++++++++++++++++++++++++------
>  1 file changed, 213 insertions(+), 40 deletions(-)
> 
> diff --git a/tests/cl/api/get-mem-object-info.c b/tests/cl/api/get
> -mem-object-info.c
> index c24b51d..b68262c 100644
> --- a/tests/cl/api/get-mem-object-info.c
> +++ b/tests/cl/api/get-mem-object-info.c
> @@ -46,6 +46,127 @@ PIGLIT_CL_API_TEST_CONFIG_BEGIN
>  
>  PIGLIT_CL_API_TEST_CONFIG_END
>  
> +#define BUFFER_SIZE 512
> +
> +static bool
> +test(int n,
> +     cl_mem memobj,
> +     cl_mem_info param_name,
> +     cl_mem_object_type mem_type,
> +     cl_mem_flags mem_flags,
> +     size_t mem_size,
> +     void *mem_ptr,
> +     const struct piglit_cl_api_test_env* env,
> +     cl_mem mem_parent,
> +     size_t mem_offset,
> +     enum piglit_result* result) {
> +     cl_int errNo;
> +     size_t param_value_size;
> +     void* param_value;
> +
> +     errNo = clGetMemObjectInfo(memobj,
> +                                param_name,
> +                                0,
> +                                NULL,
> +                                &param_value_size);
> +     if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +             fprintf(stderr,
> +                     "Buffer %d, failed (error code: %s): Get
> size of %s.\n",
> +                     n,
> +                     piglit_cl_get_error_name(errNo),
> +                     piglit_cl_get_enum_name(param_name));
> +             piglit_merge_result(result, PIGLIT_FAIL);
> +             return false;
> +     }
> +
> +     param_value = malloc(param_value_size);
> +     errNo = clGetMemObjectInfo(memobj,
> +                                param_name,
> +                                param_value_size,
> +                                param_value,
> +                                NULL);
> +     if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +             fprintf(stderr,
> +                     "Buffer %d, failed (error code: %s): Get
> value of %s.\n",
> +                     n,
> +                     piglit_cl_get_error_name(errNo),
> +                     piglit_cl_get_enum_name(param_name));
> +             piglit_merge_result(result, PIGLIT_FAIL);
> +             free(param_value);
> +             return false;
> +     }
> +
> +#define CHECK_SIZE(_type_) \
> +     if (param_value_size != sizeof(_type_)) { \
> +             fprintf(stderr, \
> +                     "Buffer %d, failed: the returned size
> doesn't matches. Expected %lu, got %lu\n", \

"doesn't match"

> +                     n, sizeof(_type_), param_value_size); \
> +             piglit_merge_result(result, PIGLIT_FAIL); \
> +     }
> +
> +#define CHECK_VALUE(_type_, _value_) \
> +     if (*(_type_*)param_value != _value_) { \
> +             fprintf(stderr, \
> +                     "Buffer %d, failed: the returned value
> doesn't matches.\n", \

"doesn't match"

> +                     n); \
> +             piglit_merge_result(result, PIGLIT_FAIL); \
> +     }
> +
> +     switch (param_name) {
> +             case CL_MEM_TYPE:
> +                     CHECK_SIZE(cl_mem_object_type)
> +                     CHECK_VALUE(cl_mem_object_type, mem_type)
> +                     break;
> +             case CL_MEM_FLAGS:
> +                     CHECK_SIZE(cl_mem_flags)
> +                     CHECK_VALUE(cl_mem_flags, mem_flags)
> +                     break;
> +             case CL_MEM_SIZE:
> +                     CHECK_SIZE(size_t)
> +                     CHECK_VALUE(size_t, mem_size)
> +                     break;
> +             case CL_MEM_HOST_PTR:
> +                     CHECK_SIZE(void *)
> +                     CHECK_VALUE(void *, mem_ptr)
> +                     break;
> +             case CL_MEM_MAP_COUNT:
> +                     CHECK_SIZE(cl_uint)
> +                     //stale
> +                     break;
> +             case CL_MEM_REFERENCE_COUNT:
> +                     CHECK_SIZE(cl_uint)
> +                     //stale
> +                     break;
> +             case CL_MEM_CONTEXT:
> +                     CHECK_SIZE(cl_context)
> +                     CHECK_VALUE(cl_context, env->context
> ->cl_ctx)
> +                     break;
> +#if defined(CL_VERSION_1_1)
> +             case CL_MEM_ASSOCIATED_MEMOBJECT:
> +                     if (env->version >= 11) {
> +                             CHECK_SIZE(cl_mem)
> +                             CHECK_VALUE(cl_mem, mem_parent)
> +                     }
> +                     break;
> +             case CL_MEM_OFFSET:
> +                     if (env->version >= 11) {
> +                             CHECK_SIZE(size_t)
> +                             CHECK_VALUE(size_t, mem_offset)
> +                     }
> +                     break;
> +#endif
> +             default:
> +                     fprintf(stderr, "Warn: untested parameter
> %s\n",
> +                            
>  piglit_cl_get_enum_name(param_name));
> +                     piglit_merge_result(result, PIGLIT_WARN);
> +     }
> +
> +#undef CHECK_SIZE
> +#undef CHECK_VALUE
> +
> +     free(param_value);
> +     return true;
> +}
>  
>  enum piglit_result
>  piglit_cl_test(const int argc,
> @@ -57,61 +178,108 @@ piglit_cl_test(const int argc,
>  
>       int i;
>       cl_int errNo;
> -     cl_mem memobj;
> +     cl_mem memobj[3];
> +     char host_mem[BUFFER_SIZE] = {0};
>  
>       size_t param_value_size;
>       void* param_value;
> -     
> +
>       int num_mem_infos = PIGLIT_CL_ENUM_NUM(cl_mem_info, env
> ->version);
>       const cl_mem_info* mem_infos =
> PIGLIT_CL_ENUM_ARRAY(cl_mem_info);
>       
> -     memobj = clCreateBuffer(env->context->cl_ctx,
> -                             CL_MEM_READ_WRITE,
> -                             512,
> -                             NULL,
> -                             &errNo);
> +     memobj[0] = clCreateBuffer(env->context->cl_ctx,
> +                               
>  CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR,
> +                                BUFFER_SIZE,
> +                                host_mem,
> +                                &errNo);
>       if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
>               fprintf(stderr,
> -                     "Failed (error code: %s): Create an event by
> enqueueing a buffer read.\n",
> +                     "Failed (error code: %s): Create buffer
> 0.\n",
>                       piglit_cl_get_error_name(errNo));
>               return PIGLIT_FAIL;
>       }
>  
> -     /*** Normal usage ***/
> -     for(i = 0; i < num_mem_infos; i++) {
> -             printf("%s ",
> piglit_cl_get_enum_name(mem_infos[i]));
> +     memobj[1] = clCreateBuffer(env->context->cl_ctx,
> +                               
>  CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR,
> +                                BUFFER_SIZE,
> +                                host_mem,
> +                                &errNo);
> +     if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> +             fprintf(stderr,
> +                     "Failed (error code: %s): Create buffer
> 1.\n",
> +                     piglit_cl_get_error_name(errNo));
> +             return PIGLIT_FAIL;
> +     }
>  
> -             errNo = clGetMemObjectInfo(memobj,
> -                                        mem_infos[i],
> -                                        0,
> -                                        NULL,
> -                                        &param_value_size);
> -             if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
> -                     fprintf(stderr,
> -                             "Failed (error code: %s): Get size
> of %s.\n",
> -                             piglit_cl_get_error_name(errNo),
> -                            
>  piglit_cl_get_enum_name(mem_infos[i]));
> -                     piglit_merge_result(&result, PIGLIT_FAIL);
> -                     continue;
> -             }
> +#if defined(CL_VERSION_1_1)
> +     if (env->version >= 11) {
> +             cl_buffer_region region;
> +             region.origin = BUFFER_SIZE/2;
> +             region.size = BUFFER_SIZE/2;
>  
> -             param_value = malloc(param_value_size);
> -             errNo = clGetMemObjectInfo(memobj,
> -                                        mem_infos[i],
> -                                        param_value_size,
> -                                        param_value,
> -                                        NULL);
> +             memobj[2] = clCreateSubBuffer(memobj[1],
> +                                           0,
> +                                          
>  CL_BUFFER_CREATE_TYPE_REGION,
> +                                           &region,
> +                                           &errNo);
>               if(!piglit_cl_check_error(errNo, CL_SUCCESS)) {
>                       fprintf(stderr,
> -                             "Failed (error code: %s): Get value
> of %s.\n",
> -                             piglit_cl_get_error_name(errNo),
> -                            
>  piglit_cl_get_enum_name(mem_infos[i]));
> -                     piglit_merge_result(&result, PIGLIT_FAIL);
> +                             "Failed (error code: %s): Create
> buffer 2.\n",
> +                             piglit_cl_get_error_name(errNo));
> +                     return PIGLIT_FAIL;
>               }
> +     }
> +#endif
>  
> -             //TODO: output returned values
> -             printf("\n");
> -             free(param_value);
> +     /*** Normal usage ***/
> +     for(i = 0; i < num_mem_infos; i++) {
> +             void *copy_ptr = host_mem;
> +
> +#if defined(CL_VERSION_1_2)
> +             if (env->version >= 12)
> +                     copy_ptr = NULL;
> +#endif
> +             printf("%s\n",
> piglit_cl_get_enum_name(mem_infos[i]));
> +
> +             test(0,
> +                  memobj[0],
> +                  mem_infos[i],
> +                  CL_MEM_OBJECT_BUFFER,
> +                  CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR,
> +                  BUFFER_SIZE,
> +                  copy_ptr,
> +                  env,
> +                  NULL,
> +                  0,
> +                  &result);
> +
> +             test(1,
> +                  memobj[1],
> +                  mem_infos[i],
> +                  CL_MEM_OBJECT_BUFFER,
> +                  CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR,
> +                  BUFFER_SIZE,
> +                  host_mem,
> +                  env,
> +                  NULL,
> +                  0,
> +                  &result);
> +
> +#if defined(CL_VERSION_1_1)
> +             if (env->version >= 11) {
> +                     test(2,
> +                          memobj[2],
> +                          mem_infos[i],
> +                          CL_MEM_OBJECT_BUFFER,
> +                          CL_MEM_READ_WRITE|CL_MEM_USE_HOST_PTR,
> +                          BUFFER_SIZE/2,
> +                          host_mem + BUFFER_SIZE/2,
> +                          env,
> +                          memobj[1],
> +                          BUFFER_SIZE/2,
> +                          &result);
> +             }
> +#endif
>       }
>  
>       /*** Errors ***/
> @@ -122,7 +290,7 @@ piglit_cl_test(const int argc,
>        * less than size of return type and param_value is not a
> NULL
>        * value.
>        */
> -     errNo = clGetMemObjectInfo(memobj,
> +     errNo = clGetMemObjectInfo(memobj[0],
>                                  CL_DEVICE_NAME,
>                                  0,
>                                  NULL,
> @@ -134,11 +302,13 @@ piglit_cl_test(const int argc,
>               piglit_merge_result(&result, PIGLIT_FAIL);
>       }
>  
> -     errNo = clGetMemObjectInfo(memobj,
> +     param_value = malloc(sizeof(cl_mem_object_type));
> +     errNo = clGetMemObjectInfo(memobj[0],
>                                  CL_MEM_TYPE,
>                                  1,
>                                  param_value,
>                                  NULL);
> +     free(param_value);
>       if(!piglit_cl_check_error(errNo, CL_INVALID_VALUE)) {
>               fprintf(stderr,
>                       "Failed (error code: %s): Trigger
> CL_INVALID_VALUE if size in bytes specified by param_value is less
> than size of return type and param_value is not a NULL value.\n",
> @@ -161,7 +331,10 @@ piglit_cl_test(const int argc,
>               piglit_merge_result(&result, PIGLIT_FAIL);
>       }
>  
> -     clReleaseMemObject(memobj);
> +     clReleaseMemObject(memobj[0]);
> +     clReleaseMemObject(memobj[1]);
> +     if (env->version >= 11)
> +             clReleaseMemObject(memobj[2]);
I think this should be also ifdef-ed. if you build on 1.0 but run on
1.1 it will crash.
>  
>       return result;
>  }

with the above changes
Reviewed-by: Jan Vesely <[email protected]>

just FYI: passes on nVidia CUDA, fails on intel (CL_MEM_HOST_PTR
returns host_ptr even for COPY_HOST_PTR created buffer).

have you considered using subtests for individual queries?

Jan

-- 
Jan Vesely <[email protected]>

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to