diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-01-18 17:31:36 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-01-18 17:47:00 +0300 |
commit | 0d8948387e8d9f47e1a2c7f9dd701c81df331bb8 (patch) | |
tree | 88562a152482d1e44ea2e39f14a5c3c6a6dcf659 /intern/cycles | |
parent | 4fde594fda13abf98437bc5d0012decc2bd3d5f6 (diff) |
Cycles: Fix missing OpenCL extensions in certain cases
If extensions string is longer than 1024 then the old code would have
reported empty string instead of extensions.
Now the code does dynamic string allocation to store result of request,
similar to what is done in `OpenCLInfo::get_hardware_id`.
The code looks a bit ugly, but it didn't really change much with this
patch. In other words, the code can become more modern and clear, but
it is considered to be outside of the scope of this change.
Differential Revision: https://developer.blender.org/D10135
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/device/device_opencl.cpp | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp index 39b9ef70192..11376ee4883 100644 --- a/intern/cycles/device/device_opencl.cpp +++ b/intern/cycles/device/device_opencl.cpp @@ -151,8 +151,6 @@ string device_opencl_capabilities() platform_ids.resize(num_platforms); opencl_assert(clGetPlatformIDs(num_platforms, &platform_ids[0], NULL)); - typedef char cl_string[1024]; - # define APPEND_INFO(func, id, name, what, type) \ do { \ type data; \ @@ -160,22 +158,33 @@ string device_opencl_capabilities() opencl_assert(func(id, what, sizeof(data), &data, NULL)); \ result += string_printf("%s: %s\n", name, to_string(data).c_str()); \ } while (false) -# define APPEND_STRING_EXTENSION_INFO(func, id, name, what) \ +# define APPEND_STRING_INFO_IMPL(func, id, name, what, is_optional) \ do { \ - char data[1024] = "\0"; \ + string value; \ size_t length = 0; \ - if (func(id, what, sizeof(data), &data, &length) == CL_SUCCESS) { \ - if (length != 0 && data[0] != '\0') { \ - result += string_printf("%s: %s\n", name, data); \ + if (func(id, what, 0, NULL, &length) == CL_SUCCESS) { \ + vector<char> buffer(length + 1); \ + if (func(id, what, buffer.size(), buffer.data(), NULL) == CL_SUCCESS) { \ + value = string(buffer.data()); \ } \ } \ + if (is_optional && !(length != 0 && value[0] != '\0')) { \ + break; \ + } \ + result += string_printf("%s: %s\n", name, value.c_str()); \ } while (false) +# define APPEND_PLATFORM_STRING_INFO(id, name, what) \ + APPEND_STRING_INFO_IMPL(clGetPlatformInfo, id, "\tPlatform " name, what, false) +# define APPEND_STRING_EXTENSION_INFO(func, id, name, what) \ + APPEND_STRING_INFO_IMPL(clGetPlatformInfo, id, "\tPlatform " name, what, true) # define APPEND_PLATFORM_INFO(id, name, what, type) \ APPEND_INFO(clGetPlatformInfo, id, "\tPlatform " name, what, type) # define APPEND_DEVICE_INFO(id, name, what, type) \ APPEND_INFO(clGetDeviceInfo, id, "\t\t\tDevice " name, what, type) +# define APPEND_DEVICE_STRING_INFO(id, name, what) \ + APPEND_STRING_INFO_IMPL(clGetDeviceInfo, id, "\t\t\tDevice " name, what, false) # define APPEND_DEVICE_STRING_EXTENSION_INFO(id, name, what) \ - APPEND_STRING_EXTENSION_INFO(clGetDeviceInfo, id, "\t\t\tDevice " name, what) + APPEND_STRING_INFO_IMPL(clGetDeviceInfo, id, "\t\t\tDevice " name, what, true) vector<cl_device_id> device_ids; for (cl_uint platform = 0; platform < num_platforms; ++platform) { @@ -183,11 +192,11 @@ string device_opencl_capabilities() result += string_printf("Platform #%u\n", platform); - APPEND_PLATFORM_INFO(platform_id, "Name", CL_PLATFORM_NAME, cl_string); - APPEND_PLATFORM_INFO(platform_id, "Vendor", CL_PLATFORM_VENDOR, cl_string); - APPEND_PLATFORM_INFO(platform_id, "Version", CL_PLATFORM_VERSION, cl_string); - APPEND_PLATFORM_INFO(platform_id, "Profile", CL_PLATFORM_PROFILE, cl_string); - APPEND_PLATFORM_INFO(platform_id, "Extensions", CL_PLATFORM_EXTENSIONS, cl_string); + APPEND_PLATFORM_STRING_INFO(platform_id, "Name", CL_PLATFORM_NAME); + APPEND_PLATFORM_STRING_INFO(platform_id, "Vendor", CL_PLATFORM_VENDOR); + APPEND_PLATFORM_STRING_INFO(platform_id, "Version", CL_PLATFORM_VERSION); + APPEND_PLATFORM_STRING_INFO(platform_id, "Profile", CL_PLATFORM_PROFILE); + APPEND_PLATFORM_STRING_INFO(platform_id, "Extensions", CL_PLATFORM_EXTENSIONS); cl_uint num_devices = 0; opencl_assert( @@ -202,13 +211,13 @@ string device_opencl_capabilities() result += string_printf("\t\tDevice: #%u\n", device); - APPEND_DEVICE_INFO(device_id, "Name", CL_DEVICE_NAME, cl_string); + APPEND_DEVICE_STRING_INFO(device_id, "Name", CL_DEVICE_NAME); APPEND_DEVICE_STRING_EXTENSION_INFO(device_id, "Board Name", CL_DEVICE_BOARD_NAME_AMD); - APPEND_DEVICE_INFO(device_id, "Vendor", CL_DEVICE_VENDOR, cl_string); - APPEND_DEVICE_INFO(device_id, "OpenCL C Version", CL_DEVICE_OPENCL_C_VERSION, cl_string); - APPEND_DEVICE_INFO(device_id, "Profile", CL_DEVICE_PROFILE, cl_string); - APPEND_DEVICE_INFO(device_id, "Version", CL_DEVICE_VERSION, cl_string); - APPEND_DEVICE_INFO(device_id, "Extensions", CL_DEVICE_EXTENSIONS, cl_string); + APPEND_DEVICE_STRING_INFO(device_id, "Vendor", CL_DEVICE_VENDOR); + APPEND_DEVICE_STRING_INFO(device_id, "OpenCL C Version", CL_DEVICE_OPENCL_C_VERSION); + APPEND_DEVICE_STRING_INFO(device_id, "Profile", CL_DEVICE_PROFILE); + APPEND_DEVICE_STRING_INFO(device_id, "Version", CL_DEVICE_VERSION); + APPEND_DEVICE_STRING_INFO(device_id, "Extensions", CL_DEVICE_EXTENSIONS); APPEND_DEVICE_INFO( device_id, "Max clock frequency (MHz)", CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint); APPEND_DEVICE_INFO(device_id, "Max compute units", CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint); @@ -216,9 +225,14 @@ string device_opencl_capabilities() } } -# undef APPEND_STRING_INFO +# undef APPEND_INFO +# undef APPEND_STRING_INFO_IMPL # undef APPEND_PLATFORM_STRING_INFO +# undef APPEND_STRING_EXTENSION_INFO +# undef APPEND_PLATFORM_INFO +# undef APPEND_DEVICE_INFO # undef APPEND_DEVICE_STRING_INFO +# undef APPEND_DEVICE_STRING_EXTENSION_INFO return result; } |