P4 to Git Change 1414382 by cpaquot@cpaquot-ocl-lc-lnx on 2017/05/25 15:55:25
SWDEV-121486 - Create a metadata structure
This is needed for UGL/CL interop because in UGL, they do not pass the metadata
to KMD/KFD via amdgpu_bo_set_metadata. UGL instead will pass the SRD info
via the mesa_in.out_driver_data.
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#286 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.cpp#22 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.hpp#9 edit
[ROCm/clr commit: 2839999356]
This commit is contained in:
@@ -160,6 +160,8 @@ static const char* OclExtensionsString[] = {"cl_khr_fp64 ",
|
|||||||
"cl_amd_liquid_flash ",
|
"cl_amd_liquid_flash ",
|
||||||
NULL};
|
NULL};
|
||||||
|
|
||||||
|
static constexpr int AmdVendor = 0x1002;
|
||||||
|
|
||||||
namespace device {
|
namespace device {
|
||||||
class ClBinary;
|
class ClBinary;
|
||||||
class BlitManager;
|
class BlitManager;
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ Memory::Memory(const roc::Device& dev, amd::Memory& owner)
|
|||||||
dev_(dev),
|
dev_(dev),
|
||||||
deviceMemory_(nullptr),
|
deviceMemory_(nullptr),
|
||||||
kind_(MEMORY_KIND_NORMAL),
|
kind_(MEMORY_KIND_NORMAL),
|
||||||
|
amdImageDesc_(nullptr),
|
||||||
pinnedMemory_(nullptr) {}
|
pinnedMemory_(nullptr) {}
|
||||||
|
|
||||||
Memory::Memory(const roc::Device& dev, size_t size)
|
Memory::Memory(const roc::Device& dev, size_t size)
|
||||||
@@ -39,6 +40,7 @@ Memory::Memory(const roc::Device& dev, size_t size)
|
|||||||
dev_(dev),
|
dev_(dev),
|
||||||
deviceMemory_(nullptr),
|
deviceMemory_(nullptr),
|
||||||
kind_(MEMORY_KIND_NORMAL),
|
kind_(MEMORY_KIND_NORMAL),
|
||||||
|
amdImageDesc_(nullptr),
|
||||||
pinnedMemory_(nullptr) {}
|
pinnedMemory_(nullptr) {}
|
||||||
|
|
||||||
Memory::~Memory() {
|
Memory::~Memory() {
|
||||||
@@ -169,8 +171,7 @@ void Memory::cpuUnmap(device::VirtualDevice& vDev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Setup an interop buffer (dmabuf handle) as an OpenCL buffer
|
// Setup an interop buffer (dmabuf handle) as an OpenCL buffer
|
||||||
bool Memory::createInteropBuffer(GLenum targetType, int miplevel, size_t* metadata_size,
|
bool Memory::createInteropBuffer(GLenum targetType, int miplevel) {
|
||||||
const hsa_amd_image_descriptor_t** metadata) {
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
@@ -189,22 +190,41 @@ bool Memory::createInteropBuffer(GLenum targetType, int miplevel, size_t* metada
|
|||||||
else
|
else
|
||||||
in.access = MESA_GLINTEROP_ACCESS_READ_WRITE;
|
in.access = MESA_GLINTEROP_ACCESS_READ_WRITE;
|
||||||
|
|
||||||
|
hsa_agent_t agent = dev().getBackendDevice();
|
||||||
|
uint32_t id;
|
||||||
|
hsa_agent_get_info(agent, static_cast<hsa_agent_info_t>(HSA_AMD_AGENT_INFO_CHIP_ID), &id);
|
||||||
|
|
||||||
|
static constexpr int MaxMetadataSizeDwords = 64;
|
||||||
|
static constexpr int MaxMetadataSizeBytes = MaxMetadataSizeDwords * sizeof(int);
|
||||||
|
amdImageDesc_ = reinterpret_cast<hsa_amd_image_descriptor_t*>(new int[MaxMetadataSizeDwords + 2]);
|
||||||
|
if (amdImageDesc_ == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
amdImageDesc_->version = 1;
|
||||||
|
amdImageDesc_->deviceID = AmdVendor << 16 | id;
|
||||||
|
|
||||||
in.target = targetType;
|
in.target = targetType;
|
||||||
in.obj = owner()->getInteropObj()->asGLObject()->getGLName();
|
in.obj = owner()->getInteropObj()->asGLObject()->getGLName();
|
||||||
in.miplevel = miplevel;
|
in.miplevel = miplevel;
|
||||||
in.out_driver_data_size = 0;
|
in.out_driver_data_size = MaxMetadataSizeBytes;
|
||||||
in.out_driver_data = nullptr;
|
in.out_driver_data = &amdImageDesc_->data[0];
|
||||||
|
|
||||||
if (!dev().mesa().Export(in, out)) return false;
|
if (!dev().mesa().Export(in, out)) return false;
|
||||||
|
|
||||||
size_t size;
|
size_t size;
|
||||||
hsa_agent_t agent = dev().getBackendDevice();
|
size_t metadata_size = 0;
|
||||||
|
void* metadata;
|
||||||
hsa_status_t status = hsa_amd_interop_map_buffer(
|
hsa_status_t status = hsa_amd_interop_map_buffer(
|
||||||
1, &agent, out.dmabuf_fd, 0, &size, &deviceMemory_, metadata_size, (const void**)metadata);
|
1, &agent, out.dmabuf_fd, 0, &size, &deviceMemory_, &metadata_size, (const void**)&metadata);
|
||||||
close(out.dmabuf_fd);
|
close(out.dmabuf_fd);
|
||||||
|
|
||||||
if (status != HSA_STATUS_SUCCESS) return false;
|
if (status != HSA_STATUS_SUCCESS) return false;
|
||||||
|
|
||||||
|
// if map_buffer wrote anything in metadata, copy it to amdImageDesc_
|
||||||
|
if (metadata_size != 0) {
|
||||||
|
memcpy(amdImageDesc_, metadata, metadata_size);
|
||||||
|
}
|
||||||
|
|
||||||
kind_ = MEMORY_KIND_INTEROP;
|
kind_ = MEMORY_KIND_INTEROP;
|
||||||
assert(deviceMemory_ != nullptr && "Interop map failed to produce a pointer!");
|
assert(deviceMemory_ != nullptr && "Interop map failed to produce a pointer!");
|
||||||
|
|
||||||
@@ -585,7 +605,7 @@ bool Buffer::create() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Interop buffer
|
// Interop buffer
|
||||||
if (owner()->isInterop()) return createInteropBuffer(GL_ARRAY_BUFFER, 0, nullptr, nullptr);
|
if (owner()->isInterop()) return createInteropBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
if (nullptr != owner()->parent()) {
|
if (nullptr != owner()->parent()) {
|
||||||
amd::Memory& parent = *owner()->parent();
|
amd::Memory& parent = *owner()->parent();
|
||||||
@@ -841,27 +861,15 @@ bool Image::createInteropImage() {
|
|||||||
assert(obj->getCLGLObjectType() != CL_GL_OBJECT_BUFFER &&
|
assert(obj->getCLGLObjectType() != CL_GL_OBJECT_BUFFER &&
|
||||||
"Non-image OpenGL object used with interop image API.");
|
"Non-image OpenGL object used with interop image API.");
|
||||||
|
|
||||||
const hsa_amd_image_descriptor_t* meta;
|
|
||||||
size_t size = 0;
|
|
||||||
|
|
||||||
GLenum glTarget = obj->getGLTarget();
|
GLenum glTarget = obj->getGLTarget();
|
||||||
if (glTarget == GL_TEXTURE_CUBE_MAP) {
|
if (glTarget == GL_TEXTURE_CUBE_MAP) {
|
||||||
glTarget = obj->getCubemapFace();
|
glTarget = obj->getCubemapFace();
|
||||||
}
|
}
|
||||||
if (!createInteropBuffer(glTarget, obj->getGLMipLevel(), &size, &meta)) {
|
|
||||||
|
if (!createInteropBuffer(glTarget, obj->getGLMipLevel())) {
|
||||||
assert(false && "Failed to map image buffer.");
|
assert(false && "Failed to map image buffer.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
MAKE_SCOPE_GUARD(BufferGuard, [&]() { destroyInteropBuffer(); });
|
|
||||||
|
|
||||||
amdImageDesc_ = (hsa_amd_image_descriptor_t*)malloc(size);
|
|
||||||
if (amdImageDesc_ == nullptr) return false;
|
|
||||||
MAKE_SCOPE_GUARD(DescGuard, [&]() {
|
|
||||||
free(amdImageDesc_);
|
|
||||||
amdImageDesc_ = nullptr;
|
|
||||||
});
|
|
||||||
|
|
||||||
memcpy(amdImageDesc_, meta, size);
|
|
||||||
|
|
||||||
image_metadata desc;
|
image_metadata desc;
|
||||||
if (!desc.create(amdImageDesc_)) return false;
|
if (!desc.create(amdImageDesc_)) return false;
|
||||||
@@ -877,8 +885,6 @@ bool Image::createInteropImage() {
|
|||||||
originalDeviceMemory_, permission_, &hsaImageObject_);
|
originalDeviceMemory_, permission_, &hsaImageObject_);
|
||||||
if (err != HSA_STATUS_SUCCESS) return false;
|
if (err != HSA_STATUS_SUCCESS) return false;
|
||||||
|
|
||||||
BufferGuard.Dismiss();
|
|
||||||
DescGuard.Dismiss();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1073,9 +1079,10 @@ void Image::destroy() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete [] amdImageDesc_;
|
||||||
|
amdImageDesc_ = nullptr;
|
||||||
|
|
||||||
if (kind_ == MEMORY_KIND_INTEROP) {
|
if (kind_ == MEMORY_KIND_INTEROP) {
|
||||||
free(amdImageDesc_);
|
|
||||||
amdImageDesc_ = nullptr;
|
|
||||||
destroyInteropBuffer();
|
destroyInteropBuffer();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,8 +95,7 @@ class Memory : public device::Memory {
|
|||||||
virtual void destroy() = 0;
|
virtual void destroy() = 0;
|
||||||
|
|
||||||
// Place interop object into HSA's flat address space
|
// Place interop object into HSA's flat address space
|
||||||
bool createInteropBuffer(GLenum targetType, int miplevel, size_t* metadata_size,
|
bool createInteropBuffer(GLenum targetType, int miplevel);
|
||||||
const hsa_amd_image_descriptor_t** metadata);
|
|
||||||
|
|
||||||
void destroyInteropBuffer();
|
void destroyInteropBuffer();
|
||||||
|
|
||||||
@@ -109,6 +108,8 @@ class Memory : public device::Memory {
|
|||||||
// Track if this memory is interop, lock, gart, or normal.
|
// Track if this memory is interop, lock, gart, or normal.
|
||||||
MEMORY_KIND kind_;
|
MEMORY_KIND kind_;
|
||||||
|
|
||||||
|
hsa_amd_image_descriptor_t* amdImageDesc_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Disable copy constructor
|
// Disable copy constructor
|
||||||
Memory(const Memory&);
|
Memory(const Memory&);
|
||||||
@@ -185,7 +186,6 @@ class Image : public roc::Memory {
|
|||||||
hsa_access_permission_t permission_;
|
hsa_access_permission_t permission_;
|
||||||
hsa_ext_image_data_info_t deviceImageInfo_;
|
hsa_ext_image_data_info_t deviceImageInfo_;
|
||||||
hsa_ext_image_t hsaImageObject_;
|
hsa_ext_image_t hsaImageObject_;
|
||||||
hsa_amd_image_descriptor_t* amdImageDesc_;
|
|
||||||
|
|
||||||
void* originalDeviceMemory_;
|
void* originalDeviceMemory_;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user