Store vector of trim candidate list positions in WddmAllocation

Change-Id: I2fb247238802fc1ccd98e42d7714063f5231249f
Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
This commit is contained in:
Maciej Dziuban
2018-10-09 17:03:07 +02:00
committed by sys_ocldev
parent 9f895c1ecc
commit 44dd4c9145
9 changed files with 100 additions and 59 deletions

View File

@@ -694,7 +694,7 @@ TEST_F(WddmCommandStreamMockGdiTest, makeResidentClearsResidencyAllocations) {
EXPECT_EQ(1u, csr->getResidencyAllocations().size());
EXPECT_EQ(0u, csr->getEvictionAllocations().size());
EXPECT_EQ(trimListUnusedPosition, ((WddmAllocation *)commandBuffer)->getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, ((WddmAllocation *)commandBuffer)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
csr->processResidency(csr->getResidencyAllocations(), *device->getOsContext());
@@ -703,7 +703,7 @@ TEST_F(WddmCommandStreamMockGdiTest, makeResidentClearsResidencyAllocations) {
EXPECT_EQ(0u, csr->getResidencyAllocations().size());
EXPECT_EQ(0u, csr->getEvictionAllocations().size());
EXPECT_EQ(0u, ((WddmAllocation *)commandBuffer)->getTrimCandidateListPosition());
EXPECT_EQ(0u, ((WddmAllocation *)commandBuffer)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
memoryManager->freeGraphicsMemory(commandBuffer);
}
@@ -777,12 +777,12 @@ HWTEST_F(WddmCommandStreamMockGdiTest, givenRecordedCommandBufferWhenItIsSubmitt
EXPECT_TRUE(found);
}
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)tagAllocation)->getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)commandBuffer)->getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, ((WddmAllocation *)dshAlloc)->getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, ((WddmAllocation *)iohAlloc)->getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)sshAlloc)->getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)csrCommandStream)->getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)tagAllocation)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)commandBuffer)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
EXPECT_EQ(trimListUnusedPosition, ((WddmAllocation *)dshAlloc)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
EXPECT_EQ(trimListUnusedPosition, ((WddmAllocation *)iohAlloc)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)sshAlloc)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
EXPECT_NE(trimListUnusedPosition, ((WddmAllocation *)csrCommandStream)->getTrimCandidateListPosition(device->getOsContext()->getContextId()));
memoryManager->freeGraphicsMemory(dshAlloc);
memoryManager->freeGraphicsMemory(iohAlloc);

View File

@@ -55,6 +55,21 @@ TEST(WddmMemoryManager, NonAssignable) {
EXPECT_FALSE(std::is_copy_assignable<WddmMemoryManager>::value);
}
TEST(WddmAllocationTest, givenAllocationIsTrimCandidateInOneOsContextWhenGettingTrimCandidatePositionThenReturnItsPositionAndUnusedPositionInOtherContexts) {
WddmAllocation allocation{nullptr, 0, nullptr, 0, nullptr, MemoryPool::MemoryNull, 3u};
OsContext osContext{nullptr, 1u};
allocation.setTrimCandidateListPosition(osContext.getContextId(), 700u);
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(0u));
EXPECT_EQ(700u, allocation.getTrimCandidateListPosition(1u));
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(2u));
}
TEST(WddmAllocationTest, givenRequestedContextIdTooLargeWhenGettingTrimCandidateListPositionThenReturnUnusedPosition) {
WddmAllocation allocation{nullptr, 0, nullptr, 0, nullptr, MemoryPool::MemoryNull, 1u};
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(1u));
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(1000u));
}
TEST(WddmMemoryManagerAllocator32BitTest, allocator32BitIsCreatedWithCorrectBase) {
ExecutionEnvironment executionEnvironment;
std::unique_ptr<WddmMock> wddm(static_cast<WddmMock *>(Wddm::createWddm()));
@@ -1005,7 +1020,7 @@ TEST_F(WddmMemoryManagerResidencyTest, givenOneUsedAllocationFromPreviousPeriodi
// 1 allocation evicted
EXPECT_EQ(1u, wddm->makeNonResidentResult.called);
// removed from trim candidate list
EXPECT_EQ(trimListUnusedPosition, allocation1.getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, allocation1.getTrimCandidateListPosition(osContext->getContextId()));
//marked nonresident
EXPECT_FALSE(allocation1.getResidencyData().resident);
@@ -1126,9 +1141,9 @@ TEST_F(WddmMemoryManagerResidencyTest, trimToBudgetAllDoneAllocations) {
osContext->get()->getResidencyController().compactTrimCandidateList();
EXPECT_EQ(1u, osContext->get()->getResidencyController().peekTrimCandidateList().size());
EXPECT_EQ(trimListUnusedPosition, allocation1.getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, allocation2.getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, allocation3.getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, allocation1.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_EQ(trimListUnusedPosition, allocation2.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_NE(trimListUnusedPosition, allocation3.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmMemoryManagerResidencyTest, trimToBudgetReturnsFalseWhenNumBytesToTrimIsNotZero) {
@@ -1184,9 +1199,9 @@ TEST_F(WddmMemoryManagerResidencyTest, trimToBudgetStopsEvictingWhenNumBytesToTr
EXPECT_EQ(2u, wddm->makeNonResidentResult.called);
EXPECT_EQ(1u, osContext->get()->getResidencyController().peekTrimCandidateList().size());
EXPECT_EQ(trimListUnusedPosition, allocation1.getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, allocation2.getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, allocation3.getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, allocation1.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_EQ(trimListUnusedPosition, allocation2.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_NE(trimListUnusedPosition, allocation3.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmMemoryManagerResidencyTest, trimToBudgetMarksEvictedAllocationNonResident) {

View File

@@ -6,6 +6,7 @@
*/
#include "runtime/os_interface/windows/wddm_residency_controller.h"
#include "runtime/os_interface/os_context.h"
#include "unit_tests/os_interface/windows/mock_wddm_allocation.h"
#include "test.h"
@@ -17,24 +18,40 @@ class MockWddmResidencyController : public WddmResidencyController {
public:
using WddmResidencyController::trimCandidateList;
using WddmResidencyController::trimCandidatesCount;
using WddmResidencyController::WddmResidencyController;
};
struct WddmResidencyControllerTest : ::testing::Test {
void SetUp() {
residencyController = std::make_unique<MockWddmResidencyController>();
osContext = std::make_unique<OsContext>(nullptr, 0u);
residencyController = std::make_unique<MockWddmResidencyController>(osContext->getContextId());
}
std::unique_ptr<OsContext> osContext;
std::unique_ptr<MockWddmResidencyController> residencyController;
};
TEST_F(WddmResidencyControllerTest, givenUsedAllocationWhenCallingRemoveFromTrimCandidateListIfUsedThenRemoveIt) {
MockWddmAllocation allocation;
residencyController->addToTrimCandidateList(&allocation);
residencyController->removeFromTrimCandidateListIfUsed(&allocation, false);
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, givenUnusedAllocationWhenCallingRemoveFromTrimCandidateListIfUsedThenIgnore) {
MockWddmAllocation allocation;
residencyController->removeFromTrimCandidateListIfUsed(&allocation, false);
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, addToTrimCandidateListPlacesAllocationInContainerAndAssignsPosition) {
MockWddmAllocation allocation;
residencyController->addToTrimCandidateList(&allocation);
EXPECT_NE(0u, residencyController->trimCandidateList.size());
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
size_t position = allocation.getTrimCandidateListPosition();
size_t position = allocation.getTrimCandidateListPosition(osContext->getContextId());
ASSERT_LT(position, residencyController->trimCandidateList.size());
EXPECT_EQ(&allocation, residencyController->trimCandidateList[position]);
@@ -47,9 +64,9 @@ TEST_F(WddmResidencyControllerTest, addToTrimCandidateListDoesNotInsertAllocatio
residencyController->addToTrimCandidateList(&allocation);
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition());
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
size_t position = allocation.getTrimCandidateListPosition();
size_t position = allocation.getTrimCandidateListPosition(osContext->getContextId());
ASSERT_LT(position, residencyController->trimCandidateList.size());
EXPECT_EQ(&allocation, residencyController->trimCandidateList[position]);
@@ -58,7 +75,7 @@ TEST_F(WddmResidencyControllerTest, addToTrimCandidateListDoesNotInsertAllocatio
residencyController->addToTrimCandidateList(&allocation);
EXPECT_EQ(previousSize, residencyController->trimCandidateList.size());
EXPECT_EQ(position, allocation.getTrimCandidateListPosition());
EXPECT_EQ(position, allocation.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListAssignsUnusedPosition) {
@@ -67,14 +84,14 @@ TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListAssignsUnusedPosi
residencyController->addToTrimCandidateList(&allocation);
residencyController->removeFromTrimCandidateList(&allocation, false);
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition());
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListRemovesAllocationInAssignedPosition) {
MockWddmAllocation allocation;
residencyController->addToTrimCandidateList(&allocation);
size_t position = allocation.getTrimCandidateListPosition();
size_t position = allocation.getTrimCandidateListPosition(osContext->getContextId());
residencyController->removeFromTrimCandidateList(&allocation, false);
@@ -123,8 +140,8 @@ TEST_F(WddmResidencyControllerTest, successiveAddingToTrimCandidateListAssignsNe
residencyController->addToTrimCandidateList(&allocation3);
EXPECT_EQ(3u, residencyController->trimCandidateList.size());
EXPECT_NE(allocation1.getTrimCandidateListPosition(), allocation2.getTrimCandidateListPosition());
EXPECT_NE(allocation2.getTrimCandidateListPosition(), allocation3.getTrimCandidateListPosition());
EXPECT_NE(allocation1.getTrimCandidateListPosition(osContext->getContextId()), allocation2.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_NE(allocation2.getTrimCandidateListPosition(osContext->getContextId()), allocation3.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, DISABLED_removingNotLastAllocationFromTrimCandidateListSubstituesLastPositionAllocation) {
@@ -138,8 +155,8 @@ TEST_F(WddmResidencyControllerTest, DISABLED_removingNotLastAllocationFromTrimCa
EXPECT_EQ(2u, residencyController->trimCandidateList.size());
EXPECT_EQ(2u, allocation3.getTrimCandidateListPosition());
EXPECT_NE(allocation2.getTrimCandidateListPosition(), allocation3.getTrimCandidateListPosition());
EXPECT_EQ(2u, allocation3.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_NE(allocation2.getTrimCandidateListPosition(osContext->getContextId()), allocation3.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, removingNotLastAllocationFromTrimCandidateListPutsNullEntry) {
@@ -148,8 +165,8 @@ TEST_F(WddmResidencyControllerTest, removingNotLastAllocationFromTrimCandidateLi
residencyController->addToTrimCandidateList(&allocation1);
residencyController->addToTrimCandidateList(&allocation2);
residencyController->addToTrimCandidateList(&allocation3);
size_t position2 = allocation2.getTrimCandidateListPosition();
size_t position3 = allocation3.getTrimCandidateListPosition();
size_t position2 = allocation2.getTrimCandidateListPosition(osContext->getContextId());
size_t position3 = allocation3.getTrimCandidateListPosition(osContext->getContextId());
residencyController->removeFromTrimCandidateList(&allocation2, false);
@@ -166,8 +183,8 @@ TEST_F(WddmResidencyControllerTest, compactTrimCandidateListRemovesInitialNullEn
residencyController->addToTrimCandidateList(&allocation3);
residencyController->addToTrimCandidateList(&allocation4);
size_t position3 = allocation3.getTrimCandidateListPosition();
size_t position4 = allocation4.getTrimCandidateListPosition();
size_t position3 = allocation3.getTrimCandidateListPosition(osContext->getContextId());
size_t position4 = allocation4.getTrimCandidateListPosition(osContext->getContextId());
residencyController->removeFromTrimCandidateList(&allocation2, false);
residencyController->removeFromTrimCandidateList(&allocation1, false);
@@ -179,10 +196,10 @@ TEST_F(WddmResidencyControllerTest, compactTrimCandidateListRemovesInitialNullEn
EXPECT_EQ(2u, residencyController->trimCandidateList.size());
EXPECT_EQ(residencyController->trimCandidateList[0], &allocation3);
EXPECT_EQ(0u, allocation3.getTrimCandidateListPosition());
EXPECT_EQ(0u, allocation3.getTrimCandidateListPosition(osContext->getContextId()));
EXPECT_EQ(residencyController->trimCandidateList[1], &allocation4);
EXPECT_EQ(1u, allocation4.getTrimCandidateListPosition());
EXPECT_EQ(1u, allocation4.getTrimCandidateListPosition(osContext->getContextId()));
}
TEST_F(WddmResidencyControllerTest, compactTrimCandidateListWithNonNullEntries) {