[FFmpeg-devel] [PATCH]opencl: compile kernels separately

Lenny Wang lenny at multicorewareinc.com
Mon Nov 4 04:58:09 CET 2013


On Sun, Nov 3, 2013 at 7:57 PM, Wei Gao <highgod0401 at gmail.com> wrote:
> 2013/11/4 Wei Gao <highgod0401 at gmail.com>
>
>>
>>
>>
>> 2013/11/2 Lenny Wang <lenny at multicorewareinc.com>
>>
>>>
>>>
>>> Newly adjusted patch based on Michael's comments.  Please review, thanks.
>>>
>>
>>
>> diff --git a/libavfilter/deshake.h b/libavfilter/deshake.h
>> index c24090e..5792973 100644
>>
>> @@ -108,11 +108,21 @@ int ff_opencl_deshake_init(AVFilterContext *ctx)
>>          deshake->opencl_ctx.matrix_size*sizeof(cl_float),
>> CL_MEM_READ_ONLY, NULL);
>>      if (ret < 0)
>>          return ret;
>> -    if (!deshake->opencl_ctx.kernel_env.kernel) {
>> -        ret =  av_opencl_create_kernel(&deshake->opencl_ctx.kernel_env,
>> "avfilter_transform");
>> -        if (ret < 0) {
>> -            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel for
>> name 'avfilter_transform'\n");
>> -            return ret;
>> +    deshake->opencl_ctx.command_queue = av_opencl_get_command_queue();
>> +    if (!deshake->opencl_ctx.command_queue) {
>> +        av_log(ctx, AV_LOG_ERROR, "Unable to get OpenCL command queue in
>> filter 'deshake'\n");
>> +        return -1;
>> It should return a meaningful value, return AVERROR(EINVAL) should be OK.
>>
>> +    }
>> +    deshake->opencl_ctx.program = av_opencl_compile("avfilter_transform",
>> NULL);
>> +    if (!deshake->opencl_ctx.program) {
>> +        av_log(ctx, AV_LOG_ERROR, "OpenCL failed to compile program
>> 'avfilter_transform'\n");
>> +        return -1;
>> +    }
>> +    if (!deshake->opencl_ctx.kernel) {
>> +        deshake->opencl_ctx.kernel =
>> clCreateKernel(deshake->opencl_ctx.program, "avfilter_transform", &ret);
>> +        if (ret != CL_SUCCESS) {
>> +            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel
>> 'avfilter_transform'\n");
>> +            return -1;
>> It should return a meaningful value, return AVERROR(EINVAL) should be OK.
>>
>>
>>  int ff_opencl_deshake_process_inout_buf(AVFilterContext *ctx, AVFrame
>> *in, AVFrame *out)
>>  {
>>      int ret = 0;
>> diff --git a/libavfilter/unsharp.h b/libavfilter/unsharp.h
>> index c225929..2738243 100644
>> --- a/libavfilter/unsharp.h
>> +++ b/libavfilter/unsharp.h
>> @@ -33,6 +33,9 @@
>>  #if CONFIG_OPENCL
>>
>>  #endif
>> diff --git a/libavfilter/unsharp_opencl.c b/libavfilter/unsharp_opencl.c
>> index b373b66..3dd0527 100644
>> --- a/libavfilter/unsharp_opencl.c
>> +++ b/libavfilter/unsharp_opencl.c
>> @@ -159,7 +159,7 @@ int ff_opencl_apply_unsharp(AVFilterContext *ctx,
>> AVFrame *in, AVFrame *out)
>>      FFOpenclParam opencl_param = {0};
>>
>>      opencl_param.ctx = ctx;
>> -    opencl_param.kernel = unsharp->opencl_ctx.kernel_env.kernel;
>> +    opencl_param.kernel = unsharp->opencl_ctx.kernel;
>>      ret = ff_opencl_set_parameter(&opencl_param,
>>
>>  FF_OPENCL_PARAM_INFO(unsharp->opencl_ctx.cl_inbuf),
>>
>>  FF_OPENCL_PARAM_INFO(unsharp->opencl_ctx.cl_outbuf),
>> @@ -186,14 +186,14 @@ int ff_opencl_apply_unsharp(AVFilterContext *ctx,
>> AVFrame *in, AVFrame *out)
>>                                    NULL);
>>      if (ret < 0)
>>
>> @@ -220,11 +220,21 @@ int ff_opencl_unsharp_init(AVFilterContext *ctx)
>>      if (ret < 0)
>>          return ret;
>>      unsharp->opencl_ctx.plane_num = PLANE_NUM;
>> -    if (!unsharp->opencl_ctx.kernel_env.kernel) {
>> -        ret = av_opencl_create_kernel(&unsharp->opencl_ctx.kernel_env,
>> "unsharp");
>> -        if (ret < 0) {
>> -            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel
>> with name 'unsharp'\n");
>> -            return ret;
>> +    unsharp->opencl_ctx.command_queue = av_opencl_get_command_queue();
>> +    if (!unsharp->opencl_ctx.command_queue) {
>> +        av_log(ctx, AV_LOG_ERROR, "Unable to get OpenCL command queue in
>> filter 'unsharp'\n");
>> +        return -1;
>> It should return a meaningful value, return AVERROR(EINVAL) should be OK.
>>
>> +    }
>> +    unsharp->opencl_ctx.program = av_opencl_compile("unsharp", NULL);
>> +    if (!unsharp->opencl_ctx.program) {
>> +        av_log(ctx, AV_LOG_ERROR, "OpenCL failed to compile program
>> 'unsharp'\n");
>> +        return -1;
>> It should return a meaningful value, return AVERROR(EINVAL) should be OK.
>>
>> +    }
>> +    if (!unsharp->opencl_ctx.kernel) {
>> +        unsharp->opencl_ctx.kernel =
>> clCreateKernel(unsharp->opencl_ctx.program, "unsharp", &ret);
>> +        if (ret != CL_SUCCESS) {
>> +            av_log(ctx, AV_LOG_ERROR, "OpenCL failed to create kernel
>> 'unsharp'\n");
>> +            return -1;
>> It should return a meaningful value, return AVERROR(EINVAL) should be OK.
>>
>> Looks good to me thanks
>>
> +cl_program av_opencl_compile(const char *program_name, const char
> *build_opts)
>  {
> +    int i;
>      cl_int status;
> -    int i, ret = 0;
> +    int kernel_code_idx = 0;
> +    const char *kernel_source;
> +    size_t kernel_code_len;
> +    char* ptr = NULL;
> a trailing whitespace after char* ptr = NULL;
>
> +cl_program av_opencl_compile(const char *program_name, const char*
> build_opts);
> +
> +/**
> + * get OpenCL command queue
> + *
> + * @return a cl_command_queue object
> a trailing whitespace after eturn a cl_command_queue object
>
> + */
> +cl_command_queue av_opencl_get_command_queue(void);
>
> +    cl_program program = NULL;
> +
>

Patch modified based on Wei's comments.  Please apply if it's good, thanks.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: compile_opencl_kernels_separately.patch
Type: application/octet-stream
Size: 24062 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20131103/b9940d66/attachment.obj>


More information about the ffmpeg-devel mailing list