Change WDDM interface to submit command buffer

Related-To: NEO-3639

Change-Id: Iaad6199372cd374b61a0e288ce52b5cd0d3eef4f
Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2019-12-16 15:42:13 +01:00
committed by sys_ocldev
parent 211ba8adcb
commit 9e5b66404d
8 changed files with 46 additions and 28 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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<UINT>(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<COMMAND_BUFFER_HEADER *>(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<UINT>(size);

View File

@ -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

View File

@ -97,9 +97,13 @@ bool WddmCommandStreamReceiver<GfxFamily>::flush(BatchBuffer &batchBuffer, Resid
}
auto osContextWin = static_cast<OsContextWin *>(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;
}

View File

@ -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) {

View File

@ -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;

View File

@ -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<UINT>(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);
}