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:
parent
d2576c95aa
commit
b3ada0146b
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue