Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 22 additions & 14 deletions src/gpgmm/d3d12/ResidencyManagerD3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,8 @@ namespace gpgmm { namespace d3d12 {
std::unique_ptr<ResidencyManager> residencyManager = std::unique_ptr<ResidencyManager>(
new ResidencyManager(descriptor, std::move(residencyFence)));

// Query and set the video memory limits per segment.
DXGI_QUERY_VIDEO_MEMORY_INFO* queryVideoMemoryInfo =
residencyManager->GetVideoMemorySegmentInfo(DXGI_MEMORY_SEGMENT_GROUP_LOCAL);

ReturnIfFailed(residencyManager->QueryVideoMemoryInfo(DXGI_MEMORY_SEGMENT_GROUP_LOCAL,
queryVideoMemoryInfo));
if (!descriptor.IsUMA) {
queryVideoMemoryInfo =
residencyManager->GetVideoMemorySegmentInfo(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL);

ReturnIfFailed(residencyManager->QueryVideoMemoryInfo(
DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, queryVideoMemoryInfo));
}
// Set the initial video memory limits per segment.
ReturnIfFailed(residencyManager->UpdateVideoMemorySegments());

*residencyManagerOut = residencyManager.release();

Expand All @@ -73,7 +62,8 @@ namespace gpgmm { namespace d3d12 {
mVideoMemoryBudget(descriptor.VideoMemoryBudget == 0 ? kDefaultVideoMemoryBudget
: descriptor.VideoMemoryBudget),
mBudget(descriptor.Budget),
mEvictLimit(descriptor.EvictLimit == 0 ? kDefaultEvictLimit : descriptor.EvictLimit) {
mEvictLimit(descriptor.EvictLimit == 0 ? kDefaultEvictLimit : descriptor.EvictLimit),
mIsUMA(descriptor.IsUMA) {
GPGMM_TRACE_EVENT_OBJECT_NEW(this);

ASSERT(mDevice != nullptr);
Expand Down Expand Up @@ -290,6 +280,19 @@ namespace gpgmm { namespace d3d12 {
return S_OK;
}

HRESULT ResidencyManager::UpdateVideoMemorySegments() {
DXGI_QUERY_VIDEO_MEMORY_INFO* queryVideoMemoryInfo =
GetVideoMemorySegmentInfo(DXGI_MEMORY_SEGMENT_GROUP_LOCAL);

ReturnIfFailed(QueryVideoMemoryInfo(DXGI_MEMORY_SEGMENT_GROUP_LOCAL, queryVideoMemoryInfo));
if (!mIsUMA) {
queryVideoMemoryInfo = GetVideoMemorySegmentInfo(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL);
ReturnIfFailed(
QueryVideoMemoryInfo(DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL, queryVideoMemoryInfo));
}
return S_OK;
}

HRESULT ResidencyManager::Evict(uint64_t evictSizeInBytes,
const DXGI_MEMORY_SEGMENT_GROUP& memorySegmentGroup) {
std::lock_guard<std::mutex> lock(mMutex);
Expand Down Expand Up @@ -384,6 +387,11 @@ namespace gpgmm { namespace d3d12 {
return E_NOTIMPL;
}

// Ensure changes to video memory budget is recorded during tracing.
if (IsEventTraceEnabled()) {
ReturnIfFailed(UpdateVideoMemorySegments());
}

ID3D12CommandList* commandList = commandLists[0];
ResidencySet* residencySet = residencySets[0];

Expand Down
4 changes: 4 additions & 0 deletions src/gpgmm/d3d12/ResidencyManagerD3D12.h
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,9 @@ namespace gpgmm { namespace d3d12 {
HRESULT QueryVideoMemoryInfo(const DXGI_MEMORY_SEGMENT_GROUP& memorySegmentGroup,
DXGI_QUERY_VIDEO_MEMORY_INFO* pVideoMemoryInfo) const;

// Query and set the video memory limits for all segments.
HRESULT UpdateVideoMemorySegments();

ComPtr<ID3D12Device> mDevice;
ComPtr<IDXGIAdapter3> mAdapter;
ComPtr<ID3D12Device3> mDevice3;
Expand All @@ -198,6 +201,7 @@ namespace gpgmm { namespace d3d12 {
const float mVideoMemoryBudget;
const uint64_t mBudget;
const uint64_t mEvictLimit;
const bool mIsUMA;

VideoMemorySegment mLocalVideoMemorySegment;
VideoMemorySegment mNonLocalVideoMemorySegment;
Expand Down