diff --git a/projects/clr/hipamd/src/hip_memory.cpp b/projects/clr/hipamd/src/hip_memory.cpp index 9db3a7c7d9..4b4fbe4f95 100644 --- a/projects/clr/hipamd/src/hip_memory.cpp +++ b/projects/clr/hipamd/src/hip_memory.cpp @@ -113,9 +113,13 @@ hipError_t hipImportExternalMemory( amd::BufferVk* pBufferVk = nullptr; #ifdef _WIN32 - pBufferVk = new (amdContext) amd::BufferVk(amdContext, sizeBytes, memHandleDesc->handle.win32.handle); + pBufferVk = new (amdContext) + amd::BufferVk(amdContext, sizeBytes, memHandleDesc->handle.win32.handle, + static_cast(memHandleDesc->type)); #else - pBufferVk = new (amdContext) amd::BufferVk(amdContext, sizeBytes, memHandleDesc->handle.fd); + pBufferVk = new (amdContext) + amd::BufferVk(amdContext, sizeBytes, memHandleDesc->handle.fd, + static_cast(memHandleDesc->type)); #endif if (!pBufferVk) { diff --git a/projects/clr/opencl/amdocl/cl_vk_amd.hpp b/projects/clr/opencl/amdocl/cl_vk_amd.hpp index 2883f8a216..eb3d4692ac 100644 --- a/projects/clr/opencl/amdocl/cl_vk_amd.hpp +++ b/projects/clr/opencl/amdocl/cl_vk_amd.hpp @@ -25,28 +25,41 @@ THE SOFTWARE. */ namespace amd { + class VkObject : public InteropObject { - protected: - amd::Os::FileDesc handleVk_; public: + enum HandleType { + ExternalMemoryFd = 1, + ExternalMemoryWin32 = 2, + ExternalMemoryWin32KMT = 3, + }; + //! GLObject constructor initializes member variables VkObject( - amd::Os::FileDesc handle + amd::Os::FileDesc handle, + VkObject::HandleType handle_type ) // Initialization of member variables { handleVk_ = handle; + handle_type_ = handle_type; } virtual ~VkObject() {} VkObject* asVkObject() { return this; } amd::Os::FileDesc getVkSharedHandle() const { return handleVk_; } + HandleType getHandleType() const { return handle_type_; } + protected: + amd::Os::FileDesc handleVk_; + VkObject::HandleType handle_type_; }; + + class BufferVk : public Buffer, public VkObject { protected: @@ -63,15 +76,15 @@ namespace amd BufferVk( Context& amdContext, size_t uiSizeInBytes, - amd::Os::FileDesc handle) - : // Call base classes constructors + amd::Os::FileDesc handle, + VkObject::HandleType handle_type) : // Call base classes constructors Buffer( amdContext, 0, uiSizeInBytes ), VkObject( - handle + handle, handle_type ) { setInteropObj(this); @@ -99,15 +112,15 @@ namespace amd ImageVk( Context& amdContext, size_t uiSizeInBytes, - amd::Os::FileDesc handle) - : // Call base classes constructors + amd::Os::FileDesc handle, + VkObject::HandleType handle_type): // Call base classes constructors Buffer( amdContext, 0, uiSizeInBytes ), VkObject( - handle + handle, handle_type ) { setInteropObj(this); diff --git a/projects/clr/rocclr/device/pal/palmemory.cpp b/projects/clr/rocclr/device/pal/palmemory.cpp index f15fcfa6c8..fafdeef626 100644 --- a/projects/clr/rocclr/device/pal/palmemory.cpp +++ b/projects/clr/rocclr/device/pal/palmemory.cpp @@ -357,6 +357,8 @@ bool Memory::createInterop() { memType = Resource::VkInterop; vkRes.handle_ = vkObject->getVkSharedHandle(); vkRes.type_ = Resource::InteropTypeless; + vkRes.nt_handle_ = + (vkObject->getHandleType() == amd::VkObject::ExternalMemoryWin32) ? true : false; } else if (glObject != nullptr) { diff --git a/projects/clr/rocclr/device/pal/palresource.cpp b/projects/clr/rocclr/device/pal/palresource.cpp index 8074cfeec6..96e43f6279 100644 --- a/projects/clr/rocclr/device/pal/palresource.cpp +++ b/projects/clr/rocclr/device/pal/palresource.cpp @@ -763,6 +763,7 @@ bool Resource::CreateInterop(CreateParams* params) { else if (memoryType() == VkInterop) { VkInteropParams* vparams = reinterpret_cast(params); openInfo.hExternalResource = vparams->handle_; + openInfo.flags.ntHandle = vparams->nt_handle_; } #ifdef ATI_OS_WIN else { diff --git a/projects/clr/rocclr/device/pal/palresource.hpp b/projects/clr/rocclr/device/pal/palresource.hpp index 00cf5a048a..d20ae74131 100644 --- a/projects/clr/rocclr/device/pal/palresource.hpp +++ b/projects/clr/rocclr/device/pal/palresource.hpp @@ -139,6 +139,7 @@ class Resource : public amd::HeapObject { struct VkInteropParams : public CreateParams { InteropType type_; //!< Vulkan resource type amd::Os::FileDesc handle_; + bool nt_handle_; }; #ifdef _WIN32