mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 23:03:02 +08:00
Wddm 2.3 improvements
- Dont create synchronization object manually - take it from HW queue - Construct MonitoredFence from HwQueue object - D3DKMT_SUBMITCOMMANDTOHWQUEUE should get currentFenceValue instead of its handle - Dont pass MonitoredFenceVa/Value in cmd buffer header Change-Id: I4717119379cef2f0e641ce9f4ef614089491a85d Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com> Related-To: NEO-3728
This commit is contained in:
committed by
sys_ocldev
parent
49e17d734e
commit
c0c6a46ece
@@ -649,7 +649,7 @@ TEST_F(Wddm20Tests, createMonitoredFenceIsInitializedWithFenceValueZeroAndCurren
|
||||
|
||||
gdi->getCreateSynchronizationObject2Arg().Info.MonitoredFence.InitialFenceValue = 300;
|
||||
|
||||
wddm->wddmInterface->createMonitoredFence(osContext->getResidencyController());
|
||||
wddm->wddmInterface->createMonitoredFence(*osContext);
|
||||
|
||||
EXPECT_EQ(0u, gdi->getCreateSynchronizationObject2Arg().Info.MonitoredFence.InitialFenceValue);
|
||||
EXPECT_EQ(1u, osContext->getResidencyController().getMonitoredFence().currentFenceValue);
|
||||
|
||||
@@ -86,19 +86,19 @@ TEST_F(Wddm23Tests, givenPreemptionModeWhenCreateHwQueueCalledThenSetGpuTimeoutI
|
||||
|
||||
TEST_F(Wddm23Tests, whenDestroyHwQueueCalledThenPassExistingHandle) {
|
||||
D3DKMT_HANDLE hwQueue = 123;
|
||||
osContext->setHwQueue(hwQueue);
|
||||
wddmMockInterface->destroyHwQueue(osContext->getHwQueue());
|
||||
osContext->setHwQueue({hwQueue, 0, nullptr, 0});
|
||||
wddmMockInterface->destroyHwQueue(osContext->getHwQueue().handle);
|
||||
EXPECT_EQ(hwQueue, getDestroyHwQueueDataFcn()->hHwQueue);
|
||||
|
||||
hwQueue = 0;
|
||||
osContext->setHwQueue(hwQueue);
|
||||
wddmMockInterface->destroyHwQueue(osContext->getHwQueue());
|
||||
osContext->setHwQueue({hwQueue, 0, nullptr, 0});
|
||||
wddmMockInterface->destroyHwQueue(osContext->getHwQueue().handle);
|
||||
EXPECT_NE(hwQueue, getDestroyHwQueueDataFcn()->hHwQueue); // gdi not called when 0
|
||||
}
|
||||
|
||||
TEST_F(Wddm23Tests, whenObjectIsDestructedThenDestroyHwQueue) {
|
||||
D3DKMT_HANDLE hwQueue = 123;
|
||||
osContext->setHwQueue(hwQueue);
|
||||
osContext->setHwQueue({hwQueue, 0, nullptr, 0});
|
||||
osContext.reset();
|
||||
EXPECT_EQ(hwQueue, getDestroyHwQueueDataFcn()->hHwQueue);
|
||||
}
|
||||
@@ -116,24 +116,25 @@ TEST_F(Wddm23Tests, givenCmdBufferWhenSubmitCalledThenSetAllRequiredFiledsAndUpd
|
||||
|
||||
EXPECT_EQ(cmdBufferAddress, getSubmitCommandToHwQueueDataFcn()->CommandBuffer);
|
||||
EXPECT_EQ(static_cast<UINT>(cmdSize), getSubmitCommandToHwQueueDataFcn()->CommandLength);
|
||||
EXPECT_EQ(hwQueue, getSubmitCommandToHwQueueDataFcn()->hHwQueue);
|
||||
EXPECT_EQ(osContext->getResidencyController().getMonitoredFence().fenceHandle, getSubmitCommandToHwQueueDataFcn()->HwQueueProgressFenceId);
|
||||
EXPECT_EQ(hwQueue.handle, getSubmitCommandToHwQueueDataFcn()->hHwQueue);
|
||||
EXPECT_EQ(osContext->getResidencyController().getMonitoredFence().lastSubmittedFence, getSubmitCommandToHwQueueDataFcn()->HwQueueProgressFenceId);
|
||||
EXPECT_EQ(&cmdBufferHeader, getSubmitCommandToHwQueueDataFcn()->pPrivateDriverData);
|
||||
EXPECT_EQ(static_cast<UINT>(MemoryConstants::pageSize), getSubmitCommandToHwQueueDataFcn()->PrivateDriverDataSize);
|
||||
|
||||
EXPECT_EQ(osContext->getResidencyController().getMonitoredFence().gpuAddress, cmdBufferHeader.MonitorFenceVA);
|
||||
EXPECT_EQ(osContext->getResidencyController().getMonitoredFence().lastSubmittedFence, cmdBufferHeader.MonitorFenceValue);
|
||||
EXPECT_EQ(0u, cmdBufferHeader.MonitorFenceVA);
|
||||
EXPECT_EQ(0u, cmdBufferHeader.MonitorFenceValue);
|
||||
EXPECT_EQ(2u, osContext->getResidencyController().getMonitoredFence().currentFenceValue);
|
||||
EXPECT_EQ(1u, osContext->getResidencyController().getMonitoredFence().lastSubmittedFence);
|
||||
}
|
||||
|
||||
TEST_F(Wddm23Tests, whenMonitoredFenceIsCreatedThenSetupAllRequiredFields) {
|
||||
wddm->wddmInterface->createMonitoredFence(osContext->getResidencyController());
|
||||
wddm->wddmInterface->createMonitoredFence(*osContext);
|
||||
auto hwQueue = osContext->getHwQueue();
|
||||
|
||||
EXPECT_NE(nullptr, osContext->getResidencyController().getMonitoredFence().cpuAddress);
|
||||
EXPECT_EQ(hwQueue.progressFenceCpuVA, osContext->getResidencyController().getMonitoredFence().cpuAddress);
|
||||
EXPECT_EQ(1u, osContext->getResidencyController().getMonitoredFence().currentFenceValue);
|
||||
EXPECT_NE(static_cast<D3DKMT_HANDLE>(0), osContext->getResidencyController().getMonitoredFence().fenceHandle);
|
||||
EXPECT_NE(static_cast<D3DGPU_VIRTUAL_ADDRESS>(0), osContext->getResidencyController().getMonitoredFence().gpuAddress);
|
||||
EXPECT_EQ(hwQueue.progressFenceHandle, osContext->getResidencyController().getMonitoredFence().fenceHandle);
|
||||
EXPECT_EQ(hwQueue.progressFenceGpuVA, osContext->getResidencyController().getMonitoredFence().gpuAddress);
|
||||
EXPECT_EQ(0u, osContext->getResidencyController().getMonitoredFence().lastSubmittedFence);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,6 +48,18 @@ class MockWddmResidencyController : public WddmResidencyController {
|
||||
}
|
||||
};
|
||||
|
||||
class MockOsContextWin : public OsContextWin {
|
||||
public:
|
||||
MockOsContextWin(Wddm &wddm, uint32_t contextId, DeviceBitfield deviceBitfield,
|
||||
aub_stream::EngineType engineType, PreemptionMode preemptionMode, bool lowPriority)
|
||||
: OsContextWin(wddm, contextId, deviceBitfield, engineType, preemptionMode, lowPriority),
|
||||
mockResidencyController(wddm, contextId) {}
|
||||
|
||||
WddmResidencyController &getResidencyController() override { return mockResidencyController; };
|
||||
|
||||
MockWddmResidencyController mockResidencyController;
|
||||
};
|
||||
|
||||
struct WddmResidencyControllerTest : ::testing::Test {
|
||||
const uint32_t osContextId = 0u;
|
||||
|
||||
@@ -55,12 +67,14 @@ struct WddmResidencyControllerTest : ::testing::Test {
|
||||
wddm = std::unique_ptr<WddmMock>(static_cast<WddmMock *>(Wddm::createWddm()));
|
||||
auto hwInfo = *platformDevices[0];
|
||||
wddm->init(hwInfo);
|
||||
residencyController = std::make_unique<MockWddmResidencyController>(*wddm, osContextId);
|
||||
wddm->getWddmInterface()->createMonitoredFence(*residencyController);
|
||||
mockOsContextWin = std::make_unique<MockOsContextWin>(*wddm, osContextId, 0, aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false);
|
||||
wddm->getWddmInterface()->createMonitoredFence(*mockOsContextWin);
|
||||
residencyController = &mockOsContextWin->mockResidencyController;
|
||||
}
|
||||
|
||||
std::unique_ptr<WddmMock> wddm;
|
||||
std::unique_ptr<MockWddmResidencyController> residencyController;
|
||||
std::unique_ptr<MockOsContextWin> mockOsContextWin;
|
||||
MockWddmResidencyController *residencyController = nullptr;
|
||||
};
|
||||
|
||||
struct WddmResidencyControllerWithGdiTest : ::testing::Test {
|
||||
@@ -73,13 +87,15 @@ struct WddmResidencyControllerWithGdiTest : ::testing::Test {
|
||||
auto hwInfo = *platformDevices[0];
|
||||
wddm->init(hwInfo);
|
||||
|
||||
residencyController = std::make_unique<MockWddmResidencyController>(*wddm, osContextId);
|
||||
wddm->getWddmInterface()->createMonitoredFence(*residencyController);
|
||||
mockOsContextWin = std::make_unique<MockOsContextWin>(*wddm, osContextId, 0, aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false);
|
||||
wddm->getWddmInterface()->createMonitoredFence(*mockOsContextWin);
|
||||
residencyController = &mockOsContextWin->mockResidencyController;
|
||||
residencyController->registerCallback();
|
||||
}
|
||||
|
||||
std::unique_ptr<WddmMock> wddm;
|
||||
std::unique_ptr<MockWddmResidencyController> residencyController;
|
||||
std::unique_ptr<MockOsContextWin> mockOsContextWin;
|
||||
MockWddmResidencyController *residencyController = nullptr;
|
||||
MockGdi *gdi;
|
||||
};
|
||||
|
||||
@@ -212,7 +228,7 @@ TEST_F(WddmResidencyControllerWithGdiTest, givenWddmResidencyControllerWhenItIsD
|
||||
auto trimCallbackAddress = reinterpret_cast<PFND3DKMT_TRIMNOTIFICATIONCALLBACK>(WddmResidencyController::trimCallback);
|
||||
|
||||
std::memset(&gdi->getUnregisterTrimNotificationArg(), 0, sizeof(D3DKMT_UNREGISTERTRIMNOTIFICATION));
|
||||
residencyController.reset();
|
||||
mockOsContextWin.reset();
|
||||
|
||||
EXPECT_EQ(trimCallbackAddress, gdi->getUnregisterTrimNotificationArg().Callback);
|
||||
EXPECT_EQ(trimCallbackHandle, gdi->getUnregisterTrimNotificationArg().Handle);
|
||||
|
||||
Reference in New Issue
Block a user