From b2525dfb82358d9ec5520bc3a45bf2e3dffee0fd Mon Sep 17 00:00:00 2001 From: German Andryeyev Date: Wed, 19 Apr 2023 16:48:00 -0400 Subject: [PATCH] SWDEV-381627 - Move cl_vk_amd.hpp into rocclr Rename VK interop to ExternalMemory object, since it should handle DX interops also Change-Id: I536ec46d3e53ece35234a2e29030393ad411b96d [ROCm/clr commit: 3e5803c4c0a35d85da633f684c08811404b89cd3] --- projects/clr/hipamd/src/hip_memory.cpp | 32 ++--- projects/clr/opencl/amdocl/cl_vk_amd.hpp | 132 ------------------ projects/clr/rocclr/device/pal/palmemory.cpp | 12 +- projects/clr/rocclr/device/rocm/rocmemory.cpp | 8 +- .../clr/rocclr/platform/external_memory.hpp | 95 +++++++++++++ projects/clr/rocclr/platform/interop.hpp | 7 +- 6 files changed, 123 insertions(+), 163 deletions(-) delete mode 100644 projects/clr/opencl/amdocl/cl_vk_amd.hpp create mode 100644 projects/clr/rocclr/platform/external_memory.hpp diff --git a/projects/clr/hipamd/src/hip_memory.cpp b/projects/clr/hipamd/src/hip_memory.cpp index 602a544b97..84ea9cdb2c 100644 --- a/projects/clr/hipamd/src/hip_memory.cpp +++ b/projects/clr/hipamd/src/hip_memory.cpp @@ -25,7 +25,7 @@ #include "platform/context.hpp" #include "platform/command.hpp" #include "platform/memory.hpp" -#include "amdocl/cl_vk_amd.hpp" +#include "platform/external_memory.hpp" amd::Monitor hip::hipArraySetLock{"Guards global hipArray set"}; std::unordered_set hip::hipArraySet; @@ -108,29 +108,26 @@ hipError_t hipImportExternalMemory( HIP_RETURN(hipErrorInvalidValue); } - size_t sizeBytes = memHandleDesc->size; amd::Context& amdContext = *hip::getCurrentDevice()->asContext(); - - amd::BufferVk* pBufferVk = nullptr; #ifdef _WIN32 - pBufferVk = new (amdContext) - amd::BufferVk(amdContext, sizeBytes, memHandleDesc->handle.win32.handle, - static_cast(memHandleDesc->type)); + auto ext_buffer = new (amdContext) amd::ExternalBuffer(amdContext, memHandleDesc->size, + memHandleDesc->handle.win32.handle, + static_cast(memHandleDesc->type)); #else - pBufferVk = new (amdContext) - amd::BufferVk(amdContext, sizeBytes, memHandleDesc->handle.fd, - static_cast(memHandleDesc->type)); + auto ext_buffer = new (amdContext) amd::ExternalBuffer(amdContext, memHandleDesc->size, + memHandleDesc->handle.fd, + static_cast(memHandleDesc->type)); #endif - if (!pBufferVk) { + if (!ext_buffer) { HIP_RETURN(hipErrorOutOfMemory); } - if (!pBufferVk->create()) { - pBufferVk->release(); + if (!ext_buffer->create()) { + ext_buffer->release(); HIP_RETURN(hipErrorOutOfMemory); } - *extMem_out = pBufferVk; + *extMem_out = ext_buffer; HIP_RETURN(hipSuccess); } @@ -145,7 +142,7 @@ hipError_t hipExternalMemoryGetMappedBuffer( if (devPtr == nullptr || extMem == nullptr || bufferDesc == nullptr || bufferDesc->flags != 0) { HIP_RETURN(hipErrorInvalidValue); } - amd::BufferVk *buf = reinterpret_cast(extMem); + auto buf = reinterpret_cast(extMem); const device::Memory* devMem = buf->getDeviceMemory(*hip::getCurrentDevice()->devices()[0]); if (devMem == nullptr || ((bufferDesc->offset + bufferDesc->size) > devMem->size())) { @@ -157,18 +154,19 @@ hipError_t hipExternalMemoryGetMappedBuffer( HIP_RETURN(hipSuccess); } +// ================================================================================================ hipError_t hipDestroyExternalMemory(hipExternalMemory_t extMem) { HIP_INIT_API(hipDestroyExternalMemory, extMem); if (extMem == nullptr) { HIP_RETURN(hipErrorInvalidValue); } - reinterpret_cast(extMem)->release(); + reinterpret_cast(extMem)->release(); HIP_RETURN(hipSuccess); } - +// ================================================================================================ hipError_t hipImportExternalSemaphore(hipExternalSemaphore_t* extSem_out, const hipExternalSemaphoreHandleDesc* semHandleDesc) { diff --git a/projects/clr/opencl/amdocl/cl_vk_amd.hpp b/projects/clr/opencl/amdocl/cl_vk_amd.hpp deleted file mode 100644 index eb3d4692ac..0000000000 --- a/projects/clr/opencl/amdocl/cl_vk_amd.hpp +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -#pragma once - -#include "platform/context.hpp" -#include "platform/memory.hpp" - -namespace amd -{ - - class VkObject : public InteropObject - { - - public: - enum HandleType { - ExternalMemoryFd = 1, - ExternalMemoryWin32 = 2, - ExternalMemoryWin32KMT = 3, - }; - - //! GLObject constructor initializes member variables - VkObject( - 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: - //! Initializes the device memory array which is nested - // after'BufferVk' object in memory layout. - void initDeviceMemory() { - deviceMemories_ = - reinterpret_cast(reinterpret_cast(this) + sizeof(BufferVk)); - memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory)); - } - public: - //! BufferVk constructor just calls constructors of base classes - //! to pass down the parameters - BufferVk( - Context& amdContext, - size_t uiSizeInBytes, - amd::Os::FileDesc handle, - VkObject::HandleType handle_type) : // Call base classes constructors - Buffer( - amdContext, - 0, - uiSizeInBytes - ), - VkObject( - handle, handle_type - ) - { - setInteropObj(this); - } - virtual ~BufferVk() {} - - BufferVk* asBufferVk() { return this; } - }; - - // to be modified once image requirments are known, for now, implement like buffer - - class ImageVk : public Buffer, public VkObject - { - protected: - //! Initializes the device memory array which is nested - // after'ImageVk' object in memory layout. - void initDeviceMemory() { - deviceMemories_ = - reinterpret_cast(reinterpret_cast(this) + sizeof(ImageVk)); - memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory)); - } - public: - //! ImageVk constructor just calls constructors of base classes - //! to pass down the parameters - ImageVk( - Context& amdContext, - size_t uiSizeInBytes, - amd::Os::FileDesc handle, - VkObject::HandleType handle_type): // Call base classes constructors - Buffer( - amdContext, - 0, - uiSizeInBytes - ), - VkObject( - handle, handle_type - ) - { - setInteropObj(this); - } - virtual ~ImageVk() {} - - ImageVk* asImageVk() { return this; } - }; -} diff --git a/projects/clr/rocclr/device/pal/palmemory.cpp b/projects/clr/rocclr/device/pal/palmemory.cpp index fafdeef626..2799aae9b1 100644 --- a/projects/clr/rocclr/device/pal/palmemory.cpp +++ b/projects/clr/rocclr/device/pal/palmemory.cpp @@ -34,7 +34,7 @@ #include "platform/interop_d3d11.hpp" #endif //_WIN32 #include "platform/interop_gl.hpp" -#include "amdocl/cl_vk_amd.hpp" +#include "platform/external_memory.hpp" #include #include @@ -241,7 +241,7 @@ bool Memory::createInterop() { amd::InteropObject* interop = owner()->getInteropObj(); assert((interop != nullptr) && "An invalid interop object is impossible!"); - amd::VkObject* vkObject = interop->asVkObject(); + auto ext_memory = interop->asExternalMemory(); amd::GLObject* glObject = interop->asGLObject(); #ifdef _WIN32 amd::D3D10Object* d3d10Object = interop->asD3D10Object(); @@ -351,14 +351,16 @@ bool Memory::createInterop() { } } else #endif //_WIN32 - if (vkObject != nullptr) { + if (ext_memory != nullptr) { createParams = &vkRes; vkRes.owner_ = owner(); memType = Resource::VkInterop; - vkRes.handle_ = vkObject->getVkSharedHandle(); + vkRes.handle_ = ext_memory->Handle(); vkRes.type_ = Resource::InteropTypeless; vkRes.nt_handle_ = - (vkObject->getHandleType() == amd::VkObject::ExternalMemoryWin32) ? true : false; + ((ext_memory->Type() != amd::ExternalMemory::HandleType::OpaqueFd) && + (ext_memory->Type() != amd::ExternalMemory::HandleType::OpaqueWin32Kmt) && + (ext_memory->Type() != amd::ExternalMemory::HandleType::D3D11ResourceKmt)) ? true : false; } else if (glObject != nullptr) { diff --git a/projects/clr/rocclr/device/rocm/rocmemory.cpp b/projects/clr/rocclr/device/rocm/rocmemory.cpp index 0e0b021c99..cbe0e6cb2b 100644 --- a/projects/clr/rocclr/device/rocm/rocmemory.cpp +++ b/projects/clr/rocclr/device/rocm/rocmemory.cpp @@ -36,7 +36,7 @@ #include "platform/memory.hpp" #include "platform/sampler.hpp" #include "platform/interop_gl.hpp" -#include "amdocl/cl_vk_amd.hpp" +#include "platform/external_memory.hpp" namespace roc { @@ -815,10 +815,10 @@ bool Buffer::create(bool alloc_local) { // Interop buffer if (owner()->isInterop()) { amd::InteropObject* interop = owner()->getInteropObj(); - amd::VkObject* vkObject = interop->asVkObject(); + auto ext_memory = interop->asExternalMemory(); amd::GLObject* glObject = interop->asGLObject(); - if (vkObject != nullptr) { - hsa_status_t status = interopMapBuffer(vkObject->getVkSharedHandle()); + if (ext_memory != nullptr) { + hsa_status_t status = interopMapBuffer(ext_memory->Handle()); if (status != HSA_STATUS_SUCCESS) return false; return true; } else if (glObject != nullptr) { diff --git a/projects/clr/rocclr/platform/external_memory.hpp b/projects/clr/rocclr/platform/external_memory.hpp new file mode 100644 index 0000000000..b4e57a1ebf --- /dev/null +++ b/projects/clr/rocclr/platform/external_memory.hpp @@ -0,0 +1,95 @@ +/* Copyright (c) 2010 - 2021 Advanced Micro Devices, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#pragma once + +#include "platform/context.hpp" +#include "platform/memory.hpp" + +namespace amd +{ + class ExternalMemory : public InteropObject + { + public: + enum class HandleType : uint32_t { + OpaqueFd = 1, + OpaqueWin32 = 2, + OpaqueWin32Kmt = 3, + D3D12Heap = 4, + D3D12Resource = 5, + D3D11Resource = 6, + D3D11ResourceKmt = 7 + }; + + ExternalMemory(amd::Os::FileDesc handle, ExternalMemory::HandleType handle_type) + : handle_(handle), handle_type_(handle_type) {} + + virtual ~ExternalMemory() override {} + ExternalMemory* asExternalMemory() final { return this; } + + amd::Os::FileDesc Handle() const { return handle_; } + HandleType Type() const { return handle_type_; } + + protected: + amd::Os::FileDesc handle_; + ExternalMemory::HandleType handle_type_; + }; + + class ExternalBuffer : public Buffer, public ExternalMemory + { + protected: + // Initializes device memory array, which is located after ExternalBuffer object in memory + void initDeviceMemory() { + deviceMemories_ = + reinterpret_cast(reinterpret_cast(this) + sizeof(ExternalBuffer)); + memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory)); + } + + 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) { + setInteropObj(this); + } + + virtual ~ExternalBuffer() final {} + }; + + // to be modified once image requirments are known, for now, implement like buffer + class ExternalImage : public Buffer, public ExternalMemory + { + protected: + // Initializes device memory array, which is located after ExternalImage object in memory + void initDeviceMemory() { + deviceMemories_ = + reinterpret_cast(reinterpret_cast(this) + sizeof(ExternalImage)); + memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory)); + } + + public: + ExternalImage(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) { + setInteropObj(this); + } + + virtual ~ExternalImage() final {} + }; +} diff --git a/projects/clr/rocclr/platform/interop.hpp b/projects/clr/rocclr/platform/interop.hpp index 4080f98b1b..7f77c2017c 100644 --- a/projects/clr/rocclr/platform/interop.hpp +++ b/projects/clr/rocclr/platform/interop.hpp @@ -26,8 +26,7 @@ namespace amd { //! Forward declarations of interop classes class GLObject; class BufferGL; -class VkObject; -class BufferVk; +class ExternalMemory; #ifdef _WIN32 @@ -45,9 +44,7 @@ class InteropObject { // Static cast functions for interop objects virtual GLObject* asGLObject() { return nullptr; } virtual BufferGL* asBufferGL() { return nullptr; } - - virtual VkObject* asVkObject() { return nullptr; } - virtual BufferVk* asBufferVk() { return nullptr; } + virtual ExternalMemory* asExternalMemory() { return nullptr; } #ifdef _WIN32 virtual D3D10Object* asD3D10Object() { return nullptr; }