| Index: content/common/gpu/gpu_memory_manager.cc
|
| diff --git a/content/common/gpu/gpu_memory_manager.cc b/content/common/gpu/gpu_memory_manager.cc
|
| index 07a4d10782dc6521cfd449c9d0a82156ec00c0b6..89078e9b4fcea480a4c3ea98486b22c6b661bc5a 100644
|
| --- a/content/common/gpu/gpu_memory_manager.cc
|
| +++ b/content/common/gpu/gpu_memory_manager.cc
|
| @@ -151,23 +151,44 @@ uint64 GpuMemoryManager::GetMaximumClientAllocation() const {
|
| #endif
|
| }
|
|
|
| -uint64 GpuMemoryManager::CalcAvailableFromViewportArea(int viewport_area) {
|
| - // We can't query available GPU memory from the system on Android, but
|
| - // 18X the viewport and 50% of the dalvik heap size give us a good
|
| - // estimate of available GPU memory on a wide range of devices.
|
| - const int kViewportMultiplier = 18;
|
| - const unsigned int kComponentsPerPixel = 4; // GraphicsContext3D::RGBA
|
| - const unsigned int kBytesPerComponent = 1; // sizeof(GC3Dubyte)
|
| - uint64 viewport_limit = viewport_area * kViewportMultiplier *
|
| - kComponentsPerPixel *
|
| - kBytesPerComponent;
|
| +uint64 GpuMemoryManager::CalcAvailableFromDalvikHeap() {
|
| #if !defined(OS_ANDROID)
|
| - return viewport_limit;
|
| + CHECK(false);
|
| + return 0;
|
| #else
|
| + // We can't query available GPU memory from the system on Android,
|
| + // but the dalvik heap size give us a good estimate of available
|
| + // GPU memory on a wide range of devices.
|
| +
|
| + // The heap size tends to be about 1/4 of total ram on higher end
|
| + // devices, so we use 1/2 of that by default. For example both the
|
| + // Nexus 4/10 have 2GB of ram and 512MB Dalvik heap size. For lower
|
| + // end devices, 1/2 of the heap size can be too high, but this
|
| + // correlates well with having a small heap-growth-limit. So for
|
| + // devices with less ram, we factor in the growth limit.
|
| +
|
| + // This is the result of the calculation below:
|
| + // Droid DNA 1080P 128MB
|
| + // Nexus S 56MB
|
| + // Galaxy Nexus 112MB
|
| + // Nexus 4/10 256MB
|
| + // Xoom 88MB
|
| +
|
| static uint64 dalvik_limit = 0;
|
| - if (!dalvik_limit)
|
| - dalvik_limit = (base::SysInfo::DalvikHeapSizeMB() / 2) * 1024 * 1024;
|
| - return std::min(viewport_limit, dalvik_limit);
|
| + if (!dalvik_limit) {
|
| + uint64 heap_size = base::SysInfo::DalvikHeapSizeMB();
|
| + uint64 heap_growth = base::SysInfo::DalvikHeapGrowthLimitMB();
|
| + uint64 limit = 0;
|
| +
|
| + if (heap_size >= 350)
|
| + limit = heap_size / 2;
|
| + else
|
| + limit = (heap_size + (heap_growth * 2)) / 4;
|
| +
|
| + dalvik_limit = limit * 1024 * 1024;
|
| + }
|
| +
|
| + return dalvik_limit;
|
| #endif
|
| }
|
|
|
| @@ -219,7 +240,7 @@ void GpuMemoryManager::UpdateAvailableGpuMemory() {
|
| }
|
|
|
| #if defined(OS_ANDROID)
|
| - bytes_available_gpu_memory_ = CalcAvailableFromViewportArea(max_surface_area);
|
| + bytes_available_gpu_memory_ = CalcAvailableFromDalvikHeap();
|
| #else
|
| if (!bytes_min)
|
| return;
|
|
|