@@ -80,7 +80,9 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemRelease(ur_mem_handle_t hMem) {
8080    //  Subbuffers should not free their parents
8181    if  (!BufferImpl->Parent ) {
8282      //  TODO: Handle registered host memory
83-       OL_RETURN_ON_ERR (olMemFree (BufferImpl->Ptr ));
83+       if  (hMem->IsNativeHandleOwned ) {
84+         OL_RETURN_ON_ERR (olMemFree (BufferImpl->Ptr ));
85+       }
8486    } else  {
8587      return  urMemRelease (BufferImpl->Parent );
8688    }
@@ -143,6 +145,50 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemBufferPartition(
143145  return  urMemRetain (hBuffer);
144146}
145147
148+ //  Liboffload has no equivalent to buffers. Buffers are implemented as USM
149+ UR_APIEXPORT ur_result_t  UR_APICALL urMemGetNativeHandle (
150+     ur_mem_handle_t  hMem, ur_device_handle_t , ur_native_handle_t  *phNativeMem) {
151+   *phNativeMem = reinterpret_cast <ur_native_handle_t >(hMem->AsBufferMem ()->Ptr );
152+   return  UR_RESULT_SUCCESS;
153+ }
154+ 
155+ UR_APIEXPORT ur_result_t  UR_APICALL urMemBufferCreateWithNativeHandle (
156+     ur_native_handle_t  hNativeMem, ur_context_handle_t  hContext,
157+     const  ur_mem_native_properties_t  *pProperties, ur_mem_handle_t  *phMem) {
158+   void  *Ptr = reinterpret_cast <void  *>(hNativeMem);
159+   ol_device_handle_t  Device;
160+   OL_RETURN_ON_ERR (
161+       olGetMemInfo (Ptr, OL_MEM_INFO_DEVICE, sizeof (Device), &Device));
162+   void  *Base;
163+   OL_RETURN_ON_ERR (olGetMemInfo (Ptr, OL_MEM_INFO_BASE, sizeof (Base), &Base));
164+ 
165+   //  Check that this pointer is valid
166+   if  (Base != Ptr || Device != hContext->Device ->OffloadDevice ) {
167+     return  UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
168+   }
169+ 
170+   size_t  Size;
171+   OL_RETURN_ON_ERR (olGetMemInfo (Ptr, OL_MEM_INFO_SIZE, sizeof (Size), &Size));
172+ 
173+   ol_alloc_type_t  Type;
174+   OL_RETURN_ON_ERR (olGetMemInfo (Ptr, OL_MEM_INFO_TYPE, sizeof (Type), &Type));
175+ 
176+   *phMem = new  ur_mem_handle_t_{/* Context=*/  hContext,
177+                                 /* Parent=*/ nullptr ,
178+                                 /* MemFlags=*/  UR_MEM_FLAG_READ_WRITE,
179+                                 /* Mode=*/ 
180+                                 (Type == OL_ALLOC_TYPE_HOST
181+                                      ? BufferMem::AllocMode::AllocHostPtr
182+                                      : BufferMem::AllocMode::Default),
183+                                 /* Ptr=*/  Ptr,
184+                                 /* HostPtr=*/ nullptr ,
185+                                 /* Size=*/  Size};
186+   (*phMem)->IsNativeHandleOwned  =
187+       pProperties ? pProperties->isNativeHandleOwned  : false ;
188+ 
189+   return  UR_RESULT_SUCCESS;
190+ }
191+ 
146192UR_APIEXPORT ur_result_t  UR_APICALL
147193urMemImageCreate (ur_context_handle_t , ur_mem_flags_t , const  ur_image_format_t  *,
148194                 const  ur_image_desc_t  *, void  *, ur_mem_handle_t  *) {
0 commit comments