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_manager.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/gpu_memory_manager_client.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "gpu/command_buffer/common/gpu_memory_allocation.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"
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/latency_info.h"
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/gpu_memory_buffer.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h"
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct Mailbox;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
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;
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass GpuVideoEncodeAccelerator;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuWatchdog;
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct WaitForCommandState;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuCommandBufferStub
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public GpuMemoryManagerClient,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public IPC::Listener,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public IPC::Sender,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<GpuCommandBufferStub> {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class DestructionObserver {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called in Destroy(), before the context/surface are released.
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnWillDestroyStub() = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~DestructionObserver() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::Callback<void(const std::vector<ui::LatencyInfo>&)>
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LatencyInfoCallback;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuCommandBufferStub(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuChannel* channel,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GpuCommandBufferStub* share_group,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::GLSurfaceHandle& handle,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gpu::gles2::MailboxManager* mailbox_manager,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gpu::gles2::DisallowedFeatures& disallowed_features,
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(
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const gpu::MemoryAllocation& allocation) OVERRIDE;
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SuggestHaveFrontBuffer(bool suggest_have_frontbuffer) OVERRIDE;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetTotalGpuMemory(uint64* bytes) OVERRIDE;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this command buffer can currently handle IPC messages.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScheduled();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the command buffer is pre-empted and cannot process commands.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsPreempted() const {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scheduler_.get() && scheduler_->IsPreempted();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether there are commands in the buffer that haven't been processed.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasUnprocessedCommands();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::GLES2Decoder* decoder() const { return decoder_.get(); }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::GpuScheduler* scheduler() const { return scheduler_.get(); }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannel* channel() const { return channel_; }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Identifies the target surface.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 surface_id() const { return surface_id_; }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Identifies the various GpuCommandBufferStubs in the GPU process belonging
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the same renderer process.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 route_id() const { return route_id_; }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GpuPreference gpu_preference() { return gpu_preference_; }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int32 GetRequestedAttribute(int attr) const;
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a message to the console.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendConsoleMessage(int32 id, const std::string& message);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendCachedShader(const std::string& key, const std::string& shader);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::GLSurface* surface() const { return surface_.get(); }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDestructionObserver(DestructionObserver* observer);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveDestructionObserver(DestructionObserver* observer);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Associates a sync point to this stub. When the stub is destroyed, it will
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // retire all sync points that haven't been previously retired.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSyncPoint(uint32 sync_point);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetPreemptByFlag(scoped_refptr<gpu::PreemptionFlag> flag);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetLatencyInfoCallback(const LatencyInfoCallback& callback);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void MarkContextLost();
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  uint64 GetMemoryUsage() const;
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GpuMemoryManager* GetMemoryManager() const;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MakeCurrent();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cleans up and sends reply if OnInitialize failed.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInitializeFailed(IPC::Message* reply_message);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers:
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnInitialize(base::SharedMemoryHandle shared_state_shm,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    IPC::Message* reply_message);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetGetBuffer(int32 shm_id, IPC::Message* reply_message);
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void OnProduceFrontBuffer(const gpu::Mailbox& mailbox);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetState(IPC::Message* reply_message);
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnWaitForTokenInRange(int32 start,
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             int32 end,
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             IPC::Message* reply_message);
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnWaitForGetOffsetInRange(int32 start,
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 int32 end,
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                 IPC::Message* reply_message);
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnAsyncFlush(int32 put_offset, uint32 flush_count,
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const std::vector<ui::LatencyInfo>& latency_info);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEcho(const IPC::Message& message);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRescheduled();
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnRegisterTransferBuffer(int32 id,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                base::SharedMemoryHandle transfer_buffer,
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                uint32 size);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnDestroyTransferBuffer(int32 id);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetTransferBuffer(int32 id, IPC::Message* reply_message);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnCreateVideoDecoder(media::VideoCodecProfile profile,
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            int32 route_id,
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            IPC::Message* reply_message);
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnCreateVideoEncoder(media::VideoFrame::Format input_format,
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            const gfx::Size& input_visible_size,
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            media::VideoCodecProfile output_profile,
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            uint32 initial_bitrate,
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            int32 route_id,
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            IPC::Message* reply_message);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetSurfaceVisible(bool visible);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEnsureBackbuffer();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRetireSyncPoint(uint32 sync_point);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool OnWaitSyncPoint(uint32 sync_point);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSyncPointRetired();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSignalSyncPoint(uint32 sync_point, uint32 id);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSignalSyncPointAck(uint32 id);
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnSignalQuery(uint32 query, uint32 id);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSetClientHasMemoryAllocationChangedCallback(bool has_callback);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void OnRegisterGpuMemoryBuffer(int32 id,
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 gfx::GpuMemoryBufferHandle handle,
2021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 uint32 width,
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 uint32 height,
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                 uint32 internalformat);
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnUnregisterGpuMemoryBuffer(int32 id);
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCommandProcessed();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnParseError();
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnCreateStreamTexture(
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      uint32 texture_id, int32 stream_id, bool* succeeded);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportState();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrapper for GpuScheduler::PutChanged that sets the crash report URL.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PutChanged();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Poll the command buffer to execute work.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PollWork();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this command buffer needs to be polled again in the future.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasMoreWork();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleDelayedWork(int64 delay);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool CheckContextLost();
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void CheckCompleteWaits();
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lifetime of objects of this class is managed by a GpuChannel. The
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GpuChannels destroy all the GpuCommandBufferStubs that they own when they
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are destroyed. So a raw pointer is safe.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannel* channel_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The group of contexts that share namespaces with this context.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gpu::gles2::ContextGroup> context_group_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GLSurfaceHandle handle_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size initial_size_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::DisallowedFeatures disallowed_features_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int32> requested_attribs_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GpuPreference gpu_preference_;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool use_virtualized_gl_context_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 route_id_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 surface_id_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool software_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 last_flush_count_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::CommandBufferService> command_buffer_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::GpuScheduler> scheduler_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLSurface> surface_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<GpuMemoryManagerClientState> memory_manager_client_state_;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The last memory allocation received from the GpuMemoryManager (used to
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // elide redundant work).
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool last_memory_allocation_valid_;
2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gpu::MemoryAllocation last_memory_allocation_;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuWatchdog* watchdog_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<DestructionObserver> destruction_observers_;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A queue of sync points associated with this stub.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<uint32> sync_points_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sync_point_wait_count_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool delayed_work_scheduled_;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint64 previous_messages_processed_;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks last_idle_time_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<gpu::PreemptionFlag> preemption_flag_;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LatencyInfoCallback latency_info_callback_;
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL active_url_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t active_url_hash_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t total_gpu_memory_;
278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<WaitForCommandState> wait_for_token_;
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<WaitForCommandState> wait_for_get_offset_;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuCommandBufferStub);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_GPU_COMMAND_BUFFER_STUB_H_
287