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