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
3 // found in the LICENSE file.
5 #ifndef CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_CLIENT_H_
6 #define CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_CLIENT_H_
10 #include "base/basictypes.h"
11 #include "content/common/content_export.h"
12 #include "gpu/command_buffer/common/gpu_memory_allocation.h"
13 #include "gpu/command_buffer/service/memory_tracking.h"
14 #include "ui/gfx/size.h"
18 class GpuMemoryManager;
19 class GpuMemoryTrackingGroup;
21 // The interface that the GPU memory manager uses to manipulate a client (to
22 // send it allocation information and query its properties).
23 class CONTENT_EXPORT GpuMemoryManagerClient {
25 virtual ~GpuMemoryManagerClient() {}
27 // Returns surface size.
28 virtual gfx::Size GetSurfaceSize() const = 0;
30 // Returns the memory tracker for this stub.
31 virtual gpu::gles2::MemoryTracker* GetMemoryTracker() const = 0;
33 // Sets buffer usage depending on Memory Allocation
34 virtual void SetMemoryAllocation(
35 const gpu::MemoryAllocation& allocation) = 0;
37 virtual void SuggestHaveFrontBuffer(bool suggest_have_frontbuffer) = 0;
39 // Returns in bytes the total amount of GPU memory for the GPU which this
40 // context is currently rendering on. Returns false if no extension exists
41 // to get the exact amount of GPU memory.
42 virtual bool GetTotalGpuMemory(uint64* bytes) = 0;
45 // The state associated with a GPU memory manager client. This acts as the
46 // handle through which the client interacts with the GPU memory manager.
47 class CONTENT_EXPORT GpuMemoryManagerClientState {
49 ~GpuMemoryManagerClientState();
50 void SetVisible(bool visible);
51 void SetManagedMemoryStats(const gpu::ManagedMemoryStats& stats);
54 friend class GpuMemoryManager;
56 GpuMemoryManagerClientState(GpuMemoryManager* memory_manager,
57 GpuMemoryManagerClient* client,
58 GpuMemoryTrackingGroup* tracking_group,
62 // The memory manager this client is hanging off of.
63 GpuMemoryManager* memory_manager_;
65 // The client to send allocations to.
66 GpuMemoryManagerClient* client_;
68 // The tracking group for this client.
69 GpuMemoryTrackingGroup* tracking_group_;
71 // Offscreen commandbuffers will not have a surface.
72 const bool has_surface_;
74 // Whether or not this client is visible.
77 // If the client has a surface, then this is an iterator in the
78 // clients_visible_mru_ if this client is visible and
79 // clients_nonvisible_mru_ if this is non-visible. Otherwise this is an
80 // iterator in clients_nonsurface_.
81 std::list<GpuMemoryManagerClientState*>::iterator list_iterator_;
82 bool list_iterator_valid_;
84 // Statistics about memory usage.
85 gpu::ManagedMemoryStats managed_memory_stats_;
86 bool managed_memory_stats_received_;
88 // When managed_memory_stats_.bytes_nicetohave leaves the range
89 // [low_, high_], then re-adjust memory limits.
90 uint64 bytes_nicetohave_limit_low_;
91 uint64 bytes_nicetohave_limit_high_;
93 // The allocation for this client, used transiently during memory policy
95 uint64 bytes_allocation_when_visible_;
97 // The ideal allocation for this client for three performance levels, used
98 // transiently during memory policy calculation.
99 uint64 bytes_allocation_ideal_nicetohave_;
100 uint64 bytes_allocation_ideal_required_;
101 uint64 bytes_allocation_ideal_minimum_;
103 // Set to disable allocating a frontbuffer or to disable allocations
104 // for clients that don't have surfaces.
108 } // namespace content
110 #endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_CLIENT_H_