xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/common/vulkan_wrapper/opencl_vulkan_wrapper.hpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1 //
2 // Copyright (c) 2022 The Khronos Group Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //    http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 #ifndef _opencl_vulkan_wrapper_hpp_
17 #define _opencl_vulkan_wrapper_hpp_
18 
19 #include "vulkan_wrapper.hpp"
20 
21 #if !defined(__APPLE__)
22 #include <CL/cl.h>
23 #include <CL/cl_ext.h>
24 #else
25 #include <OpenCL/cl.h>
26 #include <OpenCL/cl_ext.h>
27 #endif
28 
29 typedef cl_semaphore_khr (*pfnclCreateSemaphoreWithPropertiesKHR)(
30     cl_context context, cl_semaphore_properties_khr *sema_props,
31     cl_int *errcode_ret);
32 typedef cl_int (*pfnclEnqueueWaitSemaphoresKHR)(
33     cl_command_queue command_queue, cl_uint num_semaphores,
34     const cl_semaphore_khr *sema_list,
35     const cl_semaphore_payload_khr *sema_payload_list,
36     cl_uint num_events_in_wait_list, const cl_event *event_wait_list,
37     cl_event *event);
38 typedef cl_int (*pfnclEnqueueSignalSemaphoresKHR)(
39     cl_command_queue command_queue, cl_uint num_semaphores,
40     const cl_semaphore_khr *sema_list,
41     const cl_semaphore_payload_khr *sema_payload_list,
42     cl_uint num_events_in_wait_list, const cl_event *event_wait_list,
43     cl_event *event);
44 typedef cl_int (*pfnclEnqueueAcquireExternalMemObjectsKHR)(
45     cl_command_queue command_queue, cl_uint num_mem_objects,
46     const cl_mem *mem_objects, cl_uint num_events_in_wait_list,
47     const cl_event *event_wait_list, cl_event *event);
48 typedef cl_int (*pfnclEnqueueReleaseExternalMemObjectsKHR)(
49     cl_command_queue command_queue, cl_uint num_mem_objects,
50     const cl_mem *mem_objects, cl_uint num_events_in_wait_list,
51     const cl_event *event_wait_list, cl_event *event);
52 typedef cl_int (*pfnclReleaseSemaphoreKHR)(cl_semaphore_khr sema_object);
53 
54 extern pfnclCreateSemaphoreWithPropertiesKHR
55     clCreateSemaphoreWithPropertiesKHRptr;
56 extern pfnclEnqueueWaitSemaphoresKHR clEnqueueWaitSemaphoresKHRptr;
57 extern pfnclEnqueueSignalSemaphoresKHR clEnqueueSignalSemaphoresKHRptr;
58 extern pfnclEnqueueAcquireExternalMemObjectsKHR
59     clEnqueueAcquireExternalMemObjectsKHRptr;
60 extern pfnclEnqueueReleaseExternalMemObjectsKHR
61     clEnqueueReleaseExternalMemObjectsKHRptr;
62 extern pfnclReleaseSemaphoreKHR clReleaseSemaphoreKHRptr;
63 
64 cl_int getCLImageInfoFromVkImageInfo(const VkImageCreateInfo *, size_t,
65                                      cl_image_format *, cl_image_desc *);
66 cl_int check_external_memory_handle_type(
67     cl_device_id deviceID,
68     cl_external_memory_handle_type_khr requiredHandleType);
69 cl_int check_external_semaphore_handle_type(
70     cl_device_id deviceID,
71     cl_external_semaphore_handle_type_khr requiredHandleType);
72 cl_int setMaxImageDimensions(cl_device_id deviceID, size_t &width,
73                              size_t &height);
74 
75 class clExternalMemory {
76 protected:
77     cl_mem m_externalMemory;
78     int fd;
79     void *handle;
80     clExternalMemory(const clExternalMemory &externalMemory);
81 
82 public:
83     clExternalMemory();
84     clExternalMemory(const VulkanDeviceMemory *deviceMemory,
85                      VulkanExternalMemoryHandleType externalMemoryHandleType,
86                      uint64_t offset, uint64_t size, cl_context context,
87                      cl_device_id deviceId);
88 
89     virtual ~clExternalMemory();
90     cl_mem getExternalMemoryBuffer();
91 };
92 class clExternalMemoryImage {
93 protected:
94     cl_mem m_externalMemory;
95     int fd;
96     void *handle;
97     cl_command_queue cmd_queue;
98     clExternalMemoryImage();
99 
100 public:
101     clExternalMemoryImage(
102         const VulkanDeviceMemory &deviceMemory,
103         VulkanExternalMemoryHandleType externalMemoryHandleType,
104         cl_context context, size_t totalImageMemSize, size_t imageWidth,
105         size_t imageHeight, size_t totalSize, const VulkanImage2D &image2D,
106         cl_device_id deviceId);
107     virtual ~clExternalMemoryImage();
108     cl_mem getExternalMemoryImage();
109 };
110 
111 class clExternalSemaphore {
112 protected:
113     cl_semaphore_khr m_externalSemaphore;
114     int fd;
115     void *handle;
116     clExternalSemaphore(const clExternalSemaphore &externalSemaphore);
117 
118 public:
119     clExternalSemaphore(
120         const VulkanSemaphore &deviceSemaphore, cl_context context,
121         VulkanExternalSemaphoreHandleType externalSemaphoreHandleType,
122         cl_device_id deviceId);
123     virtual ~clExternalSemaphore() noexcept(false);
124     void signal(cl_command_queue command_queue);
125     void wait(cl_command_queue command_queue);
126     cl_semaphore_khr &getCLSemaphore();
127     // operator openclExternalSemaphore_t() const;
128 };
129 
130 extern void init_cl_vk_ext(cl_platform_id);
131 
132 VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
133     cl_device_id deviceId,
134     VulkanExternalMemoryHandleType vkExternalMemoryHandleType, int *error_ret);
135 
136 #endif // _opencl_vulkan_wrapper_hpp_
137