From e38a200bf735b99dde8f5ce409ea8653b29f25a8 Mon Sep 17 00:00:00 2001 From: pghafari Date: Tue, 16 Nov 2021 12:32:43 -0500 Subject: [PATCH] SWDEV-297142 - HIP-Vulkan - linux interop buffer Change-Id: I0278e56bba632024c214beb9e1758587ccba0927 --- rocclr/device/rocm/rocmemory.cpp | 61 ++++++++++++++++++++------------ rocclr/device/rocm/rocmemory.hpp | 1 + 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/rocclr/device/rocm/rocmemory.cpp b/rocclr/device/rocm/rocmemory.cpp index ab0b09dc95..bccb74a8ac 100644 --- a/rocclr/device/rocm/rocmemory.cpp +++ b/rocclr/device/rocm/rocmemory.cpp @@ -36,6 +36,7 @@ #include "platform/memory.hpp" #include "platform/sampler.hpp" #include "amdocl/cl_gl_amd.hpp" +#include "amdocl/cl_vk_amd.hpp" #ifdef WITH_AMDGPU_PRO #include "pro/prodriver.hpp" #endif @@ -205,6 +206,29 @@ void Memory::cpuUnmap(device::VirtualDevice& vDev) { decIndMapCount(); } +hsa_status_t Memory::interopMapBuffer(int fd) { + hsa_agent_t agent = dev().getBackendDevice(); + size_t size; + size_t metadata_size = 0; + void* metadata; + hsa_status_t status = hsa_amd_interop_map_buffer( + 1, &agent, fd, 0, &size, &interop_deviceMemory_, + &metadata_size, (const void**)&metadata); + ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Map Interop memory %p, size 0x%zx", + interop_deviceMemory_, size); + deviceMemory_ = static_cast(interop_deviceMemory_);// + out.buf_offset; + if (status != HSA_STATUS_SUCCESS) return status; + // if map_buffer wrote a legitimate SRD, copy it to amdImageDesc_ + if ((metadata_size != 0) && + (reinterpret_cast(metadata)->deviceID == + amdImageDesc_->deviceID)) { + memcpy(amdImageDesc_, metadata, metadata_size); + } + kind_ = MEMORY_KIND_INTEROP; + assert(deviceMemory_ != nullptr && "Interop map failed to produce a pointer!"); + return status; +} + // Setup an interop buffer (dmabuf handle) as an OpenCL buffer bool Memory::createInteropBuffer(GLenum targetType, int miplevel) { #if defined(_WIN32) @@ -255,30 +279,11 @@ bool Memory::createInteropBuffer(GLenum targetType, int miplevel) { return false; } - size_t size; - size_t metadata_size = 0; - void* metadata; - hsa_status_t status = hsa_amd_interop_map_buffer( - 1, &agent, out.dmabuf_fd, 0, &size, &interop_deviceMemory_, - &metadata_size, (const void**)&metadata); + if (interopMapBuffer(out.dmabuf_fd) != HSA_STATUS_SUCCESS) return false; + close(out.dmabuf_fd); - - ClPrint(amd::LOG_DEBUG, amd::LOG_MEM, "Map GL memory %p, size 0x%zx, offset=0x%llx", - interop_deviceMemory_, size, out.buf_offset); deviceMemory_ = static_cast(interop_deviceMemory_) + out.buf_offset; - if (status != HSA_STATUS_SUCCESS) return false; - - // if map_buffer wrote a legitimate SRD, copy it to amdImageDesc_ - if ((metadata_size != 0) && - (reinterpret_cast(metadata)->deviceID == - amdImageDesc_->deviceID)) { - memcpy(amdImageDesc_, metadata, metadata_size); - } - - kind_ = MEMORY_KIND_INTEROP; - assert(deviceMemory_ != nullptr && "Interop map failed to produce a pointer!"); - return true; #endif } @@ -794,8 +799,18 @@ bool Buffer::create() { } // Interop buffer - if (owner()->isInterop()) return createInteropBuffer(GL_ARRAY_BUFFER, 0); - + if (owner()->isInterop()) { + amd::InteropObject* interop = owner()->getInteropObj(); + amd::VkObject* vkObject = interop->asVkObject(); + amd::GLObject* glObject = interop->asGLObject(); + if (vkObject != nullptr) { + hsa_status_t status = interopMapBuffer(vkObject->getVkSharedHandle()); + if (status != HSA_STATUS_SUCCESS) return false; + return true; + } else if (glObject != nullptr) { + return createInteropBuffer(GL_ARRAY_BUFFER,0); + } + } if (nullptr != owner()->parent()) { amd::Memory& parent = *owner()->parent(); // Sub-Buffer creation. diff --git a/rocclr/device/rocm/rocmemory.hpp b/rocclr/device/rocm/rocmemory.hpp index 4eaa576192..3ec861f74d 100644 --- a/rocclr/device/rocm/rocmemory.hpp +++ b/rocclr/device/rocm/rocmemory.hpp @@ -126,6 +126,7 @@ class Memory : public device::Memory { // Free / deregister device memory. virtual void destroy() = 0; + hsa_status_t interopMapBuffer(int fd); // Place interop object into HSA's flat address space bool createInteropBuffer(GLenum targetType, int miplevel);