From: Luo <xionghu....@intel.com> the option CL_KERNEL_GLOBAL_WORK_SIZE for clGetKernelWorkGroupInfo should call built in kernel or custom device according to the spec, this patch calls the built in kernel to query the GLOBAL_WORK_SIZE.
v2: use built in kernel to qury the GLOBAL_WORK_SIZE if exist, dummy kernel for other options, handle the case when no built in kernel is provided. v3: fix indent issue; loop CL_KERNEL_GLOBAL_WORK_SIZE out, test it with the platform supports opencl-1.2. Signed-off-by: Luo <xionghu....@intel.com> --- tests/cl/api/get-kernel-work-group-info.c | 127 +++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/tests/cl/api/get-kernel-work-group-info.c b/tests/cl/api/get-kernel-work-group-info.c index 47d09da..f3fd6e5 100644 --- a/tests/cl/api/get-kernel-work-group-info.c +++ b/tests/cl/api/get-kernel-work-group-info.c @@ -61,6 +61,11 @@ piglit_cl_test(const int argc, int i; cl_int errNo; cl_kernel kernel; +#ifdef CL_VERSION_1_2 + cl_program built_in_prog = NULL; + cl_kernel built_in_kernel = NULL; + size_t built_in_kernels_size; +#endif size_t param_value_size; void* param_value; @@ -84,6 +89,17 @@ piglit_cl_test(const int argc, for(i = 0; i < num_kernel_work_group_infos; i++) { printf("%s ", piglit_cl_get_enum_name(kernel_work_group_infos[i])); +#ifdef CL_VERSION_1_2 + if(kernel_work_group_infos[i] == CL_KERNEL_GLOBAL_WORK_SIZE){ + if(env->version >= 12) { + continue; + }else{ + fprintf(stderr, "Could not query CL_KERNEL_GLOBAL_WORK_SIZE. Piglit was compiled against OpenCL version >= 1.2 and cannot run this test for versions < 1.2 because CL_KERNEL_GLOBAL_WORK_SIZE option is not present.\n"); + piglit_merge_result(&result, PIGLIT_FAIL); + } + } +#endif + errNo = clGetKernelWorkGroupInfo(kernel, env->device_id, kernel_work_group_infos[i], @@ -187,6 +203,117 @@ piglit_cl_test(const int argc, piglit_merge_result(&result, PIGLIT_FAIL); } +#ifdef CL_VERSION_1_2 + if(env->version < 12){ + fprintf(stderr, "Could not query CL_KERNEL_GLOBAL_WORK_SIZE. Piglit was compiled against OpenCL version >= 1.2 and cannot run this test for versions < 1.2 because CL_KERNEL_GLOBAL_WORK_SIZE option is not present.\n"); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + //use builtin kernel to test CL_KERNEL_GLOBAL_WORK_SIZE. + errNo = clGetDeviceInfo(env->device_id, CL_DEVICE_BUILT_IN_KERNELS, 0, 0, &built_in_kernels_size); + if(!piglit_cl_check_error(errNo, CL_SUCCESS)) { + fprintf(stderr, + "Failed (error code: %s): Get Device Info.\n", + piglit_cl_get_error_name(errNo)); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + if(built_in_kernels_size != 0) + { + char* built_in_kernel_names; + char* kernel_name; + size_t ret_sz; + built_in_kernel_names = (char* )malloc(built_in_kernels_size * sizeof(char) ); + + errNo = clGetDeviceInfo(env->device_id, CL_DEVICE_BUILT_IN_KERNELS, built_in_kernels_size, (void*)built_in_kernel_names, &ret_sz); + if(!piglit_cl_check_error(errNo, CL_SUCCESS)) { + fprintf(stderr, + "Failed (error code: %s): Get Device Info.\n", + piglit_cl_get_error_name(errNo)); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + built_in_prog = clCreateProgramWithBuiltInKernels(env->context->cl_ctx, 1, &env->device_id, built_in_kernel_names, &errNo); + if(!piglit_cl_check_error(errNo, CL_SUCCESS)) { + fprintf(stderr, + "Failed (error code: %s): Create BuiltIn Program.\n", + piglit_cl_get_error_name(errNo)); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + kernel_name = strtok(built_in_kernel_names, ";"); + + built_in_kernel = clCreateKernel(built_in_prog, kernel_name, &errNo); + if(!piglit_cl_check_error(errNo, CL_SUCCESS)) { + fprintf(stderr, + "Failed (error code: %s): Create kernel.\n", + piglit_cl_get_error_name(errNo)); + piglit_merge_result(&result, PIGLIT_FAIL); + } + free(built_in_kernel_names); + /* + * CL_INVALID_VALUE if kernel is not a built in kernel. + */ + errNo = clGetKernelWorkGroupInfo(kernel, + env->device_id, + CL_KERNEL_GLOBAL_WORK_SIZE, + 0, + NULL, + ¶m_value_size); + if(!piglit_cl_check_error(errNo, CL_INVALID_VALUE)) { + fprintf(stderr, + "Failed (error code: %s): Trigger CL_INVALID_VALUE if kernel is not a builtin kernel for CL_KERNEL_GLOBAL_WORK_SIZE.\n", + piglit_cl_get_error_name(errNo)); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + if(built_in_kernel != NULL) { + errNo = clGetKernelWorkGroupInfo(built_in_kernel, + env->device_id, + CL_KERNEL_GLOBAL_WORK_SIZE, + 0, + NULL, + ¶m_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(kernel_work_group_infos[i])); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + param_value = malloc(param_value_size); + errNo = clGetKernelWorkGroupInfo(built_in_kernel, + env->device_id, + CL_KERNEL_GLOBAL_WORK_SIZE, + param_value_size, + param_value, + NULL); + 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(kernel_work_group_infos[i])); + piglit_merge_result(&result, PIGLIT_FAIL); + } + + //TODO: output returned values + printf("\n"); + free(param_value); + }else{ + fprintf(stderr, + "built in kernel create failed.\n"); + piglit_merge_result(&result, PIGLIT_FAIL); + } + clReleaseKernel(built_in_kernel); + clReleaseProgram(built_in_prog); + }else{ + fprintf(stderr, + "no built in kernel provided.\n"); + piglit_merge_result(&result, PIGLIT_WARN); + } +#endif + clReleaseKernel(kernel); return result; -- 1.7.9.5 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit