[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