Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: content/common/gpu/gpu_memory_manager_unittest.cc

Issue 12212143: Distribute extra memory evenly among visible clients (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: One more missed test Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/common/gpu/gpu_memory_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/gpu/gpu_memory_allocation.h" 5 #include "content/common/gpu/gpu_memory_allocation.h"
6 #include "content/common/gpu/gpu_memory_manager.h" 6 #include "content/common/gpu/gpu_memory_manager.h"
7 #include "content/common/gpu/gpu_memory_manager_client.h" 7 #include "content/common/gpu/gpu_memory_manager_client.h"
8 #include "content/common/gpu/gpu_memory_tracking.h" 8 #include "content/common/gpu/gpu_memory_tracking.h"
9 #include "ui/gfx/size_conversions.h" 9 #include "ui/gfx/size_conversions.h"
10 10
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 stub1.BytesWhenNotVisible()); 776 stub1.BytesWhenNotVisible());
777 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 777 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(),
778 stub2.BytesWhenNotVisible()); 778 stub2.BytesWhenNotVisible());
779 } 779 }
780 780
781 // Test GpuMemoryManager's background MRU behavior 781 // Test GpuMemoryManager's background MRU behavior
782 TEST_F(GpuMemoryManagerTest, TestBackgroundMru) { 782 TEST_F(GpuMemoryManagerTest, TestBackgroundMru) {
783 memmgr_.TestingSetAvailableGpuMemory(64); 783 memmgr_.TestingSetAvailableGpuMemory(64);
784 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16); 784 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16);
785 785
786 uint64 bytes_when_not_visible_expected =
787 memmgr_.GetCurrentNonvisibleAvailableGpuMemory();
788 #if defined (OS_ANDROID)
789 bytes_when_not_visible_expected = 0;
790 #endif
791
786 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true); 792 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true);
787 FakeClient stub2(&memmgr_, GenerateUniqueSurfaceId(), true); 793 FakeClient stub2(&memmgr_, GenerateUniqueSurfaceId(), true);
788 FakeClient stub3(&memmgr_, GenerateUniqueSurfaceId(), true); 794 FakeClient stub3(&memmgr_, GenerateUniqueSurfaceId(), true);
789 795
790 // When all are visible, they should all be allowed to have memory 796 // When all are visible, they should all be allowed to have memory
791 // should they become nonvisible. 797 // should they become nonvisible.
792 stub1.SetManagedMemoryStats(GpuManagedMemoryStats(7, 24, 7, false)); 798 stub1.SetManagedMemoryStats(GpuManagedMemoryStats(7, 24, 7, false));
793 stub2.SetManagedMemoryStats(GpuManagedMemoryStats(7, 24, 7, false)); 799 stub2.SetManagedMemoryStats(GpuManagedMemoryStats(7, 24, 7, false));
794 stub3.SetManagedMemoryStats(GpuManagedMemoryStats(7, 24, 7, false)); 800 stub3.SetManagedMemoryStats(GpuManagedMemoryStats(7, 24, 7, false));
795 Manage(); 801 Manage();
796 EXPECT_EQ(memmgr_.bytes_nonvisible_available_gpu_memory_, 802 EXPECT_EQ(memmgr_.bytes_nonvisible_available_gpu_memory_,
797 memmgr_.GetCurrentNonvisibleAvailableGpuMemory()); 803 memmgr_.GetCurrentNonvisibleAvailableGpuMemory());
798 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 804 EXPECT_EQ(stub1.BytesWhenNotVisible(),
799 stub1.BytesWhenNotVisible()); 805 bytes_when_not_visible_expected);
800 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 806 EXPECT_EQ(stub2.BytesWhenNotVisible(),
801 stub2.BytesWhenNotVisible()); 807 bytes_when_not_visible_expected);
802 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 808 EXPECT_EQ(stub3.BytesWhenNotVisible(),
803 stub3.BytesWhenNotVisible()); 809 bytes_when_not_visible_expected);
804
805 810
806 // Background stubs 1 and 2, and they should fit 811 // Background stubs 1 and 2, and they should fit
807 stub2.SetVisible(false); 812 stub2.SetVisible(false);
808 stub1.SetVisible(false); 813 stub1.SetVisible(false);
809 Manage(); 814 Manage();
810 EXPECT_EQ(memmgr_.bytes_nonvisible_available_gpu_memory_, 815 EXPECT_EQ(memmgr_.bytes_nonvisible_available_gpu_memory_,
811 memmgr_.GetCurrentNonvisibleAvailableGpuMemory()); 816 bytes_when_not_visible_expected);
812 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 817 EXPECT_EQ(stub1.BytesWhenNotVisible(),
813 stub1.BytesWhenNotVisible()); 818 bytes_when_not_visible_expected);
814 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 819 EXPECT_EQ(stub2.BytesWhenNotVisible(),
815 stub2.BytesWhenNotVisible()); 820 bytes_when_not_visible_expected);
816 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 821 EXPECT_EQ(stub3.BytesWhenNotVisible(),
817 stub3.BytesWhenNotVisible()); 822 bytes_when_not_visible_expected);
818 823
819 // Now background stub 3, and it should cause stub 2 to be 824 // Now background stub 3, and it should cause stub 2 to be
820 // evicted because it was set non-visible first 825 // evicted because it was set non-visible first
821 stub3.SetVisible(false); 826 stub3.SetVisible(false);
822 Manage(); 827 Manage();
823 EXPECT_EQ(memmgr_.bytes_nonvisible_available_gpu_memory_, 828 EXPECT_EQ(memmgr_.bytes_nonvisible_available_gpu_memory_,
824 memmgr_.GetCurrentNonvisibleAvailableGpuMemory()); 829 memmgr_.GetCurrentNonvisibleAvailableGpuMemory());
825 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 830 EXPECT_EQ(stub1.BytesWhenNotVisible(),
826 stub1.BytesWhenNotVisible()); 831 bytes_when_not_visible_expected);
827 EXPECT_EQ(0ul, 832 EXPECT_EQ(stub2.BytesWhenNotVisible(),
828 stub2.BytesWhenNotVisible()); 833 0ul);
829 EXPECT_EQ(memmgr_.GetCurrentNonvisibleAvailableGpuMemory(), 834 EXPECT_EQ(stub3.BytesWhenNotVisible(),
830 stub3.BytesWhenNotVisible()); 835 bytes_when_not_visible_expected);
831 } 836 }
832 837
833 // Test GpuMemoryManager's tracking of unmanaged (e.g, WebGL) memory. 838 // Test GpuMemoryManager's tracking of unmanaged (e.g, WebGL) memory.
834 TEST_F(GpuMemoryManagerTest, TestUnmanagedTracking) { 839 TEST_F(GpuMemoryManagerTest, TestUnmanagedTracking) {
835 memmgr_.TestingSetAvailableGpuMemory(64); 840 memmgr_.TestingSetAvailableGpuMemory(64);
836 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16); 841 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16);
837 memmgr_.TestingSetUnmanagedLimitStep(16); 842 memmgr_.TestingSetUnmanagedLimitStep(16);
838 memmgr_.TestingSetMinimumClientAllocation(8); 843 memmgr_.TestingSetMinimumClientAllocation(8);
839 844
840 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true); 845 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 892
888 // Test nonvisible MRU behavior (the most recently used nonvisible clients 893 // Test nonvisible MRU behavior (the most recently used nonvisible clients
889 // keep their contents). 894 // keep their contents).
890 TEST_F(GpuMemoryManagerTestNonuniform, BackgroundMru) { 895 TEST_F(GpuMemoryManagerTestNonuniform, BackgroundMru) {
891 // Set memory manager constants for this test 896 // Set memory manager constants for this test
892 memmgr_.TestingSetUseNonuniformMemoryPolicy(true); 897 memmgr_.TestingSetUseNonuniformMemoryPolicy(true);
893 memmgr_.TestingSetAvailableGpuMemory(64); 898 memmgr_.TestingSetAvailableGpuMemory(64);
894 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16); 899 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16);
895 memmgr_.TestingSetMinimumClientAllocation(8); 900 memmgr_.TestingSetMinimumClientAllocation(8);
896 901
902 uint64 bytes_when_not_visible_expected = 6u;
903 #if defined (OS_ANDROID)
904 bytes_when_not_visible_expected = 0;
905 #endif
906
897 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true); 907 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true);
898 FakeClient stub2(&memmgr_, GenerateUniqueSurfaceId(), true); 908 FakeClient stub2(&memmgr_, GenerateUniqueSurfaceId(), true);
899 FakeClient stub3(&memmgr_, GenerateUniqueSurfaceId(), true); 909 FakeClient stub3(&memmgr_, GenerateUniqueSurfaceId(), true);
900 910
901 // When all are visible, they should all be allowed to have memory 911 // When all are visible, they should all be allowed to have memory
902 // should they become nonvisible. 912 // should they become nonvisible.
903 SetClientStats(&stub1, 6, 23); 913 SetClientStats(&stub1, 6, 23);
904 SetClientStats(&stub2, 6, 23); 914 SetClientStats(&stub2, 6, 23);
905 SetClientStats(&stub3, 6, 23); 915 SetClientStats(&stub3, 6, 23);
906 Manage(); 916 Manage();
907 EXPECT_GE(stub1.BytesWhenVisible(), 20u); 917 EXPECT_GE(stub1.BytesWhenVisible(), 20u);
908 EXPECT_GE(stub2.BytesWhenVisible(), 20u); 918 EXPECT_GE(stub2.BytesWhenVisible(), 20u);
909 EXPECT_GE(stub3.BytesWhenVisible(), 20u); 919 EXPECT_GE(stub3.BytesWhenVisible(), 20u);
910 EXPECT_LT(stub1.BytesWhenVisible(), 22u); 920 EXPECT_LT(stub1.BytesWhenVisible(), 22u);
911 EXPECT_LT(stub2.BytesWhenVisible(), 22u); 921 EXPECT_LT(stub2.BytesWhenVisible(), 22u);
912 EXPECT_LT(stub3.BytesWhenVisible(), 22u); 922 EXPECT_LT(stub3.BytesWhenVisible(), 22u);
913 EXPECT_GE(stub1.BytesWhenNotVisible(), 6u); 923 EXPECT_GE(stub1.BytesWhenNotVisible(), bytes_when_not_visible_expected);
914 EXPECT_GE(stub2.BytesWhenNotVisible(), 6u); 924 EXPECT_GE(stub2.BytesWhenNotVisible(), bytes_when_not_visible_expected);
915 EXPECT_GE(stub3.BytesWhenNotVisible(), 6u); 925 EXPECT_GE(stub3.BytesWhenNotVisible(), bytes_when_not_visible_expected);
916 926
917 // Background stubs 1 and 2, and they should fit. All stubs should 927 // Background stubs 1 and 2, and they should fit. All stubs should
918 // have their full nicetohave budget should they become visible. 928 // have their full nicetohave budget should they become visible.
919 stub2.SetVisible(false); 929 stub2.SetVisible(false);
920 stub1.SetVisible(false); 930 stub1.SetVisible(false);
921 Manage(); 931 Manage();
922 EXPECT_GE(stub1.BytesWhenVisible(), 23u); 932 EXPECT_GE(stub1.BytesWhenVisible(), 23u);
923 EXPECT_GE(stub2.BytesWhenVisible(), 23u); 933 EXPECT_GE(stub2.BytesWhenVisible(), 23u);
924 EXPECT_GE(stub3.BytesWhenVisible(), 23u); 934 EXPECT_GE(stub3.BytesWhenVisible(), 23u);
925 EXPECT_LT(stub1.BytesWhenVisible(), 32u); 935 EXPECT_LT(stub1.BytesWhenVisible(), 32u);
926 EXPECT_LT(stub2.BytesWhenVisible(), 32u); 936 EXPECT_LT(stub2.BytesWhenVisible(), 32u);
927 EXPECT_LT(stub3.BytesWhenVisible(), 32u); 937 EXPECT_GE(stub1.BytesWhenNotVisible(), bytes_when_not_visible_expected);
928 EXPECT_GE(stub1.BytesWhenNotVisible(), 6u); 938 EXPECT_GE(stub2.BytesWhenNotVisible(), bytes_when_not_visible_expected);
929 EXPECT_GE(stub2.BytesWhenNotVisible(), 6u); 939 EXPECT_GE(stub3.BytesWhenNotVisible(), bytes_when_not_visible_expected);
930 EXPECT_GE(stub3.BytesWhenNotVisible(), 6u);
931 940
932 // Now background stub 3, and it should cause stub 2 to be 941 // Now background stub 3, and it should cause stub 2 to be
933 // evicted because it was set non-visible first 942 // evicted because it was set non-visible first
934 stub3.SetVisible(false); 943 stub3.SetVisible(false);
935 Manage(); 944 Manage();
936 EXPECT_GE(stub1.BytesWhenNotVisible(), 6u); 945 EXPECT_GE(stub1.BytesWhenNotVisible(), bytes_when_not_visible_expected);
937 EXPECT_EQ(stub2.BytesWhenNotVisible(), 0u); 946 EXPECT_EQ(stub2.BytesWhenNotVisible(), 0u);
938 EXPECT_GE(stub3.BytesWhenNotVisible(), 6u); 947 EXPECT_GE(stub3.BytesWhenNotVisible(), bytes_when_not_visible_expected);
939 } 948 }
940 949
941 // Test that once a backgrounded client has dropped its resources, it 950 // Test that once a backgrounded client has dropped its resources, it
942 // doesn't get them back until it becomes visible again. 951 // doesn't get them back until it becomes visible again.
943 TEST_F(GpuMemoryManagerTestNonuniform, BackgroundDiscardPersistent) { 952 TEST_F(GpuMemoryManagerTestNonuniform, BackgroundDiscardPersistent) {
944 // Set memory manager constants for this test 953 // Set memory manager constants for this test
945 memmgr_.TestingSetUseNonuniformMemoryPolicy(true); 954 memmgr_.TestingSetUseNonuniformMemoryPolicy(true);
946 memmgr_.TestingSetAvailableGpuMemory(64); 955 memmgr_.TestingSetAvailableGpuMemory(64);
947 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16); 956 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16);
948 memmgr_.TestingSetMinimumClientAllocation(8); 957 memmgr_.TestingSetMinimumClientAllocation(8);
949 958
959 uint64 bytes_when_not_visible_expected = 10ul;
960 #if defined (OS_ANDROID)
961 bytes_when_not_visible_expected = 0;
962 #endif
963
950 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true); 964 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true);
951 FakeClient stub2(&memmgr_, GenerateUniqueSurfaceId(), true); 965 FakeClient stub2(&memmgr_, GenerateUniqueSurfaceId(), true);
952 966
953 // Both clients should be able to keep their contents should one of 967 // Both clients should be able to keep their contents should one of
954 // them become nonvisible. 968 // them become nonvisible.
955 SetClientStats(&stub1, 10, 20); 969 SetClientStats(&stub1, 10, 20);
956 SetClientStats(&stub2, 10, 20); 970 SetClientStats(&stub2, 10, 20);
957 Manage(); 971 Manage();
958 EXPECT_GE(stub1.BytesWhenNotVisible(), 10u); 972 EXPECT_GE(stub1.BytesWhenNotVisible(), bytes_when_not_visible_expected);
959 EXPECT_GE(stub2.BytesWhenNotVisible(), 10u); 973 EXPECT_GE(stub2.BytesWhenNotVisible(), bytes_when_not_visible_expected);
960 974
961 // If they both go nonvisible, then only the most recently used client 975 // If they both go nonvisible, then only the most recently used client
962 // should keep its contents. 976 // should keep its contents.
963 stub1.SetVisible(false); 977 stub1.SetVisible(false);
964 stub2.SetVisible(false); 978 stub2.SetVisible(false);
965 Manage(); 979 Manage();
966 EXPECT_EQ(stub1.BytesWhenNotVisible(), 0u); 980 EXPECT_EQ(stub1.BytesWhenNotVisible(), 0u);
967 EXPECT_GE(stub2.BytesWhenNotVisible(), 10u); 981 EXPECT_GE(stub2.BytesWhenNotVisible(), bytes_when_not_visible_expected);
968 982
969 // When becoming visible, stub 2 should get its contents back, and 983 // When becoming visible, stub 2 should get its contents back, and
970 // retain them next time it is made nonvisible. 984 // retain them next time it is made nonvisible.
971 stub2.SetVisible(true); 985 stub2.SetVisible(true);
972 Manage(); 986 Manage();
973 EXPECT_GE(stub2.BytesWhenNotVisible(), 10u); 987 EXPECT_GE(stub2.BytesWhenNotVisible(), bytes_when_not_visible_expected);
974 stub2.SetVisible(false); 988 stub2.SetVisible(false);
975 Manage(); 989 Manage();
976 EXPECT_GE(stub2.BytesWhenNotVisible(), 10u); 990 EXPECT_GE(stub2.BytesWhenNotVisible(), bytes_when_not_visible_expected);
977 } 991 }
978 992
979 // Test tracking of unmanaged (e.g, WebGL) memory. 993 // Test tracking of unmanaged (e.g, WebGL) memory.
980 TEST_F(GpuMemoryManagerTestNonuniform, UnmanagedTracking) { 994 TEST_F(GpuMemoryManagerTestNonuniform, UnmanagedTracking) {
981 // Set memory manager constants for this test 995 // Set memory manager constants for this test
982 memmgr_.TestingSetUseNonuniformMemoryPolicy(true); 996 memmgr_.TestingSetUseNonuniformMemoryPolicy(true);
983 memmgr_.TestingSetAvailableGpuMemory(64); 997 memmgr_.TestingSetAvailableGpuMemory(64);
984 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16); 998 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16);
985 memmgr_.TestingSetMinimumClientAllocation(8); 999 memmgr_.TestingSetMinimumClientAllocation(8);
986 memmgr_.TestingSetUnmanagedLimitStep(16); 1000 memmgr_.TestingSetUnmanagedLimitStep(16);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 TEST_F(GpuMemoryManagerTestNonuniform, DefaultAllocation) { 1048 TEST_F(GpuMemoryManagerTestNonuniform, DefaultAllocation) {
1035 // Set memory manager constants for this test 1049 // Set memory manager constants for this test
1036 memmgr_.TestingSetUseNonuniformMemoryPolicy(true); 1050 memmgr_.TestingSetUseNonuniformMemoryPolicy(true);
1037 memmgr_.TestingSetAvailableGpuMemory(64); 1051 memmgr_.TestingSetAvailableGpuMemory(64);
1038 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16); 1052 memmgr_.TestingSetNonvisibleAvailableGpuMemory(16);
1039 memmgr_.TestingSetMinimumClientAllocation(8); 1053 memmgr_.TestingSetMinimumClientAllocation(8);
1040 memmgr_.TestingSetDefaultClientAllocation(16); 1054 memmgr_.TestingSetDefaultClientAllocation(16);
1041 1055
1042 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true); 1056 FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true);
1043 1057
1044 // Expect that a client which has not sent stats receive the 1058 // Expect that a client which has not sent stats receive at
1045 // default allocation. 1059 // least the default allocation.
1046 Manage(); 1060 Manage();
1047 EXPECT_EQ(stub1.BytesWhenVisible(), 1061 EXPECT_GE(stub1.BytesWhenVisible(),
1048 memmgr_.GetDefaultClientAllocation()); 1062 memmgr_.GetDefaultClientAllocation());
1049 EXPECT_EQ(stub1.BytesWhenNotVisible(), 0u); 1063 EXPECT_EQ(stub1.BytesWhenNotVisible(), 0u);
1050 } 1064 }
1051 1065
1052 } // namespace content 1066 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/gpu_memory_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698