diff --git a/src/gpgmm/common/Utils.h b/src/gpgmm/common/Utils.h index f51d6d420..f9d45b6f0 100644 --- a/src/gpgmm/common/Utils.h +++ b/src/gpgmm/common/Utils.h @@ -50,6 +50,13 @@ namespace gpgmm { return output.str(); } + // Used to combine multiple ToString calls for concatenation. + // Eg. ToString("a", "b", "c") == "abc". + template + std::string ToString(T object, Args... args) { + return ToString(object) + ToString(args...); + } + } // namespace gpgmm #endif // GPGMM_COMMON_UTILS_H_ diff --git a/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp b/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp index 77f61ab0e..91be176cc 100644 --- a/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp +++ b/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp @@ -251,11 +251,10 @@ namespace gpgmm { namespace d3d12 { HRESULT ResidencyManager::QueryVideoMemoryInfo( const DXGI_MEMORY_SEGMENT_GROUP& memorySegmentGroup, - DXGI_QUERY_VIDEO_MEMORY_INFO* videoMemoryInfo) const { - DXGI_QUERY_VIDEO_MEMORY_INFO queryVideoMemoryInfo; - + DXGI_QUERY_VIDEO_MEMORY_INFO* pVideoMemoryInfo) const { + DXGI_QUERY_VIDEO_MEMORY_INFO queryVideoMemoryInfoOut; ReturnIfFailed( - mAdapter->QueryVideoMemoryInfo(0, memorySegmentGroup, &queryVideoMemoryInfo)); + mAdapter->QueryVideoMemoryInfo(0, memorySegmentGroup, &queryVideoMemoryInfoOut)); // The video memory budget provided by QueryVideoMemoryInfo is defined by the operating // system, and may be lower than expected in certain scenarios. Under memory pressure, we @@ -263,24 +262,45 @@ namespace gpgmm { namespace d3d12 { // component from consuming a disproportionate share of memory and ensures that Dawn can // continue to make forward progress. Note the choice to halve memory is arbitrarily chosen // and subject to future experimentation. - videoMemoryInfo->CurrentReservation = - std::min(queryVideoMemoryInfo.Budget / 2, videoMemoryInfo->AvailableForReservation); + pVideoMemoryInfo->CurrentReservation = + std::min(queryVideoMemoryInfoOut.Budget / 2, pVideoMemoryInfo->AvailableForReservation); - videoMemoryInfo->CurrentUsage = - queryVideoMemoryInfo.CurrentUsage - videoMemoryInfo->CurrentReservation; + pVideoMemoryInfo->CurrentUsage = + queryVideoMemoryInfoOut.CurrentUsage - pVideoMemoryInfo->CurrentReservation; // If we're restricting the budget, leave the budget as is. if (mBudget == 0) { - videoMemoryInfo->Budget = static_cast( - (queryVideoMemoryInfo.Budget - videoMemoryInfo->CurrentReservation) * + pVideoMemoryInfo->Budget = static_cast( + (queryVideoMemoryInfoOut.Budget - pVideoMemoryInfo->CurrentReservation) * mVideoMemoryBudget); } - TRACE_COUNTER1(TraceEventCategory::Default, "GPU memory budget (MB)", - videoMemoryInfo->Budget / 1e6); - - TRACE_COUNTER1(TraceEventCategory::Default, "GPU memory usage (MB)", - videoMemoryInfo->CurrentUsage / 1e6); + TRACE_COUNTER1( + TraceEventCategory::Default, + ToString( + "GPU memory (", + (memorySegmentGroup == DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL) ? "NonLocal" : "Local", + ") budget (MB)") + .c_str(), + pVideoMemoryInfo->Budget / 1e6); + + TRACE_COUNTER1( + TraceEventCategory::Default, + ToString( + "GPU memory (", + (memorySegmentGroup == DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL) ? "NonLocal" : "Local", + ") usage (MB)") + .c_str(), + pVideoMemoryInfo->CurrentUsage / 1e6); + + TRACE_COUNTER1( + TraceEventCategory::Default, + ToString( + "GPU memory (", + (memorySegmentGroup == DXGI_MEMORY_SEGMENT_GROUP_NON_LOCAL) ? "NonLocal" : "Local", + ") reserved (MB)") + .c_str(), + pVideoMemoryInfo->CurrentReservation / 1e6); return S_OK; } diff --git a/src/gpgmm/d3d12/ResidencyManagerD3D12.h b/src/gpgmm/d3d12/ResidencyManagerD3D12.h index f165be013..d5c15c22a 100644 --- a/src/gpgmm/d3d12/ResidencyManagerD3D12.h +++ b/src/gpgmm/d3d12/ResidencyManagerD3D12.h @@ -92,7 +92,7 @@ namespace gpgmm { namespace d3d12 { LRUCache* GetVideoMemorySegmentCache(const DXGI_MEMORY_SEGMENT_GROUP& memorySegmentGroup); HRESULT QueryVideoMemoryInfo(const DXGI_MEMORY_SEGMENT_GROUP& memorySegmentGroup, - DXGI_QUERY_VIDEO_MEMORY_INFO* videoMemoryInfo) const; + DXGI_QUERY_VIDEO_MEMORY_INFO* pVideoMemoryInfo) const; ComPtr mDevice; ComPtr mAdapter; diff --git a/src/tests/BUILD.gn b/src/tests/BUILD.gn index d59ba5b4c..e89c853c5 100644 --- a/src/tests/BUILD.gn +++ b/src/tests/BUILD.gn @@ -117,6 +117,7 @@ test("gpgmm_unittests") { "unittests/SegmentedMemoryAllocatorTests.cpp", "unittests/SlabBlockAllocatorTests.cpp", "unittests/SlabMemoryAllocatorTests.cpp", + "unittests/UtilsTest.cpp", ] # When building inside Chromium, use their gtest main function because it is diff --git a/src/tests/unittests/UtilsTest.cpp b/src/tests/unittests/UtilsTest.cpp new file mode 100644 index 000000000..84c71ea79 --- /dev/null +++ b/src/tests/unittests/UtilsTest.cpp @@ -0,0 +1,23 @@ +// Copyright 2021 The GPGMM Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "gpgmm/common/Utils.h" + +using namespace gpgmm; + +TEST(UtilsTest, ConcatString) { + EXPECT_TRUE(ToString("This ", "is ", "a ", "sentance") == std::string("This is a sentance")); +}