summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/openclwrapper.c157
1 files changed, 95 insertions, 62 deletions
diff --git a/libhb/openclwrapper.c b/libhb/openclwrapper.c
index 8ca2f9f51..1cf52fdc2 100644
--- a/libhb/openclwrapper.c
+++ b/libhb/openclwrapper.c
@@ -735,40 +735,35 @@ int hb_cached_of_kerner_prg( const GPUEnv *gpu_env, const char * cl_file_name )
int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
int indx, const char *build_option )
{
- cl_int status;
- size_t length;
- char *source_str;
- const char *source;
- size_t source_size[1];
- char *buildLog = NULL;
- int b_error, binary_status, binaryExisted;
- char * binary;
- cl_uint numDevices;
- cl_device_id *devices;
- FILE * fd;
- FILE * fd1;
- int idx;
-
- if( hb_cached_of_kerner_prg( gpu_info, filename ) == 1 )
- return (1);
+ cl_int status;
+ size_t length;
+ char *source_str = NULL;
+ const char *source;
+ size_t source_size[1];
+ char *buildLog = NULL;
+ int b_error, binary_status, binaryExisted;
+ char *binary;
+ cl_uint numDevices;
+ cl_device_id *devices = NULL;
+ FILE *fd = NULL;
+ FILE *fd1 = NULL;
+ int idx;
+ int ret_value = 1;
+
+ if (hb_cached_of_kerner_prg(gpu_info, filename) == 1)
+ return 1;
idx = gpu_info->file_count;
#ifdef USE_EXTERNAL_KERNEL
- status = hb_convert_to_string( filename, &source_str, gpu_info, idx );
- if( status == 0 )
- return(0);
+ status = hb_convert_to_string(filename, &source_str, gpu_info, idx);
+ if (status == 0)
+ return 0;
#else
int kernel_src_size = strlen(kernel_src_scale) + strlen(kernel_src_yadif_filter);
-// char *scale_src;
-// status = hb_convert_to_string("./scale_kernels.cl", &scale_src, gpu_info, idx);
-// if (status != 0)
-// kernel_src_size += strlen(scale_src);
-
source_str = (char*)malloc( kernel_src_size + 2 );
strcpy( source_str, kernel_src_scale );
-// strcat( source_str, scale_src ); //
strcat( source_str, kernel_src_yadif_filter );
#endif
@@ -777,8 +772,9 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
if (hb_ocl == NULL)
{
- hb_error("hb_compile_kernel_file: OpenCL support not available");
- return 0;
+ hb_error("OpenCL: Support is not available");
+ ret_value = 0;
+ goto to_exit;
}
if ((binaryExisted = hb_binary_generated(gpu_info->context, filename, &fd)) == 1)
@@ -788,12 +784,16 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
if (status != CL_SUCCESS)
{
hb_log("OpenCL: Unable to get the number of devices in context.");
- return 0;
+ ret_value = 0;
+ goto to_exit;
}
devices = (cl_device_id*)malloc(sizeof(cl_device_id) * numDevices);
if (devices == NULL)
- return 0;
+ {
+ ret_value = 0;
+ goto to_exit;
+ }
length = 0;
b_error = 0;
@@ -801,20 +801,25 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
b_error |= (length = ftell(fd)) <= 0;
b_error |= fseek(fd, 0, SEEK_SET) < 0;
if (b_error)
- return 0;
+ {
+ ret_value = 0;
+ goto to_exit;
+ }
binary = (char*)calloc(length + 2, sizeof(char));
if (binary == NULL)
- return 0;
+ {
+ ret_value = 0;
+ goto to_exit;
+ }
b_error |= fread(binary, 1, length, fd) != length;
-#if 0 // this doesn't work under OS X and/or with some non-AMD GPUs
- if (binary[length-1] != '\n')
- binary[length++] = '\n';
-#endif
if (b_error)
- return 0;
+ {
+ ret_value = 0;
+ goto to_exit;
+ }
/* grab the handles to all of the devices in the context. */
status = hb_ocl->clGetContextInfo(gpu_info->context, CL_CONTEXT_DEVICES,
@@ -829,10 +834,6 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
&binary_status,
&status);
- fclose(fd);
- free(devices);
- fd = NULL;
- devices = NULL;
}
else
{
@@ -842,13 +843,15 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
&status);
}
- if((gpu_info->programs[idx] == (cl_program)NULL) || (status != CL_SUCCESS)){
+ if ((gpu_info->programs[idx] == (cl_program)NULL) || (status != CL_SUCCESS))
+ {
hb_log( "OpenCL: Unable to get list of devices in context." );
- return(0);
+ ret_value = 0;
+ goto to_exit;
}
/* create a cl program executable for all the devices specified */
- if( !gpu_info->isUserCreated )
+ if (!gpu_info->isUserCreated)
{
status = hb_ocl->clBuildProgram(gpu_info->programs[idx], 1, gpu_info->devices,
build_option, NULL, NULL);
@@ -859,9 +862,9 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
build_option, NULL, NULL);
}
- if( status != CL_SUCCESS )
+ if (status != CL_SUCCESS)
{
- if( !gpu_info->isUserCreated )
+ if (!gpu_info->isUserCreated)
{
status = hb_ocl->clGetProgramBuildInfo(gpu_info->programs[idx],
gpu_info->devices[0],
@@ -876,19 +879,21 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
0, NULL, &length);
}
- if( status != CL_SUCCESS )
+ if (status != CL_SUCCESS)
{
hb_log( "OpenCL: Unable to get GPU build information." );
- return(0);
+ ret_value = 0;
+ goto to_exit;
}
- buildLog = (char*)malloc( length );
- if( buildLog == (char*)NULL )
+ buildLog = (char*)malloc(length);
+ if (buildLog == (char*)NULL)
{
- return(0);
+ ret_value = 0;
+ goto to_exit;
}
- if( !gpu_info->isUserCreated )
+ if (!gpu_info->isUserCreated)
{
status = hb_ocl->clGetProgramBuildInfo(gpu_info->programs[idx],
gpu_info->devices[0],
@@ -903,26 +908,54 @@ int hb_compile_kernel_file( const char *filename, GPUEnv *gpu_info,
length, buildLog, &length);
}
- fd1 = fopen( "kernel-build.log", "w+" );
- if( fd1 != NULL ) {
- fwrite( buildLog, sizeof(char), length, fd1 );
- fclose( fd1 );
+ fd1 = fopen("kernel-build.log", "w+");
+ if (fd1 != NULL) {
+ fwrite(buildLog, sizeof(char), length, fd1);
+ fclose(fd1);
}
- free( buildLog );
- return(0);
+ ret_value = 0;
+ goto to_exit;
}
- strcpy( gpu_env.kernelSrcFile[idx], filename );
+ strcpy(gpu_env.kernelSrcFile[idx], filename);
- if (binaryExisted != 1)
+ gpu_info->file_count += 1;
+
+to_exit:
+ if (source_str != NULL)
{
- //hb_generat_bin_from_kernel_source(gpu_env.programs[idx], filename);
+ free(source_str);
+ source_str = NULL;
+ // only used as pointer to source_str
+ source = NULL;
}
- gpu_info->file_count += 1;
+ if (devices != NULL)
+ {
+ free(devices);
+ devices = NULL;
+ }
- return(1);
+ if (binary != NULL)
+ {
+ free(binary);
+ binary = NULL;
+ }
+
+ if (buildLog != NULL)
+ {
+ free(buildLog);
+ buildLog = NULL;
+ }
+
+ if (fd != NULL)
+ {
+ fclose(fd);
+ fd = NULL;
+ }
+
+ return ret_value;
}