diff --git a/runtime/os_interface/windows/gl/gl_arb_sync_event_os.cpp b/runtime/os_interface/windows/gl/gl_arb_sync_event_os.cpp index cfc92d1593..0aa8b87a34 100644 --- a/runtime/os_interface/windows/gl/gl_arb_sync_event_os.cpp +++ b/runtime/os_interface/windows/gl/gl_arb_sync_event_os.cpp @@ -115,7 +115,7 @@ void signalArbSyncObject(OsContext &osContext, CL_GL_SYNC_INFO &glSyncInfo) { auto wddm = osContextWin->getWddm(); D3DKMT_SIGNALSYNCHRONIZATIONOBJECT signalServerClientSyncInfo = {0}; - signalServerClientSyncInfo.hContext = osContextWin->getContext(); + signalServerClientSyncInfo.hContext = osContextWin->getWddmContextHandle(); signalServerClientSyncInfo.Flags.SignalAtSubmission = 0; // Wait for GPU to complete processing command buffer signalServerClientSyncInfo.ObjectHandleArray[0] = glSyncInfo.serverSynchronizationObject; signalServerClientSyncInfo.ObjectHandleArray[1] = glSyncInfo.clientSynchronizationObject; @@ -127,7 +127,7 @@ void signalArbSyncObject(OsContext &osContext, CL_GL_SYNC_INFO &glSyncInfo) { } D3DKMT_SIGNALSYNCHRONIZATIONOBJECT signalSubmissionSyncInfo = {0}; - signalSubmissionSyncInfo.hContext = osContextWin->getContext(); + signalSubmissionSyncInfo.hContext = osContextWin->getWddmContextHandle(); signalSubmissionSyncInfo.Flags.SignalAtSubmission = 1; // Don't wait for GPU to complete processing command buffer signalSubmissionSyncInfo.ObjectHandleArray[0] = glSyncInfo.submissionSynchronizationObject; signalSubmissionSyncInfo.ObjectCount = 1; diff --git a/runtime/os_interface/windows/os_context_win.cpp b/runtime/os_interface/windows/os_context_win.cpp index 932d6ef0d8..ec9c56c799 100644 --- a/runtime/os_interface/windows/os_context_win.cpp +++ b/runtime/os_interface/windows/os_context_win.cpp @@ -28,7 +28,7 @@ OsContextWin::OsContextWin(Wddm &wddm, uint32_t contextId, uint32_t numDevicesSu UNRECOVERABLE_IF(!wddm.isInitialized()); auto wddmInterface = wddm.getWddmInterface(); - if (!wddm.createContext(context, engineType, preemptionMode)) { + if (!wddm.createContext(*this)) { return; } if (wddmInterface->hwQueuesSupported()) { @@ -42,7 +42,7 @@ OsContextWin::OsContextWin(Wddm &wddm, uint32_t contextId, uint32_t numDevicesSu OsContextWin::~OsContextWin() { wddm.getWddmInterface()->destroyHwQueue(hwQueueHandle); - wddm.destroyContext(context); + wddm.destroyContext(wddmContextHandle); } } // namespace OCLRT diff --git a/runtime/os_interface/windows/os_context_win.h b/runtime/os_interface/windows/os_context_win.h index 6c631cc650..507216c91d 100644 --- a/runtime/os_interface/windows/os_context_win.h +++ b/runtime/os_interface/windows/os_context_win.h @@ -20,24 +20,17 @@ class OsContextWin : public OsContext { OsContextWin(Wddm &wddm, uint32_t contextId, uint32_t numDevicesSupported, EngineInstanceT engineType, PreemptionMode preemptionMode); - D3DKMT_HANDLE getContext() const { - return context; - } - D3DKMT_HANDLE getHwQueue() const { - return hwQueueHandle; - } - void setHwQueue(D3DKMT_HANDLE hwQueue) { - hwQueueHandle = hwQueue; - } - bool isInitialized() const { - return initialized; - } + D3DKMT_HANDLE getWddmContextHandle() const { return wddmContextHandle; } + void setWddmContextHandle(D3DKMT_HANDLE wddmContextHandle) { this->wddmContextHandle = wddmContextHandle; } + D3DKMT_HANDLE getHwQueue() const { return hwQueueHandle; } + void setHwQueue(D3DKMT_HANDLE hwQueue) { hwQueueHandle = hwQueue; } + bool isInitialized() const { return initialized; } Wddm *getWddm() const { return &wddm; } WddmResidencyController &getResidencyController() { return residencyController; } protected: bool initialized = false; - D3DKMT_HANDLE context = 0; + D3DKMT_HANDLE wddmContextHandle = 0; D3DKMT_HANDLE hwQueueHandle = 0; Wddm &wddm; WddmResidencyController residencyController; diff --git a/runtime/os_interface/windows/wddm/wddm.cpp b/runtime/os_interface/windows/wddm/wddm.cpp index 5961c5d2b4..c2e7853794 100644 --- a/runtime/os_interface/windows/wddm/wddm.cpp +++ b/runtime/os_interface/windows/wddm/wddm.cpp @@ -677,7 +677,7 @@ void Wddm::kmDafLock(WddmAllocation *wddmAllocation) { kmDafListener->notifyLock(featureTable->ftrKmdDaf, adapter, device, wddmAllocation->handle, 0, gdi->escape); } -bool Wddm::createContext(D3DKMT_HANDLE &context, EngineInstanceT engineType, PreemptionMode preemptionMode) { +bool Wddm::createContext(OsContextWin &osContext) { NTSTATUS status = STATUS_UNSUCCESSFUL; D3DKMT_CREATECONTEXTVIRTUAL CreateContext = {0}; CREATECONTEXT_PVTDATA PrivateData = {{0}}; @@ -689,24 +689,24 @@ bool Wddm::createContext(D3DKMT_HANDLE &context, EngineInstanceT engineType, Pre PrivateData.pHwContextId = &hwContextId; PrivateData.IsMediaUsage = false; PrivateData.NoRingFlushes = DebugManager.flags.UseNoRingFlushesKmdMode.get(); - applyAdditionalContextFlags(PrivateData); + applyAdditionalContextFlags(PrivateData, osContext); CreateContext.EngineAffinity = 0; CreateContext.Flags.NullRendering = static_cast(DebugManager.flags.EnableNullHardware.get()); CreateContext.Flags.HwQueueSupported = wddmInterface->hwQueuesSupported(); - if (preemptionMode >= PreemptionMode::MidBatch) { + if (osContext.getPreemptionMode() >= PreemptionMode::MidBatch) { CreateContext.Flags.DisableGpuTimeout = readEnablePreemptionRegKey(); } CreateContext.PrivateDriverDataSize = sizeof(PrivateData); - CreateContext.NodeOrdinal = WddmEngineMapper::engineNodeMap(engineType.type); + CreateContext.NodeOrdinal = WddmEngineMapper::engineNodeMap(osContext.getEngineType().type); CreateContext.pPrivateDriverData = &PrivateData; CreateContext.ClientHint = D3DKMT_CLIENTHINT_OPENGL; CreateContext.hDevice = device; status = gdi->createContext(&CreateContext); - context = CreateContext.hContext; + osContext.setWddmContextHandle(CreateContext.hContext); return status == STATUS_SUCCESS; } @@ -724,7 +724,7 @@ bool Wddm::destroyContext(D3DKMT_HANDLE context) { bool Wddm::submit(uint64_t commandBuffer, size_t size, void *commandHeader, OsContextWin &osContext) { bool status = false; - if (currentPagingFenceValue > *pagingFenceAddress && !waitOnGPU(osContext.getContext())) { + if (currentPagingFenceValue > *pagingFenceAddress && !waitOnGPU(osContext.getWddmContextHandle())) { return false; } DBG_LOG(ResidencyDebugEnable, "Residency:", __FUNCTION__, "currentFenceValue =", osContext.getResidencyController().getMonitoredFence().currentFenceValue); diff --git a/runtime/os_interface/windows/wddm/wddm.h b/runtime/os_interface/windows/wddm/wddm.h index 0d4a6fb24f..2ed8587bf9 100644 --- a/runtime/os_interface/windows/wddm/wddm.h +++ b/runtime/os_interface/windows/wddm/wddm.h @@ -60,8 +60,8 @@ class Wddm { bool mapGpuVirtualAddress(WddmAllocation *allocation, void *cpuPtr); bool mapGpuVirtualAddress(AllocationStorageData *allocationStorageData); D3DGPU_VIRTUAL_ADDRESS reserveGpuVirtualAddress(D3DGPU_VIRTUAL_ADDRESS minimumAddress, D3DGPU_VIRTUAL_ADDRESS maximumAddress, D3DGPU_SIZE_T size); - MOCKABLE_VIRTUAL bool createContext(D3DKMT_HANDLE &context, EngineInstanceT engineType, PreemptionMode preemptionMode); - MOCKABLE_VIRTUAL void applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData); + MOCKABLE_VIRTUAL bool createContext(OsContextWin &osContext); + MOCKABLE_VIRTUAL void applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData, OsContextWin &osContext); MOCKABLE_VIRTUAL bool freeGpuVirtualAddress(D3DGPU_VIRTUAL_ADDRESS &gpuPtr, uint64_t size); MOCKABLE_VIRTUAL NTSTATUS createAllocation(WddmAllocation *alloc); MOCKABLE_VIRTUAL bool createAllocation64k(WddmAllocation *alloc); diff --git a/runtime/os_interface/windows/wddm/wddm_interface.cpp b/runtime/os_interface/windows/wddm/wddm_interface.cpp index e338dfbced..64eaa97125 100644 --- a/runtime/os_interface/windows/wddm/wddm_interface.cpp +++ b/runtime/os_interface/windows/wddm/wddm_interface.cpp @@ -49,7 +49,7 @@ bool WddmInterface20::submit(uint64_t commandBuffer, size_t size, void *commandH SubmitCommand.Commands = commandBuffer; SubmitCommand.CommandLength = static_cast(size); SubmitCommand.BroadcastContextCount = 1; - SubmitCommand.BroadcastContext[0] = osContext.getContext(); + SubmitCommand.BroadcastContext[0] = osContext.getWddmContextHandle(); SubmitCommand.Flags.NullRendering = (UINT)DebugManager.flags.EnableNullHardware.get(); COMMAND_BUFFER_HEADER *pHeader = reinterpret_cast(commandHeader); @@ -73,7 +73,7 @@ bool WddmInterface23::createHwQueue(OsContextWin &osContext) { return false; } - createHwQueue.hHwContext = osContext.getContext(); + createHwQueue.hHwContext = osContext.getWddmContextHandle(); if (osContext.getPreemptionMode() >= PreemptionMode::MidBatch) { createHwQueue.Flags.DisableGpuTimeout = wddm.readEnablePreemptionRegKey(); } diff --git a/runtime/os_interface/windows/wddm_additional_context_flags.cpp b/runtime/os_interface/windows/wddm_additional_context_flags.cpp index 5906adfd0b..22e063eb68 100644 --- a/runtime/os_interface/windows/wddm_additional_context_flags.cpp +++ b/runtime/os_interface/windows/wddm_additional_context_flags.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Intel Corporation + * Copyright (C) 2018-2019 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -8,6 +8,6 @@ #include "runtime/os_interface/windows/wddm/wddm.h" namespace OCLRT { -void Wddm::applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData) { +void Wddm::applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData, OsContextWin &osContext) { } } // namespace OCLRT diff --git a/unit_tests/mocks/mock_wddm.cpp b/unit_tests/mocks/mock_wddm.cpp index f0a88f1f60..0000f235c2 100644 --- a/unit_tests/mocks/mock_wddm.cpp +++ b/unit_tests/mocks/mock_wddm.cpp @@ -103,14 +103,14 @@ bool WddmMock::openSharedHandle(D3DKMT_HANDLE handle, WddmAllocation *alloc) { } } -bool WddmMock::createContext(D3DKMT_HANDLE &context, EngineInstanceT engineType, PreemptionMode preemptionMode) { +bool WddmMock::createContext(OsContextWin &osContext) { createContextResult.called++; - return createContextResult.success = Wddm::createContext(context, engineType, preemptionMode); + return createContextResult.success = Wddm::createContext(osContext); } -void WddmMock::applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData) { +void WddmMock::applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData, OsContextWin &osContext) { applyAdditionalContextFlagsResult.called++; - Wddm::applyAdditionalContextFlags(privateData); + Wddm::applyAdditionalContextFlags(privateData, osContext); } bool WddmMock::destroyContext(D3DKMT_HANDLE context) { diff --git a/unit_tests/mocks/mock_wddm.h b/unit_tests/mocks/mock_wddm.h index df8652a3b4..19255ac864 100644 --- a/unit_tests/mocks/mock_wddm.h +++ b/unit_tests/mocks/mock_wddm.h @@ -67,8 +67,8 @@ class WddmMock : public Wddm { bool destroyAllocations(D3DKMT_HANDLE *handles, uint32_t allocationCount, D3DKMT_HANDLE resourceHandle) override; bool destroyAllocation(WddmAllocation *alloc, OsContextWin *osContext); bool openSharedHandle(D3DKMT_HANDLE handle, WddmAllocation *alloc) override; - bool createContext(D3DKMT_HANDLE &context, EngineInstanceT engineType, PreemptionMode preemptionMode) override; - void applyAdditionalContextFlags(CREATECONTEXT_PVTDATA &privateData) override; + bool createContext(OsContextWin &osContext) override; + 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; diff --git a/unit_tests/os_interface/windows/gl/gl_os_sharing_tests.cpp b/unit_tests/os_interface/windows/gl/gl_os_sharing_tests.cpp index 75911b997d..79676611d5 100644 --- a/unit_tests/os_interface/windows/gl/gl_os_sharing_tests.cpp +++ b/unit_tests/os_interface/windows/gl/gl_os_sharing_tests.cpp @@ -333,7 +333,7 @@ TEST_F(GlArbSyncEventOsTest, GivenCallToSignalArbSyncObjectWhenSignalSynchroniza syncInfo.clientSynchronizationObject = 0x6cU; gdi->signalSynchronizationObject.mFunc = FailSignalSyncObjectMock::signal; - FailSignalSyncObjectMock::getExpectedContextHandle() = osContext.getContext(); + FailSignalSyncObjectMock::getExpectedContextHandle() = osContext.getWddmContextHandle(); FailSignalSyncObjectMock::getExpectedSynchHandle0() = syncInfo.serverSynchronizationObject; FailSignalSyncObjectMock::getExpectedSynchHandle1() = syncInfo.clientSynchronizationObject; @@ -391,7 +391,7 @@ TEST_F(GlArbSyncEventOsTest, GivenCallToSignalArbSyncObjectWhenSignalSynchroniza syncInfo.submissionSynchronizationObject = 0x7cU; gdi->signalSynchronizationObject.mFunc = FailSignalSyncObjectMock::signal; - FailSignalSyncObjectMock::getExpectedContextHandle() = osContext.getContext(); + FailSignalSyncObjectMock::getExpectedContextHandle() = osContext.getWddmContextHandle(); FailSignalSyncObjectMock::getExpectedSynchHandle0() = syncInfo.submissionSynchronizationObject; signalArbSyncObject(osContext, syncInfo); diff --git a/unit_tests/os_interface/windows/wddm20_tests.cpp b/unit_tests/os_interface/windows/wddm20_tests.cpp index 85f53cb6e1..a00f49f7a4 100644 --- a/unit_tests/os_interface/windows/wddm20_tests.cpp +++ b/unit_tests/os_interface/windows/wddm20_tests.cpp @@ -164,7 +164,7 @@ TEST(Wddm20EnumAdaptersTest, givenUnknownPlatformWhenEnumAdapterIsCalledThenFals } TEST_F(Wddm20Tests, whenInitializeWddmThenContextIsCreated) { - auto context = osContext->getContext(); + auto context = osContext->getWddmContextHandle(); EXPECT_TRUE(context != static_cast(0)); }