12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_CLIENT_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_CLIENT_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/content_export.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "gpu/command_buffer/common/gpu_memory_allocation.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/memory_tracking.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GpuMemoryManager; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GpuMemoryTrackingGroup; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The interface that the GPU memory manager uses to manipulate a client (to 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// send it allocation information and query its properties). 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT GpuMemoryManagerClient { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GpuMemoryManagerClient() {} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns surface size. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetSurfaceSize() const = 0; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the memory tracker for this stub. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gpu::gles2::MemoryTracker* GetMemoryTracker() const = 0; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets buffer usage depending on Memory Allocation 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetMemoryAllocation( 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gpu::MemoryAllocation& allocation) = 0; 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SuggestHaveFrontBuffer(bool suggest_have_frontbuffer) = 0; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns in bytes the total amount of GPU memory for the GPU which this 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // context is currently rendering on. Returns false if no extension exists 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to get the exact amount of GPU memory. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetTotalGpuMemory(uint64* bytes) = 0; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The state associated with a GPU memory manager client. This acts as the 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// handle through which the client interacts with the GPU memory manager. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CONTENT_EXPORT GpuMemoryManagerClientState { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~GpuMemoryManagerClientState(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetVisible(bool visible); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class GpuMemoryManager; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuMemoryManagerClientState(GpuMemoryManager* memory_manager, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuMemoryManagerClient* client, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuMemoryTrackingGroup* tracking_group, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_surface, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The memory manager this client is hanging off of. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuMemoryManager* memory_manager_; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The client to send allocations to. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuMemoryManagerClient* client_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The tracking group for this client. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuMemoryTrackingGroup* tracking_group_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Offscreen commandbuffers will not have a surface. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool has_surface_; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether or not this client is visible. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the client has a surface, then this is an iterator in the 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // clients_visible_mru_ if this client is visible and 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // clients_nonvisible_mru_ if this is non-visible. Otherwise this is an 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // iterator in clients_nonsurface_. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<GpuMemoryManagerClientState*>::iterator list_iterator_; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool list_iterator_valid_; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set to disable allocating a frontbuffer or to disable allocations 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for clients that don't have surfaces. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool hibernated_; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_COMMON_GPU_GPU_MEMORY_MANAGER_CLIENT_H_ 91