summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavutil/opencl.c42
-rw-r--r--libavutil/opencl.h10
2 files changed, 40 insertions, 12 deletions
diff --git a/libavutil/opencl.c b/libavutil/opencl.c
index 2df565329f..1d78214588 100644
--- a/libavutil/opencl.c
+++ b/libavutil/opencl.c
@@ -181,9 +181,11 @@ static void free_device_list(AVOpenCLDeviceList *device_list)
if (!device_list->platform_node[i])
continue;
for (j = 0; j < device_list->platform_node[i]->device_num; j++) {
+ av_freep(&(device_list->platform_node[i]->device_node[j]->device_name));
av_freep(&(device_list->platform_node[i]->device_node[j]));
}
av_freep(&device_list->platform_node[i]->device_node);
+ av_freep(&(device_list->platform_node[i]->platform_name));
av_freep(&device_list->platform_node[i]);
}
av_freep(&device_list->platform_node);
@@ -198,6 +200,8 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
cl_platform_id *platform_ids = NULL;
cl_device_id *device_ids = NULL;
AVOpenCLDeviceNode *device_node = NULL;
+ size_t platform_name_size = 0;
+ size_t device_name_size = 0;
status = clGetPlatformIDs(0, NULL, &device_list->platform_num);
if (status != CL_SUCCESS) {
av_log(&opencl_ctx, AV_LOG_ERROR,
@@ -232,8 +236,25 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
}
device_list->platform_node[i]->platform_id = platform_ids[i];
status = clGetPlatformInfo(platform_ids[i], CL_PLATFORM_VENDOR,
- sizeof(device_list->platform_node[i]->platform_name),
- device_list->platform_node[i]->platform_name, NULL);
+ 0, NULL, &platform_name_size);
+ if (status != CL_SUCCESS) {
+ av_log(&opencl_ctx, AV_LOG_WARNING,
+ "Could not get size of platform name: %s\n", av_opencl_errstr(status));
+ } else {
+ device_list->platform_node[i]->platform_name = av_malloc(platform_name_size * sizeof(char));
+ if (!device_list->platform_node[i]->platform_name) {
+ av_log(&opencl_ctx, AV_LOG_WARNING,
+ "Could not allocate memory for device name: %s\n", av_opencl_errstr(status));
+ } else {
+ status = clGetPlatformInfo(platform_ids[i], CL_PLATFORM_VENDOR,
+ platform_name_size * sizeof(char),
+ device_list->platform_node[i]->platform_name, NULL);
+ if (status != CL_SUCCESS) {
+ av_log(&opencl_ctx, AV_LOG_WARNING,
+ "Could not get platform name: %s\n", av_opencl_errstr(status));
+ }
+ }
+ }
total_devices_num = 0;
for (j = 0; j < FF_ARRAY_ELEMS(device_type); j++) {
status = clGetDeviceIDs(device_list->platform_node[i]->platform_id,
@@ -271,8 +292,21 @@ static int get_device_list(AVOpenCLDeviceList *device_list)
device_node->device_id = device_ids[k];
device_node->device_type = device_type[j];
status = clGetDeviceInfo(device_node->device_id, CL_DEVICE_NAME,
- sizeof(device_node->device_name), device_node->device_name,
- NULL);
+ 0, NULL, &device_name_size);
+ if (status != CL_SUCCESS) {
+ av_log(&opencl_ctx, AV_LOG_WARNING,
+ "Could not get size of device name: %s\n", av_opencl_errstr(status));
+ continue;
+ }
+ device_node->device_name = av_malloc(device_name_size * sizeof(char));
+ if (!device_node->device_name) {
+ av_log(&opencl_ctx, AV_LOG_WARNING,
+ "Could not allocate memory for device name: %s\n", av_opencl_errstr(status));
+ continue;
+ }
+ status = clGetDeviceInfo(device_node->device_id, CL_DEVICE_NAME,
+ device_name_size * sizeof(char),
+ device_node->device_name, NULL);
if (status != CL_SUCCESS) {
av_log(&opencl_ctx, AV_LOG_WARNING,
"Could not get device name: %s\n", av_opencl_errstr(status));
diff --git a/libavutil/opencl.h b/libavutil/opencl.h
index 0b7b8d4764..e423e5588a 100644
--- a/libavutil/opencl.h
+++ b/libavutil/opencl.h
@@ -44,21 +44,15 @@
#define AV_OPENCL_KERNEL( ... )# __VA_ARGS__
-#define AV_OPENCL_MAX_KERNEL_NAME_SIZE 150
-
-#define AV_OPENCL_MAX_DEVICE_NAME_SIZE 100
-
-#define AV_OPENCL_MAX_PLATFORM_NAME_SIZE 100
-
typedef struct {
int device_type;
- char device_name[AV_OPENCL_MAX_DEVICE_NAME_SIZE];
+ char *device_name;
cl_device_id device_id;
} AVOpenCLDeviceNode;
typedef struct {
cl_platform_id platform_id;
- char platform_name[AV_OPENCL_MAX_PLATFORM_NAME_SIZE];
+ char *platform_name;
int device_num;
AVOpenCLDeviceNode **device_node;
} AVOpenCLPlatformNode;