From 6c5875f805b570820e9ea844990859cef4542d72 Mon Sep 17 00:00:00 2001 From: "Mrozek, Michal" Date: Tue, 14 Aug 2018 09:45:57 +0200 Subject: [PATCH] [2/n] Initialize Wddm interface in Wddm init. Change-Id: If7184e64df54b4e6840970fec67cb5bc11909b7c --- runtime/os_interface/windows/wddm/wddm.cpp | 2 -- runtime/os_interface/windows/wddm/wddm.inl | 9 +++++++++ runtime/os_interface/windows/wddm/wddm23.cpp | 1 - runtime/os_interface/windows/wddm/wddm_interface.cpp | 3 --- runtime/os_interface/windows/wddm/wddm_interface.h | 6 +++--- unit_tests/mocks/mock_wddm20.cpp | 7 +++++++ unit_tests/mocks/mock_wddm23.h | 1 + unit_tests/os_interface/windows/wddm20_tests.cpp | 4 +++- unit_tests/os_interface/windows/wddm23_tests.cpp | 6 ++++-- 9 files changed, 27 insertions(+), 12 deletions(-) diff --git a/runtime/os_interface/windows/wddm/wddm.cpp b/runtime/os_interface/windows/wddm/wddm.cpp index 18fed29039..8b7f0c3971 100644 --- a/runtime/os_interface/windows/wddm/wddm.cpp +++ b/runtime/os_interface/windows/wddm/wddm.cpp @@ -80,11 +80,9 @@ Wddm::Wddm() : initialized(false), minAddress = 0; kmDafListener = std::unique_ptr(new KmDafListener); gdi = std::unique_ptr(new Gdi()); - wddmInterface = std::make_unique(*this); } Wddm::~Wddm() { - wddmInterface->destroyHwQueue(); resetPageTableManager(nullptr); destroyContext(context); destroyPagingQueue(); diff --git a/runtime/os_interface/windows/wddm/wddm.inl b/runtime/os_interface/windows/wddm/wddm.inl index 0bfcb2c3fc..cbd3e014b0 100644 --- a/runtime/os_interface/windows/wddm/wddm.inl +++ b/runtime/os_interface/windows/wddm/wddm.inl @@ -46,6 +46,15 @@ bool Wddm::init() { if (!queryAdapterInfo()) { return false; } + + if (!wddmInterface) { + if (featureTable->ftrWddmHwQueues) { + wddmInterface = std::make_unique(*this); + } else { + wddmInterface = std::make_unique(*this); + } + } + if (!createDevice()) { return false; } diff --git a/runtime/os_interface/windows/wddm/wddm23.cpp b/runtime/os_interface/windows/wddm/wddm23.cpp index bb750a7a67..eae9e76110 100644 --- a/runtime/os_interface/windows/wddm/wddm23.cpp +++ b/runtime/os_interface/windows/wddm/wddm23.cpp @@ -25,6 +25,5 @@ namespace OCLRT { Wddm23::Wddm23() : Wddm20() { - wddmInterface = std::make_unique(*this); } } // namespace OCLRT diff --git a/runtime/os_interface/windows/wddm/wddm_interface.cpp b/runtime/os_interface/windows/wddm/wddm_interface.cpp index d4cd283296..d7decd0d98 100644 --- a/runtime/os_interface/windows/wddm/wddm_interface.cpp +++ b/runtime/os_interface/windows/wddm/wddm_interface.cpp @@ -28,9 +28,6 @@ bool OCLRT::WddmInterface20::createHwQueue(PreemptionMode preemptionMode) { return false; } -void OCLRT::WddmInterface20::destroyHwQueue() { -} - bool OCLRT::WddmInterface20::createMonitoredFence() { NTSTATUS Status; D3DKMT_CREATESYNCHRONIZATIONOBJECT2 CreateSynchronizationObject = {0}; diff --git a/runtime/os_interface/windows/wddm/wddm_interface.h b/runtime/os_interface/windows/wddm/wddm_interface.h index f665067f9f..02312eb875 100644 --- a/runtime/os_interface/windows/wddm/wddm_interface.h +++ b/runtime/os_interface/windows/wddm/wddm_interface.h @@ -29,9 +29,9 @@ class Wddm; class WddmInterface { public: WddmInterface(Wddm &wddm) : wddm(wddm){}; + virtual ~WddmInterface() = default; WddmInterface() = delete; virtual bool createHwQueue(PreemptionMode preemptionMode) = 0; - virtual void destroyHwQueue() = 0; virtual bool createMonitoredFence() = 0; virtual const bool hwQueuesSupported() = 0; virtual bool submit(uint64_t commandBuffer, size_t size, void *commandHeader) = 0; @@ -42,7 +42,6 @@ class WddmInterface20 : public WddmInterface { public: using WddmInterface::WddmInterface; bool createHwQueue(PreemptionMode preemptionMode) override; - void destroyHwQueue() override; bool createMonitoredFence() override; const bool hwQueuesSupported() override; bool submit(uint64_t commandBuffer, size_t size, void *commandHeader) override; @@ -50,9 +49,10 @@ class WddmInterface20 : public WddmInterface { class WddmInterface23 : public WddmInterface { public: + ~WddmInterface23() override { destroyHwQueue(); } using WddmInterface::WddmInterface; bool createHwQueue(PreemptionMode preemptionMode) override; - void destroyHwQueue() override; + void destroyHwQueue(); bool createMonitoredFence() override; const bool hwQueuesSupported() override; bool submit(uint64_t commandBuffer, size_t size, void *commandHeader) override; diff --git a/unit_tests/mocks/mock_wddm20.cpp b/unit_tests/mocks/mock_wddm20.cpp index 108bd55cdf..e81887b54d 100644 --- a/unit_tests/mocks/mock_wddm20.cpp +++ b/unit_tests/mocks/mock_wddm20.cpp @@ -246,6 +246,13 @@ bool WddmMock::initializeWithoutConfiguringAddressSpace() { if (!queryAdapterInfo()) { return false; } + + if (featureTable->ftrWddmHwQueues) { + wddmInterface = std::make_unique(*this); + } else { + wddmInterface = std::make_unique(*this); + } + if (!createDevice()) { return false; } diff --git a/unit_tests/mocks/mock_wddm23.h b/unit_tests/mocks/mock_wddm23.h index dd49c6112e..eb45c2f884 100644 --- a/unit_tests/mocks/mock_wddm23.h +++ b/unit_tests/mocks/mock_wddm23.h @@ -27,6 +27,7 @@ namespace OCLRT { class WddmMock23 : public Wddm23 { public: + using Wddm::featureTable; using Wddm::preemptionMode; using Wddm::wddmInterface; using Wddm23::context; diff --git a/unit_tests/os_interface/windows/wddm20_tests.cpp b/unit_tests/os_interface/windows/wddm20_tests.cpp index 299b2d423b..8e7976ddb6 100644 --- a/unit_tests/os_interface/windows/wddm20_tests.cpp +++ b/unit_tests/os_interface/windows/wddm20_tests.cpp @@ -647,6 +647,7 @@ HWTEST_F(Wddm20Tests, getMaxApplicationAddress) { } HWTEST_F(Wddm20Tests, dontCallCreateContextBeforeConfigureDeviceAddressSpace) { + wddm->wddmInterface = std::make_unique(*wddm); wddm->createContext(); EXPECT_EQ(1u, wddm->createContextResult.called); // dont care about the result @@ -680,7 +681,8 @@ HWTEST_F(Wddm20WithMockGdiDllTests, whenCreateContextIsCalledThenDisableHwQueues EXPECT_EQ(0u, getCreateContextDataFcn()->Flags.HwQueueSupported); } -TEST_F(Wddm20Tests, whenCreateHwQueueIsCalledThenAlwaysReturnFalse) { +HWTEST_F(Wddm20Tests, whenCreateHwQueueIsCalledThenAlwaysReturnFalse) { + wddm->init(); EXPECT_FALSE(wddm->wddmInterface->createHwQueue(wddm->preemptionMode)); } diff --git a/unit_tests/os_interface/windows/wddm23_tests.cpp b/unit_tests/os_interface/windows/wddm23_tests.cpp index 8ab33b15c0..8f29a1ddf9 100644 --- a/unit_tests/os_interface/windows/wddm23_tests.cpp +++ b/unit_tests/os_interface/windows/wddm23_tests.cpp @@ -34,7 +34,9 @@ struct Wddm23Tests : public ::testing::Test, GdiDllFixture, public GmmEnvironmen void SetUp() override { GmmEnvironmentFixture::SetUp(); GdiDllFixture::SetUp(); + wddm.reset(static_cast(Wddm::createWddm(WddmInterfaceVersion::Wddm23))); + wddm->featureTable->ftrWddmHwQueues = true; wddmMockInterface = new WddmMockInterface23(*wddm); wddm->wddmInterface.reset(wddmMockInterface); wddm->registryReader.reset(new RegistryReaderMock()); @@ -94,11 +96,11 @@ TEST_F(Wddm23Tests, givenPreemptionModeWhenCreateHwQueueCalledThenSetGpuTimeoutI HWTEST_F(Wddm23Tests, whenDestroyHwQueueCalledThenPassExistingHandle) { wddm->init(); wddmMockInterface->hwQueueHandle = 123; - wddm->wddmInterface->destroyHwQueue(); + wddmMockInterface->destroyHwQueue(); EXPECT_EQ(wddmMockInterface->hwQueueHandle, getDestroyHwQueueDataFcn()->hHwQueue); wddmMockInterface->hwQueueHandle = 0; - wddm->wddmInterface->destroyHwQueue(); + wddmMockInterface->destroyHwQueue(); EXPECT_NE(wddmMockInterface->hwQueueHandle, getDestroyHwQueueDataFcn()->hHwQueue); // gdi not called when 0 }