blob: ebcea838fed7840cc26125e3124669320da057c1 [file] [log] [blame]
wangfei98428352015-04-02 10:41:27 +08001/*
2 * cl_wb_handler.cpp - CL white balance handler
3 *
4 * Copyright (c) 2015 Intel Corporation
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: wangfei <feix.w.wang@intel.com>
19 */
20#include "xcam_utils.h"
21#include "cl_wb_handler.h"
22
23namespace XCam {
24
25CLWbImageKernel::CLWbImageKernel (SmartPtr<CLContext> &context)
26 : CLImageKernel (context, "kernel_wb")
27{
28}
29
30XCamReturn
31CLWbImageKernel::prepare_arguments (
32 SmartPtr<DrmBoBuffer> &input, SmartPtr<DrmBoBuffer> &output,
33 CLArgument args[], uint32_t &arg_count,
34 CLWorkSize &work_size)
35{
36 SmartPtr<CLContext> context = get_context ();
37
38 _image_in = new CLVaImage (context, input);
39 _image_out = new CLVaImage (context, output);
40
41 XCAM_ASSERT (_image_in->is_valid () && _image_out->is_valid ());
42 XCAM_FAIL_RETURN (
43 WARNING,
44 _image_in->is_valid () && _image_out->is_valid (),
45 XCAM_RETURN_ERROR_MEM,
46 "cl image kernel(%s) in/out memory not available", get_kernel_name ());
47
48
49 //set args;
50 args[0].arg_adress = &_image_in->get_mem_id ();
51 args[0].arg_size = sizeof (cl_mem);
52 args[1].arg_adress = &_image_out->get_mem_id ();
53 args[1].arg_size = sizeof (cl_mem);
54 args[2].arg_adress = &_wb_config;
55 args[2].arg_size = sizeof (CLWBConfig);
56 arg_count = 3;
57
58 const cl_libva_image &out_info = _image_out->get_image_info ();
59 work_size.dim = XCAM_DEFAULT_IMAGE_DIM;
60 work_size.global[0] = out_info.row_pitch / 2;
61 work_size.global[1] = out_info.height / 2;
62 work_size.local[0] = 4;
63 work_size.local[1] = 4;
64
65 return XCAM_RETURN_NO_ERROR;
66}
67
68bool
69CLWbImageKernel::set_wb (CLWBConfig wb)
70{
71 _wb_config = wb;
72 return true;
73}
74CLWbImageHandler::CLWbImageHandler (const char *name)
75 : CLImageHandler (name)
76{
77}
78
79bool
80CLWbImageHandler::set_wb_config (XCam3aResultWhiteBalance wb)
81{
82 CLWBConfig _wb_config;
83 _wb_config.r_gain = (float)wb.r_gain;
84 _wb_config.gr_gain = (float)wb.gr_gain;
85 _wb_config.gb_gain = (float)wb.gb_gain;
86 _wb_config.b_gain = (float)wb.b_gain;
87 _wb_kernel->set_wb(_wb_config);
88 return true;
89}
90
91bool
92CLWbImageHandler::set_wb_kernel(SmartPtr<CLWbImageKernel> &kernel)
93{
94 SmartPtr<CLImageKernel> image_kernel = kernel;
95 add_kernel (image_kernel);
96 _wb_kernel = kernel;
97 return true;
98}
99
100
101SmartPtr<CLImageHandler>
102create_cl_wb_image_handler (SmartPtr<CLContext> &context)
103{
104 SmartPtr<CLWbImageHandler> wb_handler;
105 SmartPtr<CLWbImageKernel> wb_kernel;
106 XCamReturn ret = XCAM_RETURN_NO_ERROR;
107
108 wb_kernel = new CLWbImageKernel (context);
109 {
110 XCAM_CL_KERNEL_FUNC_SOURCE_BEGIN(kernel_wb)
111#include "kernel_wb.cl"
112 XCAM_CL_KERNEL_FUNC_END;
113 ret = wb_kernel->load_from_source (kernel_wb_body, strlen (kernel_wb_body));
114 XCAM_FAIL_RETURN (
115 WARNING,
116 ret == XCAM_RETURN_NO_ERROR,
117 NULL,
118 "CL image handler(%s) load source failed", wb_kernel->get_kernel_name());
119 }
120 XCAM_ASSERT (wb_kernel->is_valid ());
121 wb_handler = new CLWbImageHandler ("cl_handler_wb");
122 wb_handler->set_wb_kernel (wb_kernel);
123
124 return wb_handler;
125}
126
127}