From 386e7e52598fe628ab61fac8098eccb64229b4e5 Mon Sep 17 00:00:00 2001 From: Igor Venevtsev Date: Thu, 15 Jun 2023 15:01:53 +0000 Subject: [PATCH] feature: enable direct submission on Windows for WDDM 2.0 Related-To: NEO-4843 Signed-off-by: Igor Venevtsev --- .../os_interface/windows/os_context_win.cpp | 7 +++++++ .../os_interface/windows/os_context_win.h | 1 + .../windows/os_context_win_tests.cpp | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/shared/source/os_interface/windows/os_context_win.cpp b/shared/source/os_interface/windows/os_context_win.cpp index 8ea2e410f5..43d333d70d 100644 --- a/shared/source/os_interface/windows/os_context_win.cpp +++ b/shared/source/os_interface/windows/os_context_win.cpp @@ -11,6 +11,7 @@ #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/os_interface/debug_env_reader.h" #include "shared/source/os_interface/os_interface.h" +#include "shared/source/os_interface/product_helper.h" #include "shared/source/os_interface/windows/wddm/wddm.h" #include "shared/source/os_interface/windows/wddm/wddm_interface.h" @@ -90,6 +91,12 @@ uint64_t OsContextWin::getOfflineDumpContextId(uint32_t deviceIndex) const { return 0; } +bool OsContextWin::isDirectSubmissionSupported(const HardwareInfo &hwInfo) const { + auto &productHelper = wddm.getRootDeviceEnvironment().getHelper(); + + return wddm.getWddmVersion() == WddmVersion::WDDM_2_0 && productHelper.isDirectSubmissionSupported(hwInfo); +} + OsContextWin::~OsContextWin() { if (contextInitialized && (false == this->wddm.skipResourceCleanup())) { wddm.getWddmInterface()->destroyHwQueue(hardwareQueue.handle); diff --git a/shared/source/os_interface/windows/os_context_win.h b/shared/source/os_interface/windows/os_context_win.h index 85f1b8785c..f5e497f571 100644 --- a/shared/source/os_interface/windows/os_context_win.h +++ b/shared/source/os_interface/windows/os_context_win.h @@ -31,6 +31,7 @@ class OsContextWin : public OsContext { void setWddmContextHandle(D3DKMT_HANDLE wddmContextHandle) { this->wddmContextHandle = wddmContextHandle; } HardwareQueue getHwQueue() const { return hardwareQueue; } void setHwQueue(HardwareQueue hardwareQueue) { this->hardwareQueue = hardwareQueue; } + bool isDirectSubmissionSupported(const HardwareInfo &hwInfo) const override; Wddm *getWddm() const { return &wddm; } MOCKABLE_VIRTUAL WddmResidencyController &getResidencyController() { return residencyController; } static OsContext *create(OSInterface *osInterface, uint32_t rootDeviceIndex, uint32_t contextId, const EngineDescriptor &engineDescriptor); diff --git a/shared/test/unit_test/os_interface/windows/os_context_win_tests.cpp b/shared/test/unit_test/os_interface/windows/os_context_win_tests.cpp index b656e77f74..8234860abd 100644 --- a/shared/test/unit_test/os_interface/windows/os_context_win_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/os_context_win_tests.cpp @@ -74,6 +74,23 @@ TEST_F(OsContextWinTest, givenOsContextWinWhenQueryingForOfflineDumpContextIdThe EXPECT_EQ(0u, osContext->getOfflineDumpContextId(0)); } +TEST_F(OsContextWinTest, givenWddm20AndProductSupportDirectSubmissionThenDirectSubmissionIsSupported) { + auto &hwInfo = *this->rootDeviceEnvironment->getHardwareInfo(); + auto &productHelper = this->rootDeviceEnvironment->getHelper(); + osContext = std::make_unique(*osInterface->getDriverModel()->as(), 0, 0u, EngineDescriptorHelper::getDefaultDescriptor(engineTypeUsage, preemptionMode)); + EXPECT_EQ(productHelper.isDirectSubmissionSupported(hwInfo), osContext->isDirectSubmissionSupported(hwInfo)); +} + +TEST_F(OsContextWinTest, givenWddm23ThenDirectSubmissionIsNotSupported) { + struct WddmMock : public Wddm { + using Wddm::featureTable; + }; + auto wddm = static_cast(osInterface->getDriverModel()->as()); + wddm->featureTable.get()->flags.ftrWddmHwQueues = 1; + osContext = std::make_unique(*wddm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor(engineTypeUsage, preemptionMode)); + EXPECT_FALSE(osContext->isDirectSubmissionSupported(*this->rootDeviceEnvironment->getHardwareInfo())); +} + struct OsContextWinTestNoCleanup : public WddmTestWithMockGdiDllNoCleanup { void SetUp() override { WddmTestWithMockGdiDllNoCleanup::SetUp();