• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * cl_kernel.h - CL kernel
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: Wind Yuan <feng.yuan@intel.com>
19  */
20 
21 #ifndef XCAM_CL_KERNEL_H
22 #define XCAM_CL_KERNEL_H
23 
24 #include <xcam_std.h>
25 #include <xcam_mutex.h>
26 #include <ocl/cl_event.h>
27 #include <ocl/cl_argument.h>
28 
29 #include <CL/cl.h>
30 #include <string>
31 #include <unistd.h>
32 
33 #define XCAM_CL_KERNEL_FUNC_SOURCE_BEGIN(func)  \
34     const char func##_body []=
35 //const char *func##_name = #func;
36 
37 #define XCAM_CL_KERNEL_FUNC_BINARY_BEGIN(func)  \
38     const uint8_t func##_body[] =
39 
40 #define XCAM_CL_KERNEL_FUNC_END
41 
42 XCAM_BEGIN_DECLARE
43 
44 typedef struct _XCamKernelInfo {
45     const char   *kernel_name;
46     const char   *kernel_body;
47     size_t        kernel_body_len;
48 } XCamKernelInfo;
49 
50 XCAM_END_DECLARE
51 
52 namespace XCam {
53 
54 class CLContext;
55 class CLKernel;
56 
57 /*
58  * Example to create a kernel
59  * XCAM_CL_KERNEL_FUNC_SOURCE_BEGIN(kernel_demo)
60  * #include "kernel_demo.clx"
61  * XCAM_CL_KERNEL_FUNC_END
62  * SmartPtr<CLKernel> kernel = new CLKernel (context, kernel_demo);
63  * kernel->load_from_source (kernel_demo_body, strlen(kernel_demo_body));
64  * XCAM_ASSERT (kernel->is_valid());
65  */
66 class CLKernel {
67     friend class CLContext;
68 public:
69     explicit CLKernel (const SmartPtr<CLContext> &context, const char *name);
70     virtual ~CLKernel ();
71 
72     XCamReturn build_kernel (const XCamKernelInfo& info, const char* options = NULL);
73 
get_kernel_id()74     cl_kernel get_kernel_id () {
75         return _kernel_id;
76     }
is_valid()77     bool is_valid () const {
78         return _kernel_id != NULL;
79     }
get_kernel_name()80     const char *get_kernel_name () const {
81         return _name;
82     }
get_context()83     SmartPtr<CLContext> &get_context () {
84         return  _context;
85     }
86 
87     XCamReturn set_arguments (const CLArgList &args, const CLWorkSize &work_size);
get_work_size()88     const CLWorkSize &get_work_size () const {
89         return _work_size;
90     }
91 
is_arguments_set()92     bool is_arguments_set () const {
93         return !_arg_list.empty ();
94     }
get_args()95     const CLArgList &get_args () const {
96         return _arg_list;
97     }
98 
99     XCamReturn execute (
100         const SmartPtr<CLKernel> self,
101         bool block = false,
102         CLEventList &events = CLEvent::EmptyList,
103         SmartPtr<CLEvent> &event_out = CLEvent::NullEvent);
104 
105     XCamReturn load_from_source (
106         const char *source, size_t length = 0,
107         uint8_t **gen_binary = NULL,
108         size_t *binary_size = NULL,
109         const char *build_option = NULL);
110 
111     XCamReturn load_from_binary (const uint8_t *binary, size_t length);
112 
113 private:
114     XCamReturn set_argument (uint32_t arg_i, void *arg_addr, uint32_t arg_size);
115     XCamReturn set_work_size (const CLWorkSize &work_size);
116     void set_default_work_size ();
117     void destroy ();
118     XCamReturn clone (SmartPtr<CLKernel> kernel);
119 
120     static void event_notify (cl_event event, cl_int status, void* data);
121     XCAM_DEAD_COPY (CLKernel);
122 
123 private:
124     typedef std::map<std::string, SmartPtr<CLKernel> > KernelMap;
125 
126     static KernelMap      _kernel_map;
127     static Mutex          _kernel_map_mutex;
128     static const char    *_kernel_cache_path;
129 
130 private:
131     char                 *_name;
132     cl_kernel             _kernel_id;
133     SmartPtr<CLContext>   _context;
134     SmartPtr<CLKernel>    _parent_kernel;
135     CLArgList             _arg_list;
136     CLWorkSize            _work_size;
137 
138     XCAM_OBJ_PROFILING_DEFINES;
139 };
140 
141 };
142 
143 #endif //XCAM_CL_KERNEL_H
144