AUB subcapture in TBX mode to write the head register upon activation

Related-To: NEO-3051

Change-Id: I5a78de3e43576e2398449ed12935af4000da3deb
Signed-off-by: Slawomir Milczarek <slawomir.milczarek@intel.com>
This commit is contained in:
Slawomir Milczarek 2019-10-17 11:32:55 +02:00 committed by sys_ocldev
parent d2576c95aa
commit b3ada0146b
13 changed files with 122 additions and 18 deletions

View File

@ -392,7 +392,7 @@ void AUBCommandStreamReceiverHw<GfxFamily>::submitBatchBuffer(uint64_t batchBuff
if (hardwareContextController) {
if (batchBufferSize) {
hardwareContextController->submit(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, MemoryConstants::pageSize64k);
hardwareContextController->submit(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, MemoryConstants::pageSize64k, false);
}
return;
}

View File

@ -60,6 +60,12 @@ AubSubCaptureStatus AubSubCaptureManager::checkAndActivateSubCapture(const Multi
return {subCaptureIsActive, subCaptureWasActiveInPreviousEnqueue};
}
AubSubCaptureStatus AubSubCaptureManager::getSubCaptureStatus() const {
auto guard = this->lock();
return {this->subCaptureIsActive, this->subCaptureWasActiveInPreviousEnqueue};
}
const std::string &AubSubCaptureManager::getSubCaptureFileName(const MultiDispatchInfo &dispatchInfo) {
auto guard = this->lock();

View File

@ -60,6 +60,8 @@ class AubSubCaptureManager {
AubSubCaptureStatus checkAndActivateSubCapture(const MultiDispatchInfo &dispatchInfo);
AubSubCaptureStatus getSubCaptureStatus() const;
const std::string &getSubCaptureFileName(const MultiDispatchInfo &dispatchInfo);
AubSubCaptureManager(const std::string &fileName, AubSubCaptureCommon &subCaptureCommon);

View File

@ -61,7 +61,7 @@ class TbxCommandStreamReceiverHw : public CommandStreamReceiverSimulatedHw<GfxFa
AubSubCaptureStatus checkAndActivateAubSubCapture(const MultiDispatchInfo &dispatchInfo) override;
// Family specific version
MOCKABLE_VIRTUAL void submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits);
MOCKABLE_VIRTUAL void submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits, bool overrideRingHead);
void pollForCompletion() override;
static CommandStreamReceiver *create(const std::string &baseName, bool withAubDump, ExecutionEnvironment &executionEnvironment);

View File

@ -206,6 +206,7 @@ FlushStamp TbxCommandStreamReceiverHw<GfxFamily>::flush(BatchBuffer &batchBuffer
auto currentOffset = batchBuffer.usedSize;
DEBUG_BREAK_IF(currentOffset < batchBuffer.startOffset);
auto sizeBatchBuffer = currentOffset - batchBuffer.startOffset;
auto overrideRingHead = false;
auto submissionTaskCount = this->taskCount + 1;
allocationsForResidency.push_back(batchBuffer.commandBufferAllocation);
@ -215,13 +216,23 @@ FlushStamp TbxCommandStreamReceiverHw<GfxFamily>::flush(BatchBuffer &batchBuffer
// Write allocations for residency
processResidency(allocationsForResidency);
if (subCaptureManager && !subCaptureManager->isSubCaptureEnabled()) {
if (subCaptureManager) {
if (aubManager) {
aubManager->pause(true);
auto status = subCaptureManager->getSubCaptureStatus();
if (!status.wasActiveInPreviousEnqueue && status.isActive) {
overrideRingHead = true;
}
if (!status.wasActiveInPreviousEnqueue && !status.isActive) {
aubManager->pause(true);
}
}
}
submitBatchBuffer(batchBufferGpuAddress, pBatchBuffer, sizeBatchBuffer, this->getMemoryBank(batchBuffer.commandBufferAllocation), this->getPPGTTAdditionalBits(batchBuffer.commandBufferAllocation));
submitBatchBuffer(
batchBufferGpuAddress, pBatchBuffer, sizeBatchBuffer,
this->getMemoryBank(batchBuffer.commandBufferAllocation),
this->getPPGTTAdditionalBits(batchBuffer.commandBufferAllocation),
overrideRingHead);
if (subCaptureManager) {
pollForCompletion();
@ -232,10 +243,10 @@ FlushStamp TbxCommandStreamReceiverHw<GfxFamily>::flush(BatchBuffer &batchBuffer
}
template <typename GfxFamily>
void TbxCommandStreamReceiverHw<GfxFamily>::submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits) {
void TbxCommandStreamReceiverHw<GfxFamily>::submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits, bool overrideRingHead) {
if (hardwareContextController) {
if (batchBufferSize) {
hardwareContextController->submit(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, MemoryConstants::pageSize64k);
hardwareContextController->submit(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, MemoryConstants::pageSize64k, overrideRingHead);
}
return;
}

View File

@ -41,9 +41,9 @@ void HardwareContextController::expectMemory(uint64_t gfxAddress, const void *sr
}
void HardwareContextController::submit(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize,
uint32_t memoryBank, uint64_t entryBits) {
uint32_t memoryBank, uint64_t entryBits, bool overrideRingHead) {
for (auto &hardwareContext : hardwareContexts) {
hardwareContext->submitBatchBuffer(batchBufferGpuAddress);
hardwareContext->submitBatchBuffer(batchBufferGpuAddress, overrideRingHead);
}
}

View File

@ -23,7 +23,7 @@ class HardwareContextController {
void initialize();
void pollForCompletion();
void expectMemory(uint64_t gfxAddress, const void *srcAddress, size_t length, uint32_t compareOperation);
void submit(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits);
void submit(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits, bool overrideRingHead);
void writeMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t memoryBanks, int hint, size_t pageSize);
void dumpBufferBIN(uint64_t gfxAddress, size_t size);

View File

@ -17,7 +17,7 @@ struct HardwareContext {
virtual void initialize() = 0;
virtual void pollForCompletion() = 0;
virtual void writeAndSubmitBatchBuffer(uint64_t gfxAddress, const void *batchBuffer, size_t size, uint32_t memoryBanks, size_t pageSize) = 0;
virtual void submitBatchBuffer(uint64_t gfxAddress) = 0;
virtual void submitBatchBuffer(uint64_t gfxAddress, bool overrideRingHead) = 0;
virtual void writeMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t memoryBanks, int hint, size_t pageSize) = 0;
virtual void freeMemory(uint64_t gfxAddress, size_t size) = 0;
virtual void expectMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t compareOperation) = 0;

View File

@ -1190,7 +1190,7 @@ TEST_F(HardwareContextContainerTests, givenSingleHwContextWhenSubmitMethodIsCall
EXPECT_FALSE(mockHwContext0->writeAndSubmitCalled);
EXPECT_FALSE(mockHwContext0->writeMemoryCalled);
hwContextContainer.submit(1, reinterpret_cast<const void *>(0x123), 2, 0, 1);
hwContextContainer.submit(1, reinterpret_cast<const void *>(0x123), 2, 0, 1, false);
EXPECT_TRUE(mockHwContext0->submitCalled);
EXPECT_FALSE(mockHwContext0->writeAndSubmitCalled);
@ -1234,7 +1234,7 @@ TEST_F(HardwareContextContainerTests, givenMultipleHwContextWhenSingleMethodIsCa
hwContextContainer.initialize();
hwContextContainer.pollForCompletion();
hwContextContainer.expectMemory(1, reinterpret_cast<const void *>(0x123), 2, 0);
hwContextContainer.submit(1, reinterpret_cast<const void *>(0x123), 2, 0, 1);
hwContextContainer.submit(1, reinterpret_cast<const void *>(0x123), 2, 0, 1, false);
hwContextContainer.writeMemory(1, reinterpret_cast<const void *>(0x123), 2, 3u, 4, 5);
EXPECT_TRUE(mockHwContext0->initializeCalled);

View File

@ -298,6 +298,35 @@ TEST_F(AubSubCaptureTest, givenSubCaptureManagerWhenSubCaptureActiveStatesAreDet
EXPECT_TRUE(aubSubCaptureManager.isSubCaptureEnabled());
}
TEST_F(AubSubCaptureTest, givenSubCaptureManagerWhenSubCaptureActiveStatesAreDeterminedThenGetSubCaptureStatusReturnsCorrectValues) {
AubSubCaptureManagerMock aubSubCaptureManager("", subCaptureCommon);
AubSubCaptureStatus aubSubCaptureStatus{};
aubSubCaptureManager.setSubCaptureWasActiveInPreviousEnqueue(false);
aubSubCaptureManager.setSubCaptureIsActive(false);
aubSubCaptureStatus = aubSubCaptureManager.getSubCaptureStatus();
EXPECT_FALSE(aubSubCaptureStatus.wasActiveInPreviousEnqueue);
EXPECT_FALSE(aubSubCaptureStatus.isActive);
aubSubCaptureManager.setSubCaptureWasActiveInPreviousEnqueue(false);
aubSubCaptureManager.setSubCaptureIsActive(true);
aubSubCaptureStatus = aubSubCaptureManager.getSubCaptureStatus();
EXPECT_FALSE(aubSubCaptureStatus.wasActiveInPreviousEnqueue);
EXPECT_TRUE(aubSubCaptureStatus.isActive);
aubSubCaptureManager.setSubCaptureWasActiveInPreviousEnqueue(true);
aubSubCaptureManager.setSubCaptureIsActive(false);
aubSubCaptureStatus = aubSubCaptureManager.getSubCaptureStatus();
EXPECT_TRUE(aubSubCaptureStatus.wasActiveInPreviousEnqueue);
EXPECT_FALSE(aubSubCaptureStatus.isActive);
aubSubCaptureManager.setSubCaptureIsActive(true);
aubSubCaptureManager.setSubCaptureWasActiveInPreviousEnqueue(true);
aubSubCaptureStatus = aubSubCaptureManager.getSubCaptureStatus();
EXPECT_TRUE(aubSubCaptureStatus.wasActiveInPreviousEnqueue);
EXPECT_TRUE(aubSubCaptureStatus.isActive);
}
TEST_F(AubSubCaptureTest, givenSubCaptureManagerWhenGetSubCaptureFileNameIsCalledAndAubCaptureFileNameIsSpecifiedThenItReturnsTheSpecifiedFileName) {
DebugManagerStateRestore dbgRestore;
DebugManager.flags.AUBDumpCaptureFileName.set("aubcapture_file_name.aub");
@ -534,7 +563,7 @@ TEST_F(AubSubCaptureTest, givenSubCaptureManagerInFilterModeWhenKernelNameIsSpec
EXPECT_FALSE(aubSubCaptureManager.isSubCaptureActive());
}
TEST_F(AubSubCaptureTest, givenSubCaptureManagerWhenPublicInterfacIsCalledThenLockShouldBeAcquired) {
TEST_F(AubSubCaptureTest, givenSubCaptureManagerWhenPublicInterfaceIsCalledThenLockShouldBeAcquired) {
AubSubCaptureManagerMock aubSubCaptureManager("", subCaptureCommon);
DispatchInfo dispatchInfo;
MultiDispatchInfo multiDispatchInfo;
@ -552,6 +581,10 @@ TEST_F(AubSubCaptureTest, givenSubCaptureManagerWhenPublicInterfacIsCalledThenLo
aubSubCaptureManager.checkAndActivateSubCapture(multiDispatchInfo);
EXPECT_TRUE(aubSubCaptureManager.isLocked);
aubSubCaptureManager.isLocked = false;
aubSubCaptureManager.getSubCaptureStatus();
EXPECT_TRUE(aubSubCaptureManager.isLocked);
aubSubCaptureManager.isLocked = false;
aubSubCaptureManager.getSubCaptureFileName(multiDispatchInfo);
EXPECT_TRUE(aubSubCaptureManager.isLocked);

View File

@ -698,7 +698,6 @@ HWTEST_F(TbxCommandStreamTests, givenTbxCsrInSubCaptureModeWhenFlushIsCalledAndS
auto commandBuffer = pDevice->executionEnvironment->memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize});
LinearStream cs(commandBuffer);
BatchBuffer batchBuffer{cs.getGraphicsAllocation(), 0, 0, nullptr, false, false, QueueThrottle::MEDIUM, QueueSliceCount::defaultSliceCount, cs.getUsed(), &cs};
ResidencyContainer allocationsForResidency = {};
tbxCsr.flush(batchBuffer, allocationsForResidency);
@ -709,6 +708,57 @@ HWTEST_F(TbxCommandStreamTests, givenTbxCsrInSubCaptureModeWhenFlushIsCalledAndS
pDevice->executionEnvironment->memoryManager->freeGraphicsMemory(commandBuffer);
}
HWTEST_F(TbxCommandStreamTests, givenTbxCsrInSubCaptureModeWhenFlushIsCalledAndSubCaptureGetsActivatedThenCallSubmitBatchBufferWithOverrideRingBufferSetToTrue) {
MockTbxCsr<FamilyType> tbxCsr{*pDevice->executionEnvironment};
MockOsContext osContext(0, 1, aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false);
tbxCsr.setupContext(osContext);
AubSubCaptureCommon aubSubCaptureCommon;
auto aubSubCaptureManagerMock = new AubSubCaptureManagerMock("", aubSubCaptureCommon);
aubSubCaptureManagerMock->setSubCaptureIsActive(true);
tbxCsr.subCaptureManager = std::unique_ptr<AubSubCaptureManagerMock>(aubSubCaptureManagerMock);
EXPECT_FALSE(aubSubCaptureManagerMock->wasSubCaptureActiveInPreviousEnqueue());
EXPECT_TRUE(aubSubCaptureManagerMock->isSubCaptureActive());
auto commandBuffer = pDevice->executionEnvironment->memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize});
LinearStream cs(commandBuffer);
BatchBuffer batchBuffer{cs.getGraphicsAllocation(), 0, 0, nullptr, false, false, QueueThrottle::MEDIUM, QueueSliceCount::defaultSliceCount, cs.getUsed(), &cs};
ResidencyContainer allocationsForResidency = {};
tbxCsr.flush(batchBuffer, allocationsForResidency);
EXPECT_TRUE(tbxCsr.submitBatchBufferCalled);
EXPECT_TRUE(tbxCsr.overrideRingHeadPassed);
pDevice->executionEnvironment->memoryManager->freeGraphicsMemory(commandBuffer);
}
HWTEST_F(TbxCommandStreamTests, givenTbxCsrInSubCaptureModeWhenFlushIsCalledAndSubCaptureRemainsActiveThenCallSubmitBatchBufferWithOverrideRingBufferSetToTrue) {
MockTbxCsr<FamilyType> tbxCsr{*pDevice->executionEnvironment};
MockOsContext osContext(0, 1, aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false);
tbxCsr.setupContext(osContext);
AubSubCaptureCommon aubSubCaptureCommon;
auto aubSubCaptureManagerMock = new AubSubCaptureManagerMock("", aubSubCaptureCommon);
aubSubCaptureManagerMock->setSubCaptureWasActiveInPreviousEnqueue(true);
aubSubCaptureManagerMock->setSubCaptureIsActive(true);
tbxCsr.subCaptureManager = std::unique_ptr<AubSubCaptureManagerMock>(aubSubCaptureManagerMock);
EXPECT_TRUE(aubSubCaptureManagerMock->wasSubCaptureActiveInPreviousEnqueue());
EXPECT_TRUE(aubSubCaptureManagerMock->isSubCaptureActive());
auto commandBuffer = pDevice->executionEnvironment->memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize});
LinearStream cs(commandBuffer);
BatchBuffer batchBuffer{cs.getGraphicsAllocation(), 0, 0, nullptr, false, false, QueueThrottle::MEDIUM, QueueSliceCount::defaultSliceCount, cs.getUsed(), &cs};
ResidencyContainer allocationsForResidency = {};
tbxCsr.flush(batchBuffer, allocationsForResidency);
EXPECT_TRUE(tbxCsr.submitBatchBufferCalled);
EXPECT_FALSE(tbxCsr.overrideRingHeadPassed);
pDevice->executionEnvironment->memoryManager->freeGraphicsMemory(commandBuffer);
}
HWTEST_F(TbxCommandStreamTests, givenTbxCsrWhenProcessResidencyIsCalledWithDumpTbxNonWritableFlagThenAllocationsForResidencyShouldBeMadeTbxWritable) {
std::unique_ptr<MemoryManager> memoryManager(nullptr);
std::unique_ptr<MockTbxCsrToTestDumpTbxNonWritable<FamilyType>> tbxCsr(new MockTbxCsrToTestDumpTbxNonWritable<FamilyType>(*pDevice->executionEnvironment));

View File

@ -20,7 +20,7 @@ struct MockHardwareContext : public aub_stream::HardwareContext {
void initialize() override { initializeCalled = true; }
void pollForCompletion() override { pollForCompletionCalled = true; }
void writeAndSubmitBatchBuffer(uint64_t gfxAddress, const void *batchBuffer, size_t size, uint32_t memoryBank, size_t pageSize = 65536) override { writeAndSubmitCalled = true; }
void submitBatchBuffer(uint64_t gfxAddress) override { submitCalled = true; }
void submitBatchBuffer(uint64_t gfxAddress, bool overrideRingHead) override { submitCalled = true; }
void writeMemory(uint64_t gfxAddress, const void *memory, size_t size, uint32_t memoryBanks, int hint, size_t pageSize = 65536) override {
writeMemoryCalled = true;
writeMemoryPageSizePassed = pageSize;

View File

@ -41,8 +41,9 @@ class MockTbxCsr : public TbxCommandStreamReceiverHw<GfxFamily> {
TbxCommandStreamReceiverHw<GfxFamily>::writeMemory(gpuAddress, cpuAddress, size, memoryBank, entryBits);
writeMemoryCalled = true;
}
void submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits) override {
TbxCommandStreamReceiverHw<GfxFamily>::submitBatchBuffer(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, entryBits);
void submitBatchBuffer(uint64_t batchBufferGpuAddress, const void *batchBuffer, size_t batchBufferSize, uint32_t memoryBank, uint64_t entryBits, bool overrideRingHead) override {
TbxCommandStreamReceiverHw<GfxFamily>::submitBatchBuffer(batchBufferGpuAddress, batchBuffer, batchBufferSize, memoryBank, entryBits, overrideRingHead);
overrideRingHeadPassed = overrideRingHead;
submitBatchBufferCalled = true;
}
void pollForCompletion() override {
@ -57,6 +58,7 @@ class MockTbxCsr : public TbxCommandStreamReceiverHw<GfxFamily> {
bool writeMemoryWithAubManagerCalled = false;
bool writeMemoryCalled = false;
bool submitBatchBufferCalled = false;
bool overrideRingHeadPassed = false;
bool pollForCompletionCalled = false;
bool expectMemoryEqualCalled = false;
bool expectMemoryNotEqualCalled = false;