blob: af78f577d1c3f5b561e1d4d98fe930519fdaa011 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_
#define CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_
#if defined(ENABLE_GPU)
#include <set>
#include <vector>
#include "base/basictypes.h"
#include "base/cancelable_callback.h"
#include "base/hash_tables.h"
#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "content/common/gpu/gpu_memory_allocation.h"
#include "content/public/common/gpu_memory_stats.h"
#include "ui/gfx/size.h"
class GpuCommandBufferStubBase;
class GpuMemoryTrackingGroup;
#if defined(COMPILER_GCC)
namespace BASE_HASH_NAMESPACE {
template<>
struct hash<GpuCommandBufferStubBase*> {
size_t operator()(GpuCommandBufferStubBase* ptr) const {
return hash<size_t>()(reinterpret_cast<size_t>(ptr));
}
};
} // namespace BASE_HASH_NAMESPACE
#endif // COMPILER
class CONTENT_EXPORT GpuMemoryManagerClient {
public:
virtual ~GpuMemoryManagerClient() {}
virtual void AppendAllCommandBufferStubs(
std::vector<GpuCommandBufferStubBase*>& stubs) = 0;
};
class CONTENT_EXPORT GpuMemoryManager :
public base::SupportsWeakPtr<GpuMemoryManager> {
public:
enum { kDefaultMaxSurfacesWithFrontbufferSoftLimit = 8 };
// StubMemoryStat is used to store memory-allocation-related information about
// a GpuCommandBufferStubBase for some time point.
struct StubMemoryStat {
bool visible;
GpuMemoryAllocationRequest requested_allocation;
GpuMemoryAllocation allocation;
};
GpuMemoryManager(GpuMemoryManagerClient* client,
size_t max_surfaces_with_frontbuffer_soft_limit);
~GpuMemoryManager();
// Schedule a Manage() call. If immediate is true, we PostTask without delay.
// Otherwise PostDelayedTask using a CancelableClosure and allow multiple
// delayed calls to "queue" up. This way, we do not spam clients in certain
// lower priority situations. An immediate schedule manage will cancel any
// queued delayed manage.
void ScheduleManage(bool immediate);
// Retrieve GPU Resource consumption statistics for the task manager
void GetVideoMemoryUsageStats(
content::GPUVideoMemoryUsageStats& video_memory_usage_stats) const;
// Add and remove structures to track context groups' memory consumption
void AddTrackingGroup(GpuMemoryTrackingGroup* tracking_group);
void RemoveTrackingGroup(GpuMemoryTrackingGroup* tracking_group);
// Returns StubMemoryStat's for each GpuCommandBufferStubBase, which were
// assigned during the most recent call to Manage().
// Useful for tracking the memory-allocation-related presumed state of the
// system, as seen by GpuMemoryManager.
typedef base::hash_map<GpuCommandBufferStubBase*, StubMemoryStat>
StubMemoryStatMap;
const StubMemoryStatMap& stub_memory_stats_for_last_manage() const {
return stub_memory_stats_for_last_manage_;
}
// Track a change in memory allocated by any context
void TrackMemoryAllocatedChange(size_t old_size, size_t new_size);
private:
friend class GpuMemoryManagerTest;
void Manage();
// The context groups' tracking structures
std::set<GpuMemoryTrackingGroup*> tracking_groups_;
size_t CalculateBonusMemoryAllocationBasedOnSize(gfx::Size size) const;
size_t GetAvailableGpuMemory() const {
return bytes_available_gpu_memory_;
}
// The maximum amount of memory that a tab may be assigned
size_t GetMaximumTabAllocation() const {
#if defined(OS_CHROMEOS)
return bytes_available_gpu_memory_;
#else
return 128 * 1024 * 1024;
#endif
}
// The minimum non-zero amount of memory that a tab may be assigned
size_t GetMinimumTabAllocation() const {
#if defined(OS_ANDROID)
return 32 * 1024 * 1024;
#else
return 64 * 1024 * 1024;
#endif
}
class CONTENT_EXPORT StubWithSurfaceComparator {
public:
bool operator()(GpuCommandBufferStubBase* lhs,
GpuCommandBufferStubBase* rhs);
};
GpuMemoryManagerClient* client_;
base::CancelableClosure delayed_manage_callback_;
bool manage_immediate_scheduled_;
size_t max_surfaces_with_frontbuffer_soft_limit_;
StubMemoryStatMap stub_memory_stats_for_last_manage_;
// The maximum amount of memory that may be allocated for GPU resources
size_t bytes_available_gpu_memory_;
// The current total memory usage, and historical maximum memory usage
size_t bytes_allocated_current_;
size_t bytes_allocated_historical_max_;
DISALLOW_COPY_AND_ASSIGN(GpuMemoryManager);
};
#endif
#endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_H_