diff --git a/runtime/os_interface/windows/wddm/wddm.cpp b/runtime/os_interface/windows/wddm/wddm.cpp index d6c4f309f1..ca7d0136e1 100644 --- a/runtime/os_interface/windows/wddm/wddm.cpp +++ b/runtime/os_interface/windows/wddm/wddm.cpp @@ -752,17 +752,17 @@ bool Wddm::destroyContext(D3DKMT_HANDLE context) { return status == STATUS_SUCCESS; } -bool Wddm::submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) { +bool Wddm::submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) { bool status = false; - if (currentPagingFenceValue > *pagingFenceAddress && !waitOnGPU(osContext.getWddmContextHandle())) { + if (currentPagingFenceValue > *pagingFenceAddress && !waitOnGPU(submitArguments.contextHandle)) { return false; } - DBG_LOG(ResidencyDebugEnable, "Residency:", __FUNCTION__, "currentFenceValue =", osContext.getResidencyController().getMonitoredFence().currentFenceValue); + DBG_LOG(ResidencyDebugEnable, "Residency:", __FUNCTION__, "currentFenceValue =", submitArguments.monitorFence->currentFenceValue); - status = wddmInterface->submit(commandBuffer, size, commandHeader, osContext); + status = wddmInterface->submit(commandBuffer, size, commandHeader, submitArguments); if (status) { - osContext.getResidencyController().getMonitoredFence().lastSubmittedFence = osContext.getResidencyController().getMonitoredFence().currentFenceValue; - osContext.getResidencyController().getMonitoredFence().currentFenceValue++; + submitArguments.monitorFence->lastSubmittedFence = submitArguments.monitorFence->currentFenceValue; + submitArguments.monitorFence->currentFenceValue++; } getDeviceState(); diff --git a/runtime/os_interface/windows/wddm/wddm.h b/runtime/os_interface/windows/wddm/wddm.h index bdf5c4ae31..919ddf9b2b 100644 --- a/runtime/os_interface/windows/wddm/wddm.h +++ b/runtime/os_interface/windows/wddm/wddm.h @@ -38,6 +38,12 @@ struct OsHandleStorage; enum class HeapIndex : uint32_t; +struct WddmSubmitArguments { + MonitoredFence *monitorFence; + D3DKMT_HANDLE contextHandle; + D3DKMT_HANDLE hwQueueHandle; +}; + class Wddm { public: typedef HRESULT(WINAPI *CreateDXGIFactoryFcn)(REFIID riid, void **ppFactory); @@ -72,7 +78,7 @@ class Wddm { MOCKABLE_VIRTUAL bool destroyContext(D3DKMT_HANDLE context); MOCKABLE_VIRTUAL bool queryAdapterInfo(); - MOCKABLE_VIRTUAL bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext); + MOCKABLE_VIRTUAL bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments); MOCKABLE_VIRTUAL bool waitFromCpu(uint64_t lastFenceValue, const MonitoredFence &monitoredFence); NTSTATUS escape(D3DKMT_ESCAPE &escapeCommand); diff --git a/runtime/os_interface/windows/wddm/wddm_interface.cpp b/runtime/os_interface/windows/wddm/wddm_interface.cpp index d9c0042b2d..95338d4499 100644 --- a/runtime/os_interface/windows/wddm/wddm_interface.cpp +++ b/runtime/os_interface/windows/wddm/wddm_interface.cpp @@ -49,21 +49,20 @@ const bool WddmInterface20::hwQueuesSupported() { return false; } -bool WddmInterface20::submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) { +bool WddmInterface20::submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) { D3DKMT_SUBMITCOMMAND SubmitCommand = {0}; NTSTATUS status = STATUS_SUCCESS; - auto monitoredFence = osContext.getResidencyController().getMonitoredFence(); SubmitCommand.Commands = commandBuffer; SubmitCommand.CommandLength = static_cast(size); SubmitCommand.BroadcastContextCount = 1; - SubmitCommand.BroadcastContext[0] = osContext.getWddmContextHandle(); + SubmitCommand.BroadcastContext[0] = submitArguments.contextHandle; SubmitCommand.Flags.NullRendering = (UINT)DebugManager.flags.EnableNullHardware.get(); COMMAND_BUFFER_HEADER *pHeader = reinterpret_cast(commandHeader); - pHeader->MonitorFenceVA = monitoredFence.gpuAddress; - pHeader->MonitorFenceValue = monitoredFence.currentFenceValue; + pHeader->MonitorFenceVA = submitArguments.monitorFence->gpuAddress; + pHeader->MonitorFenceValue = submitArguments.monitorFence->currentFenceValue; // Note: Private data should be the CPU VA Address SubmitCommand.pPrivateDriverData = commandHeader; @@ -120,12 +119,10 @@ const bool WddmInterface23::hwQueuesSupported() { return true; } -bool WddmInterface23::submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) { - auto monitoredFence = osContext.getResidencyController().getMonitoredFence(); - +bool WddmInterface23::submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) { D3DKMT_SUBMITCOMMANDTOHWQUEUE submitCommand = {}; - submitCommand.hHwQueue = osContext.getHwQueue().handle; - submitCommand.HwQueueProgressFenceId = monitoredFence.currentFenceValue; + submitCommand.hHwQueue = submitArguments.hwQueueHandle; + submitCommand.HwQueueProgressFenceId = submitArguments.monitorFence->currentFenceValue; submitCommand.CommandBuffer = commandBuffer; submitCommand.CommandLength = static_cast(size); diff --git a/runtime/os_interface/windows/wddm/wddm_interface.h b/runtime/os_interface/windows/wddm/wddm_interface.h index 36a4414654..b2887c4aee 100644 --- a/runtime/os_interface/windows/wddm/wddm_interface.h +++ b/runtime/os_interface/windows/wddm/wddm_interface.h @@ -19,6 +19,7 @@ class Gdi; class Wddm; class OsContextWin; class WddmResidencyController; +struct WddmSubmitArguments; class WddmInterface { public: @@ -30,7 +31,7 @@ class WddmInterface { virtual bool createMonitoredFence(OsContextWin &osContext) = 0; virtual void destroyMonitorFence(D3DKMT_HANDLE fenceHandle) = 0; virtual const bool hwQueuesSupported() = 0; - virtual bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) = 0; + virtual bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) = 0; Wddm &wddm; }; @@ -42,7 +43,7 @@ class WddmInterface20 : public WddmInterface { bool createMonitoredFence(OsContextWin &osContext) override; void destroyMonitorFence(D3DKMT_HANDLE fenceHandle) override; const bool hwQueuesSupported() override; - bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) override; + bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) override; }; class WddmInterface23 : public WddmInterface { @@ -53,6 +54,6 @@ class WddmInterface23 : public WddmInterface { bool createMonitoredFence(OsContextWin &osContext) override; void destroyMonitorFence(D3DKMT_HANDLE fenceHandle) override; const bool hwQueuesSupported() override; - bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) override; + bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) override; }; } // namespace NEO diff --git a/runtime/os_interface/windows/wddm_device_command_stream.inl b/runtime/os_interface/windows/wddm_device_command_stream.inl index ea71c0fe27..c7d1a3e08a 100644 --- a/runtime/os_interface/windows/wddm_device_command_stream.inl +++ b/runtime/os_interface/windows/wddm_device_command_stream.inl @@ -97,9 +97,13 @@ bool WddmCommandStreamReceiver::flush(BatchBuffer &batchBuffer, Resid } auto osContextWin = static_cast(osContext); - auto status = wddm->submit(commandStreamAddress, batchBuffer.usedSize - batchBuffer.startOffset, commandBufferHeader, *osContextWin); + WddmSubmitArguments submitArgs = {}; + submitArgs.contextHandle = osContextWin->getWddmContextHandle(); + submitArgs.hwQueueHandle = osContextWin->getHwQueue().handle; + submitArgs.monitorFence = &osContextWin->getResidencyController().getMonitoredFence(); + auto status = wddm->submit(commandStreamAddress, batchBuffer.usedSize - batchBuffer.startOffset, commandBufferHeader, submitArgs); - flushStamp->setStamp(osContextWin->getResidencyController().getMonitoredFence().lastSubmittedFence); + flushStamp->setStamp(submitArgs.monitorFence->lastSubmittedFence); return status; } diff --git a/unit_tests/mocks/mock_wddm.cpp b/unit_tests/mocks/mock_wddm.cpp index fe16307c05..042c44277c 100644 --- a/unit_tests/mocks/mock_wddm.cpp +++ b/unit_tests/mocks/mock_wddm.cpp @@ -151,11 +151,11 @@ bool WddmMock::queryAdapterInfo() { return queryAdapterInfoResult.success = Wddm::queryAdapterInfo(); } -bool WddmMock::submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) { +bool WddmMock::submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) { submitResult.called++; submitResult.commandBufferSubmitted = commandBuffer; submitResult.commandHeaderSubmitted = commandHeader; - return submitResult.success = Wddm::submit(commandBuffer, size, commandHeader, osContext); + return submitResult.success = Wddm::submit(commandBuffer, size, commandHeader, submitArguments); } bool WddmMock::waitOnGPU(D3DKMT_HANDLE context) { diff --git a/unit_tests/mocks/mock_wddm.h b/unit_tests/mocks/mock_wddm.h index 005bf412d8..420f623d38 100644 --- a/unit_tests/mocks/mock_wddm.h +++ b/unit_tests/mocks/mock_wddm.h @@ -61,7 +61,7 @@ class WddmMock : public Wddm { void applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData, OsContextWin &osContext) override; bool destroyContext(D3DKMT_HANDLE context) override; bool queryAdapterInfo() override; - bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) override; + bool submit(uint64_t commandBuffer, size_t size, void *commandHeader, WddmSubmitArguments &submitArguments) override; bool waitOnGPU(D3DKMT_HANDLE context) override; void *lockResource(const D3DKMT_HANDLE &handle, bool applyMakeResidentPriorToLock) override; void unlockResource(const D3DKMT_HANDLE &handle) override; diff --git a/unit_tests/os_interface/windows/wddm23_tests.cpp b/unit_tests/os_interface/windows/wddm23_tests.cpp index 0db2450b93..675e599ea6 100644 --- a/unit_tests/os_interface/windows/wddm23_tests.cpp +++ b/unit_tests/os_interface/windows/wddm23_tests.cpp @@ -112,7 +112,11 @@ TEST_F(Wddm23Tests, givenCmdBufferWhenSubmitCalledThenSetAllRequiredFiledsAndUpd EXPECT_EQ(1u, osContext->getResidencyController().getMonitoredFence().currentFenceValue); EXPECT_EQ(0u, osContext->getResidencyController().getMonitoredFence().lastSubmittedFence); - wddm->submit(cmdBufferAddress, cmdSize, &cmdBufferHeader, *osContext); + WddmSubmitArguments submitArgs = {}; + submitArgs.contextHandle = osContext->getWddmContextHandle(); + submitArgs.hwQueueHandle = hwQueue.handle; + submitArgs.monitorFence = &osContext->getResidencyController().getMonitoredFence(); + wddm->submit(cmdBufferAddress, cmdSize, &cmdBufferHeader, submitArgs); EXPECT_EQ(cmdBufferAddress, getSubmitCommandToHwQueueDataFcn()->CommandBuffer); EXPECT_EQ(static_cast(cmdSize), getSubmitCommandToHwQueueDataFcn()->CommandLength); @@ -143,13 +147,19 @@ TEST_F(Wddm23Tests, givenCurrentPendingFenceValueGreaterThanPendingFenceValueWhe size_t cmdSize = 456; COMMAND_BUFFER_HEADER cmdBufferHeader = {}; + WddmSubmitArguments submitArgs = {}; + submitArgs.contextHandle = osContext->getWddmContextHandle(); + submitArgs.hwQueueHandle = osContext->getHwQueue().handle; + submitArgs.monitorFence = &osContext->getResidencyController().getMonitoredFence(); + *wddm->pagingFenceAddress = 1; wddm->currentPagingFenceValue = 1; - wddm->submit(cmdBufferAddress, cmdSize, &cmdBufferHeader, *osContext); + + wddm->submit(cmdBufferAddress, cmdSize, &cmdBufferHeader, submitArgs); EXPECT_EQ(0u, wddm->waitOnGPUResult.called); wddm->currentPagingFenceValue = 2; - wddm->submit(cmdBufferAddress, cmdSize, &cmdBufferHeader, *osContext); + wddm->submit(cmdBufferAddress, cmdSize, &cmdBufferHeader, submitArgs); EXPECT_EQ(1u, wddm->waitOnGPUResult.called); }