15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_vector.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_memory_allocation.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_memory_manager.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/gpu_memory_manager_client.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/command_buffer_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_scheduler.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder_config.h"
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/latency_info.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h"
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct Mailbox;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageManager;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MailboxManager;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannel;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuVideoDecodeAccelerator;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuWatchdog;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuCommandBufferStub
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public GpuMemoryManagerClient,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public IPC::Listener,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public IPC::Sender,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<GpuCommandBufferStub> {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class DestructionObserver {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called in Destroy(), before the context/surface are released.
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnWillDestroyStub() = 0;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~DestructionObserver() {}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(const ui::LatencyInfo&)>
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LatencyInfoCallback;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuCommandBufferStub(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuChannel* channel,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuCommandBufferStub* share_group,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::GLSurfaceHandle& handle,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gpu::gles2::MailboxManager* mailbox_manager,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gpu::gles2::ImageManager* image_manager,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gpu::gles2::DisallowedFeatures& disallowed_features,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& allowed_extensions,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int32>& attribs,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GpuPreference gpu_preference,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool use_virtualized_gl_context,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 route_id,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 surface_id,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuWatchdog* watchdog,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool software,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& active_url);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuCommandBufferStub();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GpuMemoryManagerClient implementation:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Size GetSurfaceSize() const OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gpu::gles2::MemoryTracker* GetMemoryTracker() const OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetMemoryAllocation(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GpuMemoryAllocation& allocation) OVERRIDE;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetTotalGpuMemory(uint64* bytes) OVERRIDE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this command buffer can currently handle IPC messages.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScheduled();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the command buffer is pre-empted and cannot process commands.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsPreempted() const {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scheduler_.get() && scheduler_->IsPreempted();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether there are commands in the buffer that haven't been processed.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasUnprocessedCommands();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Decoder* decoder() const { return decoder_.get(); }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::GpuScheduler* scheduler() const { return scheduler_.get(); }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannel* channel() const { return channel_; }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Identifies the target surface.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 surface_id() const { return surface_id_; }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Identifies the various GpuCommandBufferStubs in the GPU process belonging
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the same renderer process.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 route_id() const { return route_id_; }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GpuPreference gpu_preference() { return gpu_preference_; }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a message to the console.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendConsoleMessage(int32 id, const std::string& message);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendCachedShader(const std::string& key, const std::string& shader);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::GLSurface* surface() const { return surface_.get(); }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDestructionObserver(DestructionObserver* observer);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveDestructionObserver(DestructionObserver* observer);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Associates a sync point to this stub. When the stub is destroyed, it will
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // retire all sync points that haven't been previously retired.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSyncPoint(uint32 sync_point);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetPreemptByFlag(scoped_refptr<gpu::PreemptionFlag> flag);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetLatencyInfoCallback(const LatencyInfoCallback& callback);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void MarkContextLost();
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuMemoryManager* GetMemoryManager();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MakeCurrent();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cleans up and sends reply if OnInitialize failed.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInitializeFailed(IPC::Message* reply_message);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers:
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnInitialize(base::SharedMemoryHandle shared_state_shm,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    IPC::Message* reply_message);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetGetBuffer(int32 shm_id, IPC::Message* reply_message);
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void OnProduceFrontBuffer(const gpu::Mailbox& mailbox);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetState(IPC::Message* reply_message);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetStateFast(IPC::Message* reply_message);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAsyncFlush(int32 put_offset, uint32 flush_count);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEcho(const IPC::Message& message);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRescheduled();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnRegisterTransferBuffer(int32 id,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                base::SharedMemoryHandle transfer_buffer,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                uint32 size);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnDestroyTransferBuffer(int32 id);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetTransferBuffer(int32 id, IPC::Message* reply_message);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateVideoDecoder(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::VideoCodecProfile profile,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IPC::Message* reply_message);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetSurfaceVisible(bool visible);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDiscardBackbuffer();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEnsureBackbuffer();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRetireSyncPoint(uint32 sync_point);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool OnWaitSyncPoint(uint32 sync_point);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSyncPointRetired();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSignalSyncPoint(uint32 sync_point, uint32 id);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSignalSyncPointAck(uint32 id);
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnSignalQuery(uint32 query, uint32 id);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnReceivedClientManagedMemoryStats(const GpuManagedMemoryStats& stats);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSetClientHasMemoryAllocationChangedCallback(bool has_callback);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCommandProcessed();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnParseError();
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnSetLatencyInfo(const ui::LatencyInfo& latency_info);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportState();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrapper for GpuScheduler::PutChanged that sets the crash report URL.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PutChanged();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Poll the command buffer to execute work.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PollWork();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this command buffer needs to be polled again in the future.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasMoreWork();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleDelayedWork(int64 delay);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool CheckContextLost();
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lifetime of objects of this class is managed by a GpuChannel. The
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GpuChannels destroy all the GpuCommandBufferStubs that they own when they
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are destroyed. So a raw pointer is safe.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannel* channel_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The group of contexts that share namespaces with this context.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gpu::gles2::ContextGroup> context_group_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GLSurfaceHandle handle_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size initial_size_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::DisallowedFeatures disallowed_features_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string allowed_extensions_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> requested_attribs_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GpuPreference gpu_preference_;
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_virtualized_gl_context_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 route_id_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 surface_id_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool software_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 last_flush_count_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::CommandBufferService> command_buffer_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::GpuScheduler> scheduler_;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLSurface> surface_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<GpuMemoryManagerClientState> memory_manager_client_state_;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The last memory allocation received from the GpuMemoryManager (used to
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // elide redundant work).
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool last_memory_allocation_valid_;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GpuMemoryAllocation last_memory_allocation_;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuWatchdog* watchdog_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<DestructionObserver> destruction_observers_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A queue of sync points associated with this stub.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<uint32> sync_points_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sync_point_wait_count_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool delayed_work_scheduled_;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint64 previous_messages_processed_;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks last_idle_time_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<gpu::PreemptionFlag> preemption_flag_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LatencyInfoCallback latency_info_callback_;
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL active_url_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t active_url_hash_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t total_gpu_memory_;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuCommandBufferStub);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
262