diff --git a/projects/clr/hipamd/src/hip_memory.cpp b/projects/clr/hipamd/src/hip_memory.cpp index eb1931e8c3..d3cdd23e55 100644 --- a/projects/clr/hipamd/src/hip_memory.cpp +++ b/projects/clr/hipamd/src/hip_memory.cpp @@ -113,7 +113,8 @@ hipError_t hipImportExternalMemory( #ifdef _WIN32 auto ext_buffer = new (amdContext) amd::ExternalBuffer(amdContext, memHandleDesc->size, memHandleDesc->handle.win32.handle, - static_cast(memHandleDesc->type)); + static_cast(memHandleDesc->type), + memHandleDesc->handle.win32.name); #else auto ext_buffer = new (amdContext) amd::ExternalBuffer(amdContext, memHandleDesc->size, memHandleDesc->handle.fd, diff --git a/projects/clr/rocclr/device/pal/palmemory.cpp b/projects/clr/rocclr/device/pal/palmemory.cpp index 61b216e485..cf45c0cc34 100644 --- a/projects/clr/rocclr/device/pal/palmemory.cpp +++ b/projects/clr/rocclr/device/pal/palmemory.cpp @@ -357,6 +357,7 @@ bool Memory::createInterop() { vkRes.owner_ = owner(); memType = Resource::VkInterop; vkRes.handle_ = ext_memory->Handle(); + vkRes.name_ = ext_memory->Name(); vkRes.type_ = Resource::InteropTypeless; vkRes.nt_handle_ = ((ext_memory->Type() != amd::ExternalMemory::HandleType::OpaqueFd) && diff --git a/projects/clr/rocclr/device/pal/palresource.cpp b/projects/clr/rocclr/device/pal/palresource.cpp index 45b2df8bb4..77baa8d255 100644 --- a/projects/clr/rocclr/device/pal/palresource.cpp +++ b/projects/clr/rocclr/device/pal/palresource.cpp @@ -802,7 +802,21 @@ bool Resource::CreateInterop(CreateParams* params) { } else if (memoryType() == VkInterop) { VkInteropParams* vparams = reinterpret_cast(params); - openInfo.hExternalResource = vparams->handle_; + if (vparams->handle_) { + openInfo.hExternalResource = vparams->handle_; + } else if (vparams->name_) { + Pal::ExternalHandleInfo eHandleInfo = {}; + eHandleInfo.objectType = Pal::ExternalObjectType::Allocation; + eHandleInfo.pNtObjectName = reinterpret_cast(vparams->name_); + SECURITY_ATTRIBUTES securityAttributes = {}; + securityAttributes.bInheritHandle = TRUE; + eHandleInfo.pSecurityAttributes = &securityAttributes; + eHandleInfo.accessFlags = GENERIC_READ | GENERIC_WRITE; + if (Pal::Result::Success != + dev().iDev()->OpenExternalHandleFromName(eHandleInfo, &openInfo.hExternalResource)) { + return false; + } + } openInfo.flags.ntHandle = vparams->nt_handle_; } #ifdef ATI_OS_WIN diff --git a/projects/clr/rocclr/device/pal/palresource.hpp b/projects/clr/rocclr/device/pal/palresource.hpp index 77073c2c93..4236e6854d 100644 --- a/projects/clr/rocclr/device/pal/palresource.hpp +++ b/projects/clr/rocclr/device/pal/palresource.hpp @@ -142,6 +142,7 @@ class Resource : public amd::HeapObject { struct VkInteropParams : public CreateParams { InteropType type_; //!< Vulkan resource type amd::Os::FileDesc handle_; + const void* name_; bool nt_handle_; }; diff --git a/projects/clr/rocclr/platform/external_memory.hpp b/projects/clr/rocclr/platform/external_memory.hpp index 00a076f84b..55406aee9c 100644 --- a/projects/clr/rocclr/platform/external_memory.hpp +++ b/projects/clr/rocclr/platform/external_memory.hpp @@ -38,17 +38,20 @@ namespace amd D3D11ResourceKmt = 7 }; - ExternalMemory(amd::Os::FileDesc handle, ExternalMemory::HandleType handle_type) - : handle_(handle), handle_type_(handle_type) {} + ExternalMemory(amd::Os::FileDesc handle, const void* name, + ExternalMemory::HandleType handle_type) + : handle_(handle), name_(name), handle_type_(handle_type) {} virtual ~ExternalMemory() override {} ExternalMemory* asExternalMemory() final { return this; } amd::Os::FileDesc Handle() const { return handle_; } + const void* Name() const { return name_; } HandleType Type() const { return handle_type_; } protected: amd::Os::FileDesc handle_; + const void* name_; ExternalMemory::HandleType handle_type_; }; @@ -64,8 +67,8 @@ namespace amd public: ExternalBuffer(Context& amdContext, size_t size_in_bytes, amd::Os::FileDesc handle, - ExternalMemory::HandleType handle_type) - : Buffer(amdContext, 0, size_in_bytes), ExternalMemory(handle, handle_type) { + ExternalMemory::HandleType handle_type, const void* name = nullptr) + : Buffer(amdContext, 0, size_in_bytes), ExternalMemory(handle, name, handle_type) { setInteropObj(this); }