1 /*
2 * cl_intel_context.cpp - CL intel context
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 #include "cl_intel_context.h"
22 #include "cl_device.h"
23 #include "cl_va_memory.h"
24
25 #define OCL_EXT_NAME_CREATE_BUFFER_FROM_LIBVA_INTEL "clCreateBufferFromLibvaIntel"
26 #define OCL_EXT_NAME_CREATE_BUFFER_FROM_FD_INTEL "clCreateBufferFromFdINTEL"
27 #define OCL_EXT_NAME_CREATE_IMAGE_FROM_LIBVA_INTEL "clCreateImageFromLibvaIntel"
28 #define OCL_EXT_NAME_CREATE_IMAGE_FROM_FD_INTEL "clCreateImageFromFdINTEL"
29 #define OCL_EXT_NAME_GET_MEM_OBJECT_FD_INTEL "clGetMemObjectFdIntel"
30
31 namespace XCam {
32
CLIntelContext(SmartPtr<CLDevice> & device)33 CLIntelContext::CLIntelContext (SmartPtr<CLDevice> &device)
34 : CLContext (device)
35 {
36 }
37
38 cl_mem
create_va_buffer(uint32_t bo_name)39 CLIntelContext::create_va_buffer (uint32_t bo_name)
40 {
41 cl_mem mem_id = NULL;
42 cl_int errcode = CL_SUCCESS;
43 if (!is_valid())
44 return NULL;
45
46 clCreateBufferFromLibvaIntel_fn oclCreateBufferFromLibvaIntel =
47 (clCreateBufferFromLibvaIntel_fn) _device->get_extension_function (OCL_EXT_NAME_CREATE_BUFFER_FROM_LIBVA_INTEL);
48 XCAM_FAIL_RETURN(ERROR, oclCreateBufferFromLibvaIntel, NULL, "create buffer failed since extension was not found");
49
50 mem_id = oclCreateBufferFromLibvaIntel (_context_id, bo_name, &errcode);
51 XCAM_FAIL_RETURN(
52 WARNING,
53 errcode == CL_SUCCESS,
54 NULL,
55 "create cl memory from va image failed");
56 return mem_id;
57 }
58
59 cl_mem
import_dma_buffer(const cl_import_buffer_info_intel & import_info)60 CLIntelContext::import_dma_buffer (const cl_import_buffer_info_intel &import_info)
61 {
62 cl_mem mem_id = NULL;
63 cl_int errcode = CL_SUCCESS;
64 if (!is_valid())
65 return NULL;
66
67 clCreateBufferFromFdINTEL_fn oclCreateBufferFromFdINTEL =
68 (clCreateBufferFromFdINTEL_fn) _device->get_extension_function (OCL_EXT_NAME_CREATE_BUFFER_FROM_FD_INTEL);
69 XCAM_FAIL_RETURN(ERROR, oclCreateBufferFromFdINTEL, NULL, "import buffer failed since extension was not found");
70
71 mem_id = oclCreateBufferFromFdINTEL (_context_id, &import_info, &errcode);
72 XCAM_FAIL_RETURN(
73 WARNING,
74 errcode == CL_SUCCESS,
75 NULL,
76 "import cl memory from dma buffer failed");
77
78 return mem_id;
79 }
80
81 cl_mem
create_va_image(const cl_libva_image & image_info)82 CLIntelContext::create_va_image (const cl_libva_image &image_info)
83 {
84 cl_mem mem_id = NULL;
85 cl_int errcode = CL_SUCCESS;
86 if (!is_valid())
87 return NULL;
88
89 clCreateImageFromLibvaIntel_fn oclCreateImageFromLibvaIntel =
90 (clCreateImageFromLibvaIntel_fn) _device->get_extension_function (OCL_EXT_NAME_CREATE_IMAGE_FROM_LIBVA_INTEL);
91 XCAM_FAIL_RETURN(ERROR, oclCreateImageFromLibvaIntel, NULL, "create image failed since extension was not found");
92
93 mem_id = oclCreateImageFromLibvaIntel (_context_id, &image_info, &errcode);
94 XCAM_FAIL_RETURN(
95 WARNING,
96 errcode == CL_SUCCESS,
97 NULL,
98 "create cl memory from va image failed");
99 return mem_id;
100 }
101
102 cl_mem
import_dma_image(const cl_import_image_info_intel & import_info)103 CLIntelContext::import_dma_image (const cl_import_image_info_intel &import_info)
104 {
105 cl_mem mem_id = NULL;
106 cl_int errcode = CL_SUCCESS;
107 if (!is_valid())
108 return NULL;
109
110 clCreateImageFromFdINTEL_fn oclCreateImageFromFdINTEL =
111 (clCreateImageFromFdINTEL_fn) _device->get_extension_function (OCL_EXT_NAME_CREATE_IMAGE_FROM_FD_INTEL);
112 XCAM_FAIL_RETURN(ERROR, oclCreateImageFromFdINTEL, NULL, "create image failed since extension was not found");
113
114 mem_id = oclCreateImageFromFdINTEL (_context_id, &import_info, &errcode);
115 XCAM_FAIL_RETURN(
116 WARNING,
117 errcode == CL_SUCCESS,
118 NULL,
119 "import cl memory from dma image failed, errcode:%d", errcode);
120
121 return mem_id;
122 }
123
124 int32_t
export_mem_fd(cl_mem mem_id)125 CLIntelContext::export_mem_fd (cl_mem mem_id)
126 {
127 cl_int errcode = CL_SUCCESS;
128 int32_t fd = -1;
129
130 clGetMemObjectFdIntel_fn oclGetMemObjectFdIntel =
131 (clGetMemObjectFdIntel_fn) _device->get_extension_function (OCL_EXT_NAME_GET_MEM_OBJECT_FD_INTEL);
132 XCAM_FAIL_RETURN(ERROR, oclGetMemObjectFdIntel, -1, "export fd failed since extension was not found");
133
134 XCAM_ASSERT (mem_id);
135 errcode = oclGetMemObjectFdIntel (_context_id, mem_id, &fd);
136 XCAM_FAIL_RETURN (
137 WARNING,
138 errcode == CL_SUCCESS,
139 -1,
140 "export cl mem fd failed");
141 return fd;
142 }
143
144 };
145