SWDEV-392870 - Enable p2p support for image using PAL.
Change-Id: I3acbbc01ee11e488e93204814361b8c3431bca4f
This commit is contained in:
zatwierdzone przez
Jaydeepkumar Patel
rodzic
c585aefdb7
commit
82e4859e03
@@ -1678,6 +1678,22 @@ pal::Memory* Device::createImage(amd::Memory& owner, bool directAccess) const {
|
||||
|
||||
// Create memory object
|
||||
result = gpuImage->create(Resource::Pinned, ¶ms);
|
||||
} else {
|
||||
Resource::CreateParams params;
|
||||
params.owner_ = &owner;
|
||||
params.gpu_ = static_cast<VirtualGPU*>(owner.getVirtualDevice());
|
||||
params.svmBase_ = static_cast<Memory*>(owner.svmBase());
|
||||
Resource::MemoryType type = Resource::MemoryType::Empty;
|
||||
if (owner.P2PAccess()) {
|
||||
params.svmBase_ = static_cast<Memory*>(owner.BaseP2PMemory());
|
||||
if (params.svmBase_ != nullptr) {
|
||||
type = Resource::P2PAccess;
|
||||
}
|
||||
}
|
||||
if (type == Resource::P2PAccess) {
|
||||
// Create memory object
|
||||
result = gpuImage->create(type, ¶ms);
|
||||
}
|
||||
}
|
||||
|
||||
if (!result && !owner.isInterop()) {
|
||||
|
||||
@@ -220,7 +220,32 @@ GpuMemoryReference* GpuMemoryReference::Create(const Device& dev,
|
||||
}
|
||||
return memRef;
|
||||
}
|
||||
GpuMemoryReference* GpuMemoryReference::Create(const Device& dev,
|
||||
const Pal::PeerImageOpenInfo& openInfo,
|
||||
Pal::IImage** image) {
|
||||
Pal::Result result;
|
||||
size_t imageSize = 0;
|
||||
size_t gpuMemSize = 0;
|
||||
dev.iDev()->GetPeerImageSizes(openInfo, &imageSize, &gpuMemSize, &result);
|
||||
if (Pal::Result::Success != result) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
char* imgMem = new char[imageSize];
|
||||
GpuMemoryReference* memRef = new (gpuMemSize) GpuMemoryReference(dev);
|
||||
if (memRef != nullptr) {
|
||||
result = dev.iDev()->OpenPeerImage(openInfo, imgMem, &memRef[1], image,
|
||||
&memRef->gpuMem_);
|
||||
if (result == Pal::Result::Success) {
|
||||
result = memRef->MakeResident();
|
||||
}
|
||||
if (result != Pal::Result::Success) {
|
||||
memRef->release();
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
return memRef;
|
||||
}
|
||||
// ================================================================================================
|
||||
GpuMemoryReference::GpuMemoryReference(const Device& dev)
|
||||
: gpuMem_(nullptr), cpuAddress_(nullptr), device_(dev), gpu_(nullptr) {}
|
||||
@@ -1003,11 +1028,16 @@ bool Resource::CreateInterop(CreateParams* params) {
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
bool Resource::CreateP2PAccess(CreateParams* params) {
|
||||
Pal::PeerGpuMemoryOpenInfo openInfo = {};
|
||||
openInfo.pOriginalMem = params->svmBase_->iMem();
|
||||
|
||||
memRef_ = GpuMemoryReference::Create(dev(), openInfo);
|
||||
bool Resource::CreateP2PAccess(CreateParams* params) {
|
||||
if (params->owner_->asImage()) {
|
||||
Pal::PeerImageOpenInfo openInfo = {};
|
||||
openInfo.pOriginalImage = params->svmBase_->image();
|
||||
memRef_ = GpuMemoryReference::Create(dev(), openInfo, &image_);
|
||||
} else {
|
||||
Pal::PeerGpuMemoryOpenInfo openInfo = {};
|
||||
openInfo.pOriginalMem = params->svmBase_->iMem();
|
||||
memRef_ = GpuMemoryReference::Create(dev(), openInfo);
|
||||
}
|
||||
if (nullptr == memRef_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -55,6 +55,8 @@ class GpuMemoryReference : public amd::ReferenceCountedObject {
|
||||
|
||||
static GpuMemoryReference* Create(const Device& dev, const Pal::PeerGpuMemoryOpenInfo& openInfo);
|
||||
|
||||
static GpuMemoryReference* Create(const Device& dev, const Pal::PeerImageOpenInfo& openInfo,
|
||||
Pal::IImage** image);
|
||||
//! Default constructor
|
||||
GpuMemoryReference(const Device& dev);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user