mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-08 14:02:58 +08:00
fix: Don't program redundant paging fence semaphores
Related-To: NEO-12197 Don't program semaphore to wait for paging fence if it was already programmed with the same value Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
490b474ce7
commit
a915ef4b7b
@@ -1416,23 +1416,27 @@ struct SemaphorWaitForResidencyTest : public WddmCommandStreamTest {
|
||||
MockWddmDirectSubmissionCsr *mockCsr;
|
||||
};
|
||||
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenNoAllocationsToMakeResidentThenSignalFlag) {
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenCommandBufferToMakeResidentThenSignalFlag) {
|
||||
LinearStream cs(commandBuffer);
|
||||
BatchBuffer batchBuffer = BatchBufferHelper::createDefaultBatchBuffer(cs.getGraphicsAllocation(), &cs, cs.getUsed());
|
||||
|
||||
// no allocations to make resident, no need to wait
|
||||
// command buffer to be resident, requires blocking
|
||||
mockCsr->flush(batchBuffer, mockCsr->getResidencyAllocations());
|
||||
EXPECT_TRUE(batchBuffer.pagingFenceSemInfo.requiresBlockingResidencyHandling);
|
||||
}
|
||||
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenPagingFenceNotUpdatedThenSignalFlag) {
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenPagingFenceNotUpdatedThenDontSignalFlag) {
|
||||
LinearStream cs(commandBuffer);
|
||||
BatchBuffer batchBuffer = BatchBufferHelper::createDefaultBatchBuffer(cs.getGraphicsAllocation(), &cs, cs.getUsed());
|
||||
mockCsr->flush(batchBuffer, mockCsr->getResidencyAllocations());
|
||||
|
||||
auto controller = mockCsr->peekExecutionEnvironment().initializeDirectSubmissionController();
|
||||
controller->stopThread();
|
||||
mockCsr->directSubmissionAvailable = true;
|
||||
|
||||
mockCsr->getResidencyAllocations().push_back(buffer);
|
||||
mockCsr->flush(batchBuffer, mockCsr->getResidencyAllocations());
|
||||
EXPECT_TRUE(batchBuffer.pagingFenceSemInfo.requiresBlockingResidencyHandling);
|
||||
EXPECT_FALSE(batchBuffer.pagingFenceSemInfo.requiresBlockingResidencyHandling);
|
||||
}
|
||||
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenUllsControllerNotEnabledThenSignalFlag) {
|
||||
@@ -1481,6 +1485,30 @@ TEST_F(SemaphorWaitForResidencyTest, givenBufferHostMemoryAllocationThenSignalFl
|
||||
EXPECT_EQ(100u, batchBuffer.pagingFenceSemInfo.pagingFenceValue);
|
||||
}
|
||||
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenAnotherFlushWithSamePagingFenceValueThenDontProgramPagingFenceSemWaitAndDontBlock) {
|
||||
LinearStream cs(commandBuffer);
|
||||
BatchBuffer batchBuffer = BatchBufferHelper::createDefaultBatchBuffer(cs.getGraphicsAllocation(), &cs, cs.getUsed());
|
||||
mockCsr->flush(batchBuffer, mockCsr->getResidencyAllocations());
|
||||
|
||||
mockCsr->getResidencyAllocations().push_back(bufferHostMemory);
|
||||
*wddm->pagingFenceAddress = 0u;
|
||||
wddm->currentPagingFenceValue = 100u;
|
||||
auto controller = mockCsr->peekExecutionEnvironment().initializeDirectSubmissionController();
|
||||
controller->stopThread();
|
||||
mockCsr->directSubmissionAvailable = true;
|
||||
|
||||
mockCsr->flush(batchBuffer, mockCsr->getResidencyAllocations());
|
||||
EXPECT_FALSE(batchBuffer.pagingFenceSemInfo.requiresBlockingResidencyHandling);
|
||||
EXPECT_EQ(100u, batchBuffer.pagingFenceSemInfo.pagingFenceValue);
|
||||
EXPECT_TRUE(batchBuffer.pagingFenceSemInfo.requiresProgrammingSemaphore());
|
||||
|
||||
BatchBuffer batchBuffer2 = BatchBufferHelper::createDefaultBatchBuffer(cs.getGraphicsAllocation(), &cs, cs.getUsed());
|
||||
mockCsr->flush(batchBuffer2, mockCsr->getResidencyAllocations());
|
||||
EXPECT_FALSE(batchBuffer2.pagingFenceSemInfo.requiresBlockingResidencyHandling);
|
||||
EXPECT_EQ(0u, batchBuffer2.pagingFenceSemInfo.pagingFenceValue);
|
||||
EXPECT_FALSE(batchBuffer2.pagingFenceSemInfo.requiresProgrammingSemaphore());
|
||||
}
|
||||
|
||||
TEST_F(SemaphorWaitForResidencyTest, givenDebugFlagDisabledThenDontSignalFlag) {
|
||||
debugManager.flags.WaitForPagingFenceInController.set(0);
|
||||
LinearStream cs(commandBuffer);
|
||||
|
||||
Reference in New Issue
Block a user