mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-10 12:53:42 +08:00
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:

committed by
sys_ocldev

parent
211ba8adcb
commit
9e5b66404d
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user