mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-21 09:14:47 +08:00
Pass Wddm to WddmResidencyController
Change-Id: I2379ffdfb740a869f6d157ed22f40ce509d6bebe Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
This commit is contained in:
committed by
sys_ocldev
parent
8ead8f727f
commit
4aae1a817b
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
namespace OCLRT {
|
namespace OCLRT {
|
||||||
|
|
||||||
OsContextWin::OsContextImpl(Wddm &wddm, uint32_t osContextId) : wddm(wddm), residencyController(osContextId) {
|
OsContextWin::OsContextImpl(Wddm &wddm, uint32_t osContextId) : wddm(wddm), residencyController(wddm, osContextId) {
|
||||||
UNRECOVERABLE_IF(!wddm.isInitialized());
|
UNRECOVERABLE_IF(!wddm.isInitialized());
|
||||||
auto wddmInterface = wddm.getWddmInterface();
|
auto wddmInterface = wddm.getWddmInterface();
|
||||||
if (!wddm.createContext(context)) {
|
if (!wddm.createContext(context)) {
|
||||||
|
|||||||
@@ -8,11 +8,12 @@
|
|||||||
#include "runtime/os_interface/windows/wddm_residency_controller.h"
|
#include "runtime/os_interface/windows/wddm_residency_controller.h"
|
||||||
#include "runtime/os_interface/windows/wddm_allocation.h"
|
#include "runtime/os_interface/windows/wddm_allocation.h"
|
||||||
#include "runtime/os_interface/debug_settings_manager.h"
|
#include "runtime/os_interface/debug_settings_manager.h"
|
||||||
|
#include "runtime/os_interface/windows/wddm/wddm.h"
|
||||||
#include "runtime/utilities/spinlock.h"
|
#include "runtime/utilities/spinlock.h"
|
||||||
|
|
||||||
namespace OCLRT {
|
namespace OCLRT {
|
||||||
|
|
||||||
WddmResidencyController::WddmResidencyController(uint32_t osContextId) : osContextId(osContextId) {}
|
WddmResidencyController::WddmResidencyController(Wddm &wddm, uint32_t osContextId) : wddm(wddm), osContextId(osContextId) {}
|
||||||
|
|
||||||
void WddmResidencyController::acquireLock() {
|
void WddmResidencyController::acquireLock() {
|
||||||
bool previousLockValue = false;
|
bool previousLockValue = false;
|
||||||
|
|||||||
@@ -17,10 +17,11 @@ namespace OCLRT {
|
|||||||
|
|
||||||
class GraphicsAllocation;
|
class GraphicsAllocation;
|
||||||
class WddmAllocation;
|
class WddmAllocation;
|
||||||
|
class Wddm;
|
||||||
|
|
||||||
class WddmResidencyController {
|
class WddmResidencyController {
|
||||||
public:
|
public:
|
||||||
WddmResidencyController(uint32_t osContextId);
|
WddmResidencyController(Wddm &wddm, uint32_t osContextId);
|
||||||
|
|
||||||
void acquireLock();
|
void acquireLock();
|
||||||
void releaseLock();
|
void releaseLock();
|
||||||
@@ -46,9 +47,12 @@ class WddmResidencyController {
|
|||||||
void resetMonitoredFenceParams(D3DKMT_HANDLE &handle, uint64_t *cpuAddress, D3DGPU_VIRTUAL_ADDRESS &gpuAddress);
|
void resetMonitoredFenceParams(D3DKMT_HANDLE &handle, uint64_t *cpuAddress, D3DGPU_VIRTUAL_ADDRESS &gpuAddress);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Wddm &wddm;
|
||||||
uint32_t osContextId;
|
uint32_t osContextId;
|
||||||
|
|
||||||
std::atomic<bool> lock = false;
|
std::atomic<bool> lock = false;
|
||||||
std::atomic_flag trimCallbackLock = ATOMIC_FLAG_INIT;
|
std::atomic_flag trimCallbackLock = ATOMIC_FLAG_INIT;
|
||||||
|
|
||||||
uint64_t lastTrimFenceValue = 0u;
|
uint64_t lastTrimFenceValue = 0u;
|
||||||
ResidencyContainer trimCandidateList;
|
ResidencyContainer trimCandidateList;
|
||||||
uint32_t trimCandidatesCount = 0;
|
uint32_t trimCandidatesCount = 0;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "runtime/os_interface/windows/wddm_residency_controller.h"
|
#include "runtime/os_interface/windows/wddm_residency_controller.h"
|
||||||
#include "runtime/os_interface/os_context.h"
|
#include "runtime/os_interface/os_context.h"
|
||||||
|
#include "unit_tests/mocks/mock_wddm.h"
|
||||||
#include "unit_tests/os_interface/windows/mock_wddm_allocation.h"
|
#include "unit_tests/os_interface/windows/mock_wddm_allocation.h"
|
||||||
|
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
@@ -22,12 +23,15 @@ class MockWddmResidencyController : public WddmResidencyController {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct WddmResidencyControllerTest : ::testing::Test {
|
struct WddmResidencyControllerTest : ::testing::Test {
|
||||||
|
const uint32_t osContextId = 0u;
|
||||||
|
|
||||||
void SetUp() {
|
void SetUp() {
|
||||||
osContext = std::make_unique<OsContext>(nullptr, 0u);
|
wddm = std::unique_ptr<Wddm>(Wddm::createWddm());
|
||||||
residencyController = std::make_unique<MockWddmResidencyController>(osContext->getContextId());
|
wddm->init();
|
||||||
|
residencyController = std::make_unique<MockWddmResidencyController>(*wddm, osContextId);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<OsContext> osContext;
|
std::unique_ptr<Wddm> wddm;
|
||||||
std::unique_ptr<MockWddmResidencyController> residencyController;
|
std::unique_ptr<MockWddmResidencyController> residencyController;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -35,13 +39,13 @@ TEST_F(WddmResidencyControllerTest, givenUsedAllocationWhenCallingRemoveFromTrim
|
|||||||
MockWddmAllocation allocation;
|
MockWddmAllocation allocation;
|
||||||
residencyController->addToTrimCandidateList(&allocation);
|
residencyController->addToTrimCandidateList(&allocation);
|
||||||
residencyController->removeFromTrimCandidateListIfUsed(&allocation, false);
|
residencyController->removeFromTrimCandidateListIfUsed(&allocation, false);
|
||||||
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, givenUnusedAllocationWhenCallingRemoveFromTrimCandidateListIfUsedThenIgnore) {
|
TEST_F(WddmResidencyControllerTest, givenUnusedAllocationWhenCallingRemoveFromTrimCandidateListIfUsedThenIgnore) {
|
||||||
MockWddmAllocation allocation;
|
MockWddmAllocation allocation;
|
||||||
residencyController->removeFromTrimCandidateListIfUsed(&allocation, false);
|
residencyController->removeFromTrimCandidateListIfUsed(&allocation, false);
|
||||||
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, addToTrimCandidateListPlacesAllocationInContainerAndAssignsPosition) {
|
TEST_F(WddmResidencyControllerTest, addToTrimCandidateListPlacesAllocationInContainerAndAssignsPosition) {
|
||||||
@@ -49,9 +53,9 @@ TEST_F(WddmResidencyControllerTest, addToTrimCandidateListPlacesAllocationInCont
|
|||||||
residencyController->addToTrimCandidateList(&allocation);
|
residencyController->addToTrimCandidateList(&allocation);
|
||||||
|
|
||||||
EXPECT_NE(0u, residencyController->trimCandidateList.size());
|
EXPECT_NE(0u, residencyController->trimCandidateList.size());
|
||||||
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContextId));
|
||||||
|
|
||||||
size_t position = allocation.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position = allocation.getTrimCandidateListPosition(osContextId);
|
||||||
ASSERT_LT(position, residencyController->trimCandidateList.size());
|
ASSERT_LT(position, residencyController->trimCandidateList.size());
|
||||||
|
|
||||||
EXPECT_EQ(&allocation, residencyController->trimCandidateList[position]);
|
EXPECT_EQ(&allocation, residencyController->trimCandidateList[position]);
|
||||||
@@ -64,9 +68,9 @@ TEST_F(WddmResidencyControllerTest, addToTrimCandidateListDoesNotInsertAllocatio
|
|||||||
|
|
||||||
residencyController->addToTrimCandidateList(&allocation);
|
residencyController->addToTrimCandidateList(&allocation);
|
||||||
|
|
||||||
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_NE(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContextId));
|
||||||
|
|
||||||
size_t position = allocation.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position = allocation.getTrimCandidateListPosition(osContextId);
|
||||||
ASSERT_LT(position, residencyController->trimCandidateList.size());
|
ASSERT_LT(position, residencyController->trimCandidateList.size());
|
||||||
|
|
||||||
EXPECT_EQ(&allocation, residencyController->trimCandidateList[position]);
|
EXPECT_EQ(&allocation, residencyController->trimCandidateList[position]);
|
||||||
@@ -75,7 +79,7 @@ TEST_F(WddmResidencyControllerTest, addToTrimCandidateListDoesNotInsertAllocatio
|
|||||||
residencyController->addToTrimCandidateList(&allocation);
|
residencyController->addToTrimCandidateList(&allocation);
|
||||||
|
|
||||||
EXPECT_EQ(previousSize, residencyController->trimCandidateList.size());
|
EXPECT_EQ(previousSize, residencyController->trimCandidateList.size());
|
||||||
EXPECT_EQ(position, allocation.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(position, allocation.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListAssignsUnusedPosition) {
|
TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListAssignsUnusedPosition) {
|
||||||
@@ -84,14 +88,14 @@ TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListAssignsUnusedPosi
|
|||||||
residencyController->addToTrimCandidateList(&allocation);
|
residencyController->addToTrimCandidateList(&allocation);
|
||||||
residencyController->removeFromTrimCandidateList(&allocation, false);
|
residencyController->removeFromTrimCandidateList(&allocation, false);
|
||||||
|
|
||||||
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(trimListUnusedPosition, allocation.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListRemovesAllocationInAssignedPosition) {
|
TEST_F(WddmResidencyControllerTest, removeFromTrimCandidateListRemovesAllocationInAssignedPosition) {
|
||||||
MockWddmAllocation allocation;
|
MockWddmAllocation allocation;
|
||||||
|
|
||||||
residencyController->addToTrimCandidateList(&allocation);
|
residencyController->addToTrimCandidateList(&allocation);
|
||||||
size_t position = allocation.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position = allocation.getTrimCandidateListPosition(osContextId);
|
||||||
|
|
||||||
residencyController->removeFromTrimCandidateList(&allocation, false);
|
residencyController->removeFromTrimCandidateList(&allocation, false);
|
||||||
|
|
||||||
@@ -140,8 +144,8 @@ TEST_F(WddmResidencyControllerTest, successiveAddingToTrimCandidateListAssignsNe
|
|||||||
residencyController->addToTrimCandidateList(&allocation3);
|
residencyController->addToTrimCandidateList(&allocation3);
|
||||||
|
|
||||||
EXPECT_EQ(3u, residencyController->trimCandidateList.size());
|
EXPECT_EQ(3u, residencyController->trimCandidateList.size());
|
||||||
EXPECT_NE(allocation1.getTrimCandidateListPosition(osContext->getContextId()), allocation2.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_NE(allocation1.getTrimCandidateListPosition(osContextId), allocation2.getTrimCandidateListPosition(osContextId));
|
||||||
EXPECT_NE(allocation2.getTrimCandidateListPosition(osContext->getContextId()), allocation3.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_NE(allocation2.getTrimCandidateListPosition(osContextId), allocation3.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, DISABLED_removingNotLastAllocationFromTrimCandidateListSubstituesLastPositionAllocation) {
|
TEST_F(WddmResidencyControllerTest, DISABLED_removingNotLastAllocationFromTrimCandidateListSubstituesLastPositionAllocation) {
|
||||||
@@ -155,8 +159,8 @@ TEST_F(WddmResidencyControllerTest, DISABLED_removingNotLastAllocationFromTrimCa
|
|||||||
|
|
||||||
EXPECT_EQ(2u, residencyController->trimCandidateList.size());
|
EXPECT_EQ(2u, residencyController->trimCandidateList.size());
|
||||||
|
|
||||||
EXPECT_EQ(2u, allocation3.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(2u, allocation3.getTrimCandidateListPosition(osContextId));
|
||||||
EXPECT_NE(allocation2.getTrimCandidateListPosition(osContext->getContextId()), allocation3.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_NE(allocation2.getTrimCandidateListPosition(osContextId), allocation3.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, removingNotLastAllocationFromTrimCandidateListPutsNullEntry) {
|
TEST_F(WddmResidencyControllerTest, removingNotLastAllocationFromTrimCandidateListPutsNullEntry) {
|
||||||
@@ -165,8 +169,8 @@ TEST_F(WddmResidencyControllerTest, removingNotLastAllocationFromTrimCandidateLi
|
|||||||
residencyController->addToTrimCandidateList(&allocation1);
|
residencyController->addToTrimCandidateList(&allocation1);
|
||||||
residencyController->addToTrimCandidateList(&allocation2);
|
residencyController->addToTrimCandidateList(&allocation2);
|
||||||
residencyController->addToTrimCandidateList(&allocation3);
|
residencyController->addToTrimCandidateList(&allocation3);
|
||||||
size_t position2 = allocation2.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position2 = allocation2.getTrimCandidateListPosition(osContextId);
|
||||||
size_t position3 = allocation3.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position3 = allocation3.getTrimCandidateListPosition(osContextId);
|
||||||
|
|
||||||
residencyController->removeFromTrimCandidateList(&allocation2, false);
|
residencyController->removeFromTrimCandidateList(&allocation2, false);
|
||||||
|
|
||||||
@@ -183,8 +187,8 @@ TEST_F(WddmResidencyControllerTest, compactTrimCandidateListRemovesInitialNullEn
|
|||||||
residencyController->addToTrimCandidateList(&allocation3);
|
residencyController->addToTrimCandidateList(&allocation3);
|
||||||
residencyController->addToTrimCandidateList(&allocation4);
|
residencyController->addToTrimCandidateList(&allocation4);
|
||||||
|
|
||||||
size_t position3 = allocation3.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position3 = allocation3.getTrimCandidateListPosition(osContextId);
|
||||||
size_t position4 = allocation4.getTrimCandidateListPosition(osContext->getContextId());
|
size_t position4 = allocation4.getTrimCandidateListPosition(osContextId);
|
||||||
|
|
||||||
residencyController->removeFromTrimCandidateList(&allocation2, false);
|
residencyController->removeFromTrimCandidateList(&allocation2, false);
|
||||||
residencyController->removeFromTrimCandidateList(&allocation1, false);
|
residencyController->removeFromTrimCandidateList(&allocation1, false);
|
||||||
@@ -196,10 +200,10 @@ TEST_F(WddmResidencyControllerTest, compactTrimCandidateListRemovesInitialNullEn
|
|||||||
EXPECT_EQ(2u, residencyController->trimCandidateList.size());
|
EXPECT_EQ(2u, residencyController->trimCandidateList.size());
|
||||||
|
|
||||||
EXPECT_EQ(residencyController->trimCandidateList[0], &allocation3);
|
EXPECT_EQ(residencyController->trimCandidateList[0], &allocation3);
|
||||||
EXPECT_EQ(0u, allocation3.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(0u, allocation3.getTrimCandidateListPosition(osContextId));
|
||||||
|
|
||||||
EXPECT_EQ(residencyController->trimCandidateList[1], &allocation4);
|
EXPECT_EQ(residencyController->trimCandidateList[1], &allocation4);
|
||||||
EXPECT_EQ(1u, allocation4.getTrimCandidateListPosition(osContext->getContextId()));
|
EXPECT_EQ(1u, allocation4.getTrimCandidateListPosition(osContextId));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(WddmResidencyControllerTest, compactTrimCandidateListWithNonNullEntries) {
|
TEST_F(WddmResidencyControllerTest, compactTrimCandidateListWithNonNullEntries) {
|
||||||
|
|||||||
Reference in New Issue
Block a user