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