mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Drm create context with an implicit virtual memory address space
Related-To: NEO-4821 Change-Id: I18545d976788daacbb195e243f4049b7f83fd3a2
This commit is contained in:

committed by
sys_ocldev

parent
031ee61b5a
commit
3c4c7a0215
@ -103,7 +103,9 @@ Drm *Drm::create(std::unique_ptr<HwDeviceId> hwDeviceId, RootDeviceEnvironment &
|
||||
}
|
||||
}
|
||||
|
||||
drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()));
|
||||
if (!drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()))) {
|
||||
printDebugString(DebugManager.flags.PrintDebugMessages.get(), stderr, "%s", "INFO: Device doesn't support GEM Virtual Memory\n");
|
||||
}
|
||||
|
||||
return drmObject.release();
|
||||
}
|
||||
|
@ -15,6 +15,8 @@
|
||||
|
||||
class DrmWrap : public NEO::Drm {
|
||||
public:
|
||||
using Drm::virtualMemoryIds;
|
||||
|
||||
static std::unique_ptr<NEO::Drm> createDrm(RootDeviceEnvironment &rootDeviceEnvironment) {
|
||||
auto hwDeviceIds = OSInterface::discoverDevices(rootDeviceEnvironment.executionEnvironment);
|
||||
if (!hwDeviceIds.empty()) {
|
||||
|
@ -430,11 +430,23 @@ TEST_F(DrmTests, whenDrmIsCreatedWithMultipleSubDevicesThenCreateMultipleVirtual
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenCallAbort) {
|
||||
VariableBackup<decltype(failOnVirtualMemoryCreate)> backupFailOnVirtaualMemoryCreate(&failOnVirtualMemoryCreate);
|
||||
TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualMemoryIdZeroAndPrintDebugMessage) {
|
||||
DebugManagerStateRestore dbgRestorer;
|
||||
DebugManager.flags.PrintDebugMessages.set(true);
|
||||
|
||||
VariableBackup<decltype(failOnVirtualMemoryCreate)> backupFailOnVirtualMemoryCreate(&failOnVirtualMemoryCreate);
|
||||
|
||||
failOnVirtualMemoryCreate = -1;
|
||||
EXPECT_THROW(DrmWrap::createDrm(*rootDeviceEnvironment), std::exception);
|
||||
|
||||
::testing::internal::CaptureStderr();
|
||||
auto drm = DrmWrap::createDrm(*rootDeviceEnvironment);
|
||||
EXPECT_NE(drm, nullptr);
|
||||
|
||||
EXPECT_EQ(0u, drm->getVirtualMemoryAddressSpace(0));
|
||||
EXPECT_EQ(0u, static_cast<DrmWrap *>(drm.get())->virtualMemoryIds.size());
|
||||
|
||||
std::string errStr = ::testing::internal::GetCapturedStderr();
|
||||
EXPECT_THAT(errStr, ::testing::HasSubstr(std::string("INFO: Device doesn't support GEM Virtual Memory")));
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
@ -215,11 +215,13 @@ void Drm::destroyDrmContext(uint32_t drmContextId) {
|
||||
UNRECOVERABLE_IF(retVal != 0);
|
||||
}
|
||||
|
||||
uint32_t Drm::createDrmVirtualMemory() {
|
||||
int Drm::createDrmVirtualMemory(uint32_t &drmVmId) {
|
||||
drm_i915_gem_vm_control ctl = {};
|
||||
auto ret = SysCalls::ioctl(getFileDescriptor(), DRM_IOCTL_I915_GEM_VM_CREATE, &ctl);
|
||||
UNRECOVERABLE_IF(ret != 0);
|
||||
return ctl.vm_id;
|
||||
if (ret == 0) {
|
||||
drmVmId = ctl.vm_id;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Drm::destroyDrmVirtualMemory(uint32_t drmVmId) {
|
||||
@ -424,7 +426,10 @@ bool Drm::queryTopology(int &sliceCount, int &subSliceCount, int &euCount) {
|
||||
|
||||
bool Drm::createVirtualMemoryAddressSpace(uint32_t vmCount) {
|
||||
for (auto i = 0u; i < vmCount; i++) {
|
||||
auto id = createDrmVirtualMemory();
|
||||
uint32_t id = 0;
|
||||
if (0 != createDrmVirtualMemory(id)) {
|
||||
return false;
|
||||
}
|
||||
virtualMemoryIds.push_back(id);
|
||||
}
|
||||
return true;
|
||||
@ -437,9 +442,11 @@ void Drm::destroyVirtualMemoryAddressSpace() {
|
||||
}
|
||||
|
||||
uint32_t Drm::getVirtualMemoryAddressSpace(uint32_t vmId) {
|
||||
UNRECOVERABLE_IF(vmId >= virtualMemoryIds.size())
|
||||
if (vmId < virtualMemoryIds.size()) {
|
||||
return virtualMemoryIds[vmId];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Drm::~Drm() {
|
||||
destroyVirtualMemoryAddressSpace();
|
||||
|
@ -67,7 +67,7 @@ class Drm {
|
||||
|
||||
MOCKABLE_VIRTUAL void checkPreemptionSupport();
|
||||
inline int getFileDescriptor() const { return hwDeviceId->getFileDescriptor(); }
|
||||
uint32_t createDrmVirtualMemory();
|
||||
int createDrmVirtualMemory(uint32_t &drmVmId);
|
||||
void destroyDrmVirtualMemory(uint32_t drmVmId);
|
||||
uint32_t createDrmContext(uint32_t drmVmId);
|
||||
void destroyDrmContext(uint32_t drmContextId);
|
||||
|
Reference in New Issue
Block a user