diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b92513d62..f747b1b93b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -984,7 +984,7 @@ set(BUILTINS_BINARIES_BINDLESS_LIB_NAME "builtins_binaries_bindless") set(BUILTINS_SPIRV_LIB_NAME "builtins_spirv") if(WIN32) - set(NEO_EXTRA_LIBS Ws2_32) + set(NEO_EXTRA_LIBS Ws2_32 winmm) else() set(NEO_EXTRA_LIBS dl pthread rt) endif() diff --git a/level_zero/CMakeLists.txt b/level_zero/CMakeLists.txt index b6703ab5d5..7da2efaafb 100644 --- a/level_zero/CMakeLists.txt +++ b/level_zero/CMakeLists.txt @@ -261,6 +261,7 @@ if(BUILD_WITH_L0) ${NEO_SHARED_DIRECTORY}/gmm_helper/windows/gmm_memory.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/gmm_interface_win.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/sys_calls.cpp + ${NEO_SHARED_DIRECTORY}/os_interface/windows/sys_calls_winmm.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/os_interface_win.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/os_memory_virtual_alloc.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/wddm/wddm_calls.cpp diff --git a/opencl/source/dll/CMakeLists.txt b/opencl/source/dll/CMakeLists.txt index a22ac3b8cb..4c8b323109 100644 --- a/opencl/source/dll/CMakeLists.txt +++ b/opencl/source/dll/CMakeLists.txt @@ -64,6 +64,7 @@ set(RUNTIME_SRCS_DLL_WINDOWS ${NEO_SHARED_DIRECTORY}/gmm_helper/windows/gmm_memory.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/os_memory_virtual_alloc.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/sys_calls.cpp + ${NEO_SHARED_DIRECTORY}/os_interface/windows/sys_calls_winmm.cpp ${NEO_SHARED_DIRECTORY}/os_interface/windows/wddm/wddm_calls.cpp ${NEO_SHARED_DIRECTORY}/dll/wddm/wddm_create.cpp ${NEO_SOURCE_DIR}/opencl/source/os_interface/windows/platform_teardown_win.cpp diff --git a/opencl/test/unit_test/windows/CMakeLists.txt b/opencl/test/unit_test/windows/CMakeLists.txt index 5e310d0003..5025532273 100644 --- a/opencl/test/unit_test/windows/CMakeLists.txt +++ b/opencl/test/unit_test/windows/CMakeLists.txt @@ -32,6 +32,7 @@ if(WIN32) ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/options.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/setup_external_dependencies_drm_or_wddm.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls.cpp + ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls_winmm.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/wddm_calls.cpp ${NEO_SOURCE_DIR}/opencl/test/unit_test/test_macros/test_checks_ocl.cpp ) diff --git a/shared/source/direct_submission/direct_submission_controller.cpp b/shared/source/direct_submission/direct_submission_controller.cpp index cb2ab6e122..af2d4f2934 100644 --- a/shared/source/direct_submission/direct_submission_controller.cpp +++ b/shared/source/direct_submission/direct_submission_controller.cpp @@ -188,10 +188,6 @@ void DirectSubmissionController::checkNewSubmissions() { } } -bool DirectSubmissionController::sleep(std::unique_lock &lock) { - return NEO::waitOnConditionWithPredicate(condVar, lock, getSleepValue(), [&] { return !pagingFenceRequests.empty(); }); -} - bool DirectSubmissionController::isDirectSubmissionIdle(CommandStreamReceiver *csr, std::unique_lock &csrLock) { if (csr->peekLatestFlushedTaskCount() == csr->peekTaskCount()) { return !csr->isBusy(); diff --git a/shared/source/direct_submission/linux/CMakeLists.txt b/shared/source/direct_submission/linux/CMakeLists.txt index 70153c0fcb..9234c1ef13 100644 --- a/shared/source/direct_submission/linux/CMakeLists.txt +++ b/shared/source/direct_submission/linux/CMakeLists.txt @@ -6,6 +6,7 @@ set(NEO_CORE_DIRECT_SUBMISSION_LINUX ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_controller_linux.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drm_direct_submission.h ${CMAKE_CURRENT_SOURCE_DIR}/drm_direct_submission.inl ) diff --git a/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp b/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp new file mode 100644 index 0000000000..02c955c98b --- /dev/null +++ b/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/direct_submission/direct_submission_controller.h" +#include "shared/source/helpers/sleep.h" + +#include +namespace NEO { +bool DirectSubmissionController::sleep(std::unique_lock &lock) { + return NEO::waitOnConditionWithPredicate(condVar, lock, getSleepValue(), [&] { return !pagingFenceRequests.empty(); }); +} +} // namespace NEO \ No newline at end of file diff --git a/shared/source/direct_submission/windows/CMakeLists.txt b/shared/source/direct_submission/windows/CMakeLists.txt index ce975d8fbb..438eb3544d 100644 --- a/shared/source/direct_submission/windows/CMakeLists.txt +++ b/shared/source/direct_submission/windows/CMakeLists.txt @@ -6,6 +6,7 @@ set(NEO_CORE_DIRECT_SUBMISSION_WINDOWS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/direct_submission_controller_windows.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wddm_direct_submission.h ${CMAKE_CURRENT_SOURCE_DIR}/wddm_direct_submission.inl ) diff --git a/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp b/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp new file mode 100644 index 0000000000..0b38613818 --- /dev/null +++ b/shared/source/direct_submission/windows/direct_submission_controller_windows.cpp @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/direct_submission/direct_submission_controller.h" +#include "shared/source/helpers/sleep.h" +#include "shared/source/os_interface/windows/sys_calls_winmm.h" + +#include +namespace NEO { +bool DirectSubmissionController::sleep(std::unique_lock &lock) { + SysCalls::timeBeginPeriod(1u); + bool returnValue = NEO::waitOnConditionWithPredicate(condVar, lock, getSleepValue(), [&] { return !pagingFenceRequests.empty(); }); + SysCalls::timeEndPeriod(1u); + return returnValue; +} +} // namespace NEO \ No newline at end of file diff --git a/shared/source/os_interface/windows/CMakeLists.txt b/shared/source/os_interface/windows/CMakeLists.txt index 30486571ab..3fefd1b878 100644 --- a/shared/source/os_interface/windows/CMakeLists.txt +++ b/shared/source/os_interface/windows/CMakeLists.txt @@ -82,6 +82,7 @@ set(NEO_CORE_OS_INTERFACE_WDDM ${CMAKE_CURRENT_SOURCE_DIR}/os_environment_win.h ${CMAKE_CURRENT_SOURCE_DIR}/sharedata_wrapper.h ${CMAKE_CURRENT_SOURCE_DIR}/sys_calls.h + ${CMAKE_CURRENT_SOURCE_DIR}/sys_calls_winmm.h ${CMAKE_CURRENT_SOURCE_DIR}/thk_wrapper.h ${CMAKE_CURRENT_SOURCE_DIR}/wddm/adapter_info.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wddm/adapter_info.h diff --git a/shared/source/os_interface/windows/sys_calls_winmm.cpp b/shared/source/os_interface/windows/sys_calls_winmm.cpp new file mode 100644 index 0000000000..004d7f79ac --- /dev/null +++ b/shared/source/os_interface/windows/sys_calls_winmm.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/os_interface/windows/sys_calls_winmm.h" +namespace NEO { +namespace SysCalls { +MMRESULT timeBeginPeriod(UINT period) { + return ::timeBeginPeriod(period); +} + +MMRESULT timeEndPeriod(UINT period) { + return ::timeEndPeriod(period); +} +} // namespace SysCalls +} // namespace NEO \ No newline at end of file diff --git a/shared/source/os_interface/windows/sys_calls_winmm.h b/shared/source/os_interface/windows/sys_calls_winmm.h new file mode 100644 index 0000000000..9583a232cf --- /dev/null +++ b/shared/source/os_interface/windows/sys_calls_winmm.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once +#include "shared/source/os_interface/windows/windows_wrapper.h" +namespace NEO { + +namespace SysCalls { + +MMRESULT timeBeginPeriod(UINT period); +MMRESULT timeEndPeriod(UINT period); +} // namespace SysCalls +} // namespace NEO \ No newline at end of file diff --git a/shared/test/common/libult/CMakeLists.txt b/shared/test/common/libult/CMakeLists.txt index 04bf62c21f..0f207d17e0 100644 --- a/shared/test/common/libult/CMakeLists.txt +++ b/shared/test/common/libult/CMakeLists.txt @@ -219,6 +219,7 @@ set(neo_libult_SRCS_WINDOWS ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/options.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/setup_external_dependencies_drm_or_wddm.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls.cpp + ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/sys_calls_winmm.cpp ${NEO_SHARED_TEST_DIRECTORY}/common/os_interface/windows/wddm_calls.cpp ) diff --git a/shared/test/common/os_interface/windows/sys_calls_winmm.cpp b/shared/test/common/os_interface/windows/sys_calls_winmm.cpp new file mode 100644 index 0000000000..ab00a220d8 --- /dev/null +++ b/shared/test/common/os_interface/windows/sys_calls_winmm.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "sys_calls_winmm.h" + +namespace NEO { + +namespace SysCalls { + +size_t timeBeginPeriodCalled = 0u; +UINT timeBeginPeriodLastValue = 0u; +size_t timeEndPeriodCalled = 0u; +UINT timeEndPeriodLastValue = 0u; + +MMRESULT timeBeginPeriod(UINT period) { + timeBeginPeriodCalled++; + timeBeginPeriodLastValue = period; + return 0u; +} + +MMRESULT timeEndPeriod(UINT period) { + timeEndPeriodCalled++; + timeEndPeriodLastValue = period; + return 0u; +} + +} // namespace SysCalls +} // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h b/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h index 5409b1484f..29dcdfc0c4 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h +++ b/shared/test/unit_test/direct_submission/direct_submission_controller_mock.h @@ -32,10 +32,14 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController { using DirectSubmissionController::timeSinceLastCheck; bool sleep(std::unique_lock &lock) override { - auto ret = sleepReturnValue.load(); this->sleepCalled = true; - sleepReturnValue.store(false); - return ret; + if (callBaseSleepMethod) { + return DirectSubmissionController::sleep(lock); + } else { + auto ret = sleepReturnValue.load(); + sleepReturnValue.store(false); + return ret; + } } SteadyClock::time_point getCpuTimestamp() override { @@ -55,5 +59,6 @@ struct DirectSubmissionControllerMock : public DirectSubmissionController { std::atomic sleepReturnValue{false}; std::atomic timeoutElapsedReturnValue{TimeoutElapsedMode::notElapsed}; std::atomic timeoutElapsedCallBase{false}; + bool callBaseSleepMethod = false; }; } // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp index c81d62de7d..7c88cbf738 100644 --- a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp @@ -10,21 +10,29 @@ #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/helpers/flush_stamp.h" #include "shared/source/memory_manager/allocation_properties.h" +#include "shared/source/os_interface/windows/sys_calls.h" #include "shared/source/os_interface/windows/wddm/wddm_residency_logger.h" #include "shared/source/os_interface/windows/wddm_memory_manager.h" #include "shared/source/os_interface/windows/wddm_residency_controller.h" #include "shared/test/common/cmd_parse/hw_parse.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/unit_test_helper.h" +#include "shared/test/common/helpers/variable_backup.h" #include "shared/test/common/mocks/mock_io_functions.h" #include "shared/test/common/mocks/mock_os_context_win.h" #include "shared/test/common/os_interface/windows/wddm_fixture.h" #include "shared/test/common/test_macros/hw_test.h" +#include "shared/test/unit_test/direct_submission/direct_submission_controller_mock.h" #include "shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h" - -using namespace NEO; - extern uint64_t cpuFence; +namespace NEO { + +namespace SysCalls { +extern size_t timeBeginPeriodCalled; +extern MMRESULT timeBeginPeriodLastValue; +extern size_t timeEndPeriodCalled; +extern MMRESULT timeEndPeriodLastValue; +} // namespace SysCalls template struct WddmDirectSubmissionFixture : public WddmFixture { @@ -1130,4 +1138,22 @@ HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionWhenUnblockPagingFenceSe wddmDirectSubmission.unblockPagingFenceSemaphore(pagingFenceValueToWait); EXPECT_GT(wddmDirectSubmission.semaphoreData->pagingFenceCounter, mockedPagingFence); -} \ No newline at end of file +} + +TEST(DirectSubmissionControllerWindowsTest, givenDirectSubmissionControllerWhenCallingSleepThenRequestHighResolutionTimers) { + VariableBackup timeBeginPeriodCalledBackup(&SysCalls::timeBeginPeriodCalled, 0u); + VariableBackup timeBeginPeriodLastValueBackup(&SysCalls::timeBeginPeriodLastValue, 0u); + VariableBackup timeEndPeriodCalledBackup(&SysCalls::timeEndPeriodCalled, 0u); + VariableBackup timeEndPeriodLastValueBackup(&SysCalls::timeEndPeriodLastValue, 0u); + + DirectSubmissionControllerMock controller; + controller.callBaseSleepMethod = true; + std::unique_lock lock(controller.condVarMutex); + controller.sleep(lock); + EXPECT_TRUE(controller.sleepCalled); + EXPECT_EQ(1u, SysCalls::timeBeginPeriodCalled); + EXPECT_EQ(1u, SysCalls::timeEndPeriodCalled); + EXPECT_EQ(1u, SysCalls::timeBeginPeriodLastValue); + EXPECT_EQ(1u, SysCalls::timeEndPeriodLastValue); +} +} // namespace NEO