blob: 1acc896dba3ae7a700f421827f23deee6cca1d40 [file] [log] [blame]
/*
* cl_kernel.h - CL kernel
*
* Copyright (c) 2015 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Author: Wind Yuan <[email protected]>
*/
#ifndef XCAM_CL_KERNEL_H
#define XCAM_CL_KERNEL_H
#include <xcam_std.h>
#include <xcam_mutex.h>
#include <ocl/cl_event.h>
#include <ocl/cl_argument.h>
#include <CL/cl.h>
#include <string>
#include <unistd.h>
#define XCAM_CL_KERNEL_FUNC_SOURCE_BEGIN(func) \
const char func##_body []=
//const char *func##_name = #func;
#define XCAM_CL_KERNEL_FUNC_BINARY_BEGIN(func) \
const uint8_t func##_body[] =
#define XCAM_CL_KERNEL_FUNC_END
XCAM_BEGIN_DECLARE
typedef struct _XCamKernelInfo {
const char *kernel_name;
const char *kernel_body;
size_t kernel_body_len;
} XCamKernelInfo;
XCAM_END_DECLARE
namespace XCam {
class CLContext;
class CLKernel;
/*
* Example to create a kernel
* XCAM_CL_KERNEL_FUNC_SOURCE_BEGIN(kernel_demo)
* #include "kernel_demo.clx"
* XCAM_CL_KERNEL_FUNC_END
* SmartPtr<CLKernel> kernel = new CLKernel (context, kernel_demo);
* kernel->load_from_source (kernel_demo_body, strlen(kernel_demo_body));
* XCAM_ASSERT (kernel->is_valid());
*/
class CLKernel {
friend class CLContext;
public:
explicit CLKernel (const SmartPtr<CLContext> &context, const char *name);
virtual ~CLKernel ();
XCamReturn build_kernel (const XCamKernelInfo& info, const char* options = NULL);
cl_kernel get_kernel_id () {
return _kernel_id;
}
bool is_valid () const {
return _kernel_id != NULL;
}
const char *get_kernel_name () const {
return _name;
}
SmartPtr<CLContext> &get_context () {
return _context;
}
XCamReturn set_arguments (const CLArgList &args, const CLWorkSize &work_size);
const CLWorkSize &get_work_size () const {
return _work_size;
}
bool is_arguments_set () const {
return !_arg_list.empty ();
}
const CLArgList &get_args () const {
return _arg_list;
}
XCamReturn execute (
const SmartPtr<CLKernel> self,
bool block = false,
CLEventList &events = CLEvent::EmptyList,
SmartPtr<CLEvent> &event_out = CLEvent::NullEvent);
XCamReturn load_from_source (
const char *source, size_t length = 0,
uint8_t **gen_binary = NULL,
size_t *binary_size = NULL,
const char *build_option = NULL);
XCamReturn load_from_binary (const uint8_t *binary, size_t length);
private:
XCamReturn set_argument (uint32_t arg_i, void *arg_addr, uint32_t arg_size);
XCamReturn set_work_size (const CLWorkSize &work_size);
void set_default_work_size ();
void destroy ();
XCamReturn clone (SmartPtr<CLKernel> kernel);
static void event_notify (cl_event event, cl_int status, void* data);
XCAM_DEAD_COPY (CLKernel);
private:
typedef std::map<std::string, SmartPtr<CLKernel> > KernelMap;
static KernelMap _kernel_map;
static Mutex _kernel_map_mutex;
static const char *_kernel_cache_path;
private:
char *_name;
cl_kernel _kernel_id;
SmartPtr<CLContext> _context;
SmartPtr<CLKernel> _parent_kernel;
CLArgList _arg_list;
CLWorkSize _work_size;
XCAM_OBJ_PROFILING_DEFINES;
};
};
#endif //XCAM_CL_KERNEL_H