/* * Common functions for this set of filters. * This file is part of ufo-serge filter set. * Copyright (C) 2016 Serge Cohen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Serge Cohen */ #include "config.h" #include "ufo-sxc-common.h" // Required headers : #include GValue * get_device_info (UfoGpuNode *node, cl_device_info param_name) { cl_command_queue cmd_queue; cl_device_id dev_cl; cmd_queue = ufo_gpu_node_get_cmd_queue (node); UFO_RESOURCES_CHECK_CLERR(clGetCommandQueueInfo(cmd_queue, CL_QUEUE_DEVICE, sizeof(cl_device_id), &dev_cl, NULL)); cl_uint uint_val; cl_ulong ulong_val; cl_bool bool_val; size_t sizet_val; size_t sizet_x3_val[3]; char string_val[2048]; // Getting ready to output the value/GValue GValue *value; value = g_new0 (GValue, 1); memset (value, 0, sizeof (GValue)); switch (param_name) { // All the next ones are cl_uint, so sharing the code : case CL_DEVICE_VENDOR_ID: case CL_DEVICE_MAX_COMPUTE_UNITS: case CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF: case CL_DEVICE_MAX_CLOCK_FREQUENCY: case CL_DEVICE_ADDRESS_BITS: case CL_DEVICE_MAX_READ_IMAGE_ARGS: case CL_DEVICE_MAX_WRITE_IMAGE_ARGS: case CL_DEVICE_MAX_SAMPLERS: case CL_DEVICE_MEM_BASE_ADDR_ALIGN: case CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: case CL_DEVICE_MAX_CONSTANT_ARGS: case CL_DEVICE_PARTITION_MAX_SUB_DEVICES: case CL_DEVICE_REFERENCE_COUNT: UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, param_name, sizeof(cl_uint), &uint_val, NULL)); g_value_init (value, G_TYPE_UINT); g_value_set_uint (value, uint_val); break; //All the next ones are cl_ulong, so sharing the code : case CL_DEVICE_MAX_MEM_ALLOC_SIZE: case CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: case CL_DEVICE_GLOBAL_MEM_SIZE: case CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: case CL_DEVICE_LOCAL_MEM_SIZE: UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, param_name, sizeof(cl_ulong), &ulong_val, NULL)); g_value_init (value, G_TYPE_ULONG); g_value_set_ulong (value, ulong_val); break; //All the next ones are cl_bool, so sharing the code : case CL_DEVICE_IMAGE_SUPPORT: case CL_DEVICE_ERROR_CORRECTION_SUPPORT: case CL_DEVICE_HOST_UNIFIED_MEMORY: case CL_DEVICE_ENDIAN_LITTLE: case CL_DEVICE_AVAILABLE: case CL_DEVICE_COMPILER_AVAILABLE: case CL_DEVICE_LINKER_AVAILABLE: UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, param_name, sizeof(cl_bool), &bool_val, NULL)); g_value_init (value, G_TYPE_BOOLEAN); g_value_set_boolean (value, bool_val); break; //All the next ones are size_t, so sharing the code : case CL_DEVICE_MAX_WORK_GROUP_SIZE: case CL_DEVICE_IMAGE2D_MAX_WIDTH: case CL_DEVICE_IMAGE2D_MAX_HEIGHT: case CL_DEVICE_IMAGE3D_MAX_WIDTH: case CL_DEVICE_IMAGE3D_MAX_HEIGHT: case CL_DEVICE_IMAGE3D_MAX_DEPTH: case CL_DEVICE_IMAGE_MAX_BUFFER_SIZE: case CL_DEVICE_IMAGE_MAX_ARRAY_SIZE: case CL_DEVICE_MAX_PARAMETER_SIZE: case CL_DEVICE_PROFILING_TIMER_RESOLUTION: UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, param_name, sizeof(size_t), &sizet_val, NULL)); g_value_init (value, G_TYPE_ULONG); g_value_set_ulong (value, sizet_val); break; //All the next ones are size_t[], so sharing the code : case CL_DEVICE_MAX_WORK_ITEM_SIZES: UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, param_name, sizeof(sizet_x3_val), sizet_x3_val, NULL)); g_free(value); value = g_new0 (GValue, 3); memset (value, 0, 3*sizeof (GValue)); g_value_init (value, G_TYPE_ULONG); g_value_set_ulong (value, sizet_x3_val[0]); g_value_init (value+1, G_TYPE_ULONG); g_value_set_ulong (value+1, sizet_x3_val[1]); g_value_init (value+2, G_TYPE_ULONG); g_value_set_ulong (value+2, sizet_x3_val[2]); break; //All the next ones are char[], so sharing the code : case CL_DEVICE_BUILT_IN_KERNELS: case CL_DEVICE_NAME: case CL_DEVICE_VENDOR: case CL_DRIVER_VERSION: case CL_DEVICE_PROFILE: case CL_DEVICE_VERSION: case CL_DEVICE_OPENCL_C_VERSION: case CL_DEVICE_EXTENSIONS: UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, param_name, sizeof(string_val), string_val, NULL)); g_value_init (value, G_TYPE_STRING); g_value_set_string (value, string_val); break; } return value; } gboolean device_has_extension (UfoGpuNode *node, const char * i_ext_name) { cl_command_queue cmd_queue; cl_device_id dev_cl; cmd_queue = ufo_gpu_node_get_cmd_queue (node); UFO_RESOURCES_CHECK_CLERR(clGetCommandQueueInfo(cmd_queue, CL_QUEUE_DEVICE, sizeof(cl_device_id), &dev_cl, NULL)); char exts_val[2048]; char *ret_strstr = NULL; UFO_RESOURCES_CHECK_CLERR (clGetDeviceInfo (dev_cl, CL_DEVICE_EXTENSIONS, sizeof(exts_val), exts_val, NULL)); ret_strstr = strstr(exts_val, i_ext_name); return(NULL != ret_strstr); }