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