1 /*
2  * cl_device.h - CL device
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_DEVICE_H
22 #define XCAM_CL_DEVICE_H
23 
24 #include <xcam_std.h>
25 #include <xcam_mutex.h>
26 #include <CL/cl.h>
27 
28 namespace XCam {
29 
30 class CLContext;
31 
32 struct CLDevieInfo {
33     uint32_t  max_compute_unit;
34     uint32_t  max_work_item_dims;
35     size_t    max_work_item_sizes [3];
36     size_t    max_work_group_size;
37     uint32_t  image_pitch_alignment;
38 
CLDevieInfoCLDevieInfo39     CLDevieInfo ()
40         : max_compute_unit (0)
41         , max_work_item_dims (0)
42         , max_work_group_size (0)
43         , image_pitch_alignment (4)
44     {
45         xcam_mem_clear (max_work_item_sizes);
46     }
47 };
48 
49 // terminate () must called before program exit
50 
51 class CLDevice {
52 public:
53     ~CLDevice ();
54     static SmartPtr<CLDevice> instance ();
55 
is_inited()56     bool is_inited () const {
57         return _inited;
58     }
get_device_info()59     const CLDevieInfo &get_device_info () {
60         return _device_info;
61     }
get_device_id()62     cl_device_id get_device_id () {
63         return _device_id;
64     }
get_platform_id()65     cl_platform_id get_platform_id () {
66         return _platform_id;
67     }
get_platform_name()68     char* get_platform_name () {
69         return _platform_name;
70     }
71 
72     SmartPtr<CLContext> get_context ();
73     void *get_extension_function (const char *func_name);
74     void terminate ();
75 
76 private:
77     CLDevice ();
78     bool init ();
79     bool query_device_info (cl_device_id device_id, CLDevieInfo &info);
80     bool create_default_context ();
81 
82     XCAM_DEAD_COPY (CLDevice);
83 
84 private:
85     static SmartPtr<CLDevice>  _instance;
86     static Mutex               _instance_mutex;
87     char                       _platform_name[XCAM_CL_MAX_STR_SIZE];
88     cl_platform_id             _platform_id;
89     cl_device_id               _device_id;
90     CLDevieInfo                _device_info;
91     bool                       _inited;
92 
93     //Mutex                      _context_mutex;
94     SmartPtr<CLContext>        _default_context;
95 };
96 
97 };
98 
99 #endif //XCAM_CL_DEVICE_H
100