diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c8014ccc4..7de9dcbb3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -946,7 +946,7 @@ set(BUILTINS_SPIRV_LIB_NAME "builtins_spirv") set(BUILTINS_VME_LIB_NAME "builtins_vme") 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/opencl/test/unit_test/offline_compiler/CMakeLists.txt b/opencl/test/unit_test/offline_compiler/CMakeLists.txt index bca3ea896c..f83e537120 100644 --- a/opencl/test/unit_test/offline_compiler/CMakeLists.txt +++ b/opencl/test/unit_test/offline_compiler/CMakeLists.txt @@ -133,7 +133,7 @@ target_compile_definitions(ocloc_tests PUBLIC MOCKABLE_VIRTUAL=virtual $timeout)); -} - SteadyClock::time_point DirectSubmissionController::getCpuTimestamp() { return SteadyClock::now(); } diff --git a/shared/source/direct_submission/linux/CMakeLists.txt b/shared/source/direct_submission/linux/CMakeLists.txt index b522365559..9234c1ef13 100644 --- a/shared/source/direct_submission/linux/CMakeLists.txt +++ b/shared/source/direct_submission/linux/CMakeLists.txt @@ -1,11 +1,12 @@ # -# Copyright (C) 2020 Intel Corporation +# Copyright (C) 2020-2024 Intel Corporation # # SPDX-License-Identifier: MIT # 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..36963b3733 --- /dev/null +++ b/shared/source/direct_submission/linux/direct_submission_controller_linux.cpp @@ -0,0 +1,17 @@ +/* + * 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 +#include +namespace NEO { +void DirectSubmissionController::sleep() { + NEO::sleep(std::chrono::microseconds(this->timeout)); +} +} // 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 6889cc48a4..438eb3544d 100644 --- a/shared/source/direct_submission/windows/CMakeLists.txt +++ b/shared/source/direct_submission/windows/CMakeLists.txt @@ -1,11 +1,12 @@ # -# Copyright (C) 2020 Intel Corporation +# Copyright (C) 2020-2024 Intel Corporation # # SPDX-License-Identifier: MIT # 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..4c284e7149 --- /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.h" + +#include +#include +namespace NEO { +void DirectSubmissionController::sleep() { + SysCalls::timeBeginPeriod(1u); + NEO::sleep(std::chrono::microseconds(this->timeout)); + SysCalls::timeEndPeriod(1u); +} +} // namespace NEO \ No newline at end of file diff --git a/shared/source/os_interface/windows/sys_calls.cpp b/shared/source/os_interface/windows/sys_calls.cpp index e8ca12efc3..be898e5bd5 100644 --- a/shared/source/os_interface/windows/sys_calls.cpp +++ b/shared/source/os_interface/windows/sys_calls.cpp @@ -151,6 +151,14 @@ void setThreadPriority(ThreadPriority priority) { } } +MMRESULT timeBeginPeriod(UINT period) { + return ::timeBeginPeriod(period); +} + +MMRESULT timeEndPeriod(UINT period) { + return ::timeEndPeriod(period); +} + LSTATUS regOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult) { return RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, phkResult); } diff --git a/shared/source/os_interface/windows/sys_calls.h b/shared/source/os_interface/windows/sys_calls.h index 74e9a3c90f..5382ad91bb 100644 --- a/shared/source/os_interface/windows/sys_calls.h +++ b/shared/source/os_interface/windows/sys_calls.h @@ -49,6 +49,8 @@ DWORD setFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveH void setProcessPowerThrottlingState(ProcessPowerThrottlingState state); void setThreadPriority(ThreadPriority priority); void coTaskMemFree(LPVOID pv); +MMRESULT timeBeginPeriod(UINT period); +MMRESULT timeEndPeriod(UINT period); LSTATUS regOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult); LSTATUS regQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData); diff --git a/shared/test/common/os_interface/windows/sys_calls.cpp b/shared/test/common/os_interface/windows/sys_calls.cpp index 803414c7d5..8b97fffcf1 100644 --- a/shared/test/common/os_interface/windows/sys_calls.cpp +++ b/shared/test/common/os_interface/windows/sys_calls.cpp @@ -99,6 +99,11 @@ ProcessPowerThrottlingState setProcessPowerThrottlingStateLastValue{}; size_t setThreadPriorityCalled = 0u; ThreadPriority setThreadPriorityLastValue{}; +size_t timeBeginPeriodCalled = 0u; +UINT timeBeginPeriodLastValue = 0u; +size_t timeEndPeriodCalled = 0u; +UINT timeEndPeriodLastValue = 0u; + HANDLE(*sysCallsCreateFile) (LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = nullptr; @@ -307,6 +312,18 @@ void setThreadPriority(ThreadPriority priority) { setThreadPriorityLastValue = priority; } +MMRESULT timeBeginPeriod(UINT period) { + timeBeginPeriodCalled++; + timeBeginPeriodLastValue = period; + return 0u; +} + +MMRESULT timeEndPeriod(UINT period) { + timeEndPeriodCalled++; + timeEndPeriodLastValue = period; + return 0u; +} + HANDLE createFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { if (sysCallsCreateFile != nullptr) { return sysCallsCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); diff --git a/shared/test/unit_test/CMakeLists.txt b/shared/test/unit_test/CMakeLists.txt index db2d898be3..62456434c3 100644 --- a/shared/test/unit_test/CMakeLists.txt +++ b/shared/test/unit_test/CMakeLists.txt @@ -49,7 +49,7 @@ if(UNIX AND NOT DISABLE_WDDM_LINUX) endif() if(WIN32) - target_link_libraries(neo_shared_tests dbghelp) + target_link_libraries(neo_shared_tests dbghelp winmm) endif() target_link_libraries(neo_shared_tests 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 c0b8b378fd..4061e5375b 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 { @@ -1117,3 +1125,19 @@ HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionWhenSwitchingRingBuffers wddmDirectSubmission.handleSwitchRingBuffers(nullptr); EXPECT_EQ(wddmDirectSubmission.ringBufferForCompletionFence, wddmDirectSubmission.previousRingBuffer); } + +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.sleep(); + 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 \ No newline at end of file