gpu_command_buffer_stub.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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)#include "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/hash.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/gpu/devtools_gpu_instrumentation.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_channel.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_channel_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_command_buffer_stub.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_memory_manager.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_memory_tracking.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_messages.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_watchdog.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/image_transport_surface.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/media/gpu_video_decode_accelerator.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/sync_point_manager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/constants.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/common/mailbox.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/gl_context_virtual.h" 29a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "gpu/command_buffer/service/gl_state_restorer_impl.h" 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_control_service.h" 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "gpu/command_buffer/service/image_manager.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/logger.h" 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/memory_tracking.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/service/query_manager.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/sandbox_init.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/gpu/stream_texture_android.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The GpuCommandBufferMemoryTracker class provides a bridge between the 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ContextGroup's memory type managers and the GpuMemoryManager class. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuCommandBufferMemoryTracker : public gpu::gles2::MemoryTracker { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit GpuCommandBufferMemoryTracker(GpuChannel* channel) : 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracking_group_(channel->gpu_channel_manager()->gpu_memory_manager()-> 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTrackingGroup(channel->renderer_pid(), this)) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TrackMemoryAllocatedChange( 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t old_size, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t new_size, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu::gles2::MemoryTracker::Pool pool) OVERRIDE { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracking_group_->TrackMemoryAllocatedChange( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) old_size, new_size, pool); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool EnsureGPUMemoryAvailable(size_t size_needed) OVERRIDE { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracking_group_->EnsureGPUMemoryAvailable(size_needed); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GpuCommandBufferMemoryTracker() { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<GpuMemoryTrackingGroup> tracking_group_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GpuCommandBufferMemoryTracker); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FastSetActiveURL will shortcut the expensive call to SetActiveURL when the 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// url_hash matches. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FastSetActiveURL(const GURL& url, size_t url_hash) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Leave the previously set URL in the empty case -- empty URLs are given by 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKitPlatformSupportImpl::createOffscreenGraphicsContext3D. Hopefully the 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // onscreen context URL was set previously and will show up even when a crash 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // occurs during offscreen command processing. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_empty()) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static size_t g_last_url_hash = 0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url_hash != g_last_url_hash) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_last_url_hash = url_hash; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetContentClient()->SetActiveURL(url); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The first time polling a fence, delay some extra time to allow other 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// stubs to process some work, or else the timing of the fences could 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allow a pattern of alternating fast and slow frames to occur. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kHandleMoreWorkPeriodMs = 2; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kHandleMoreWorkPeriodBusyMs = 1; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Prevents idle work from being starved. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int64 kMaxTimeSinceIdleMs = 10; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GpuCommandBufferStub::GpuCommandBufferStub( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannel* channel, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferStub* share_group, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::GLSurfaceHandle& handle, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::gles2::MailboxManager* mailbox_manager, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::gles2::ImageManager* image_manager, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gpu::gles2::DisallowedFeatures& disallowed_features, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int32>& attribs, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::GpuPreference gpu_preference, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool use_virtualized_gl_context, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 route_id, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 surface_id, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuWatchdog* watchdog, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool software, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& active_url) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : channel_(channel), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_(handle), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_size_(size), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disallowed_features_(disallowed_features), 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_attribs_(attribs), 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_preference_(gpu_preference), 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_virtualized_gl_context_(use_virtualized_gl_context), 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id_(route_id), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_id_(surface_id), 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) software_(software), 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_flush_count_(0), 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_memory_allocation_valid_(false), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watchdog_(watchdog), 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_point_wait_count_(0), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delayed_work_scheduled_(false), 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_messages_processed_(0), 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_url_(active_url), 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_gpu_memory_(0) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_url_hash_ = base::Hash(active_url.possibly_invalid_spec()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FastSetActiveURL(active_url_, active_url_hash_); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (share_group) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_group_ = share_group->context_group_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_group_ = new gpu::gles2::ContextGroup( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mailbox_manager, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_manager, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new GpuCommandBufferMemoryTracker(channel), 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NULL, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) use_virtualized_gl_context_ |= 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) context_group_->feature_info()->workarounds().use_virtualized_gl_contexts; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GpuCommandBufferStub::~GpuCommandBufferStub() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Destroy(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu_channel_manager->Send(new GpuHostMsg_DestroyCommandBuffer(surface_id())); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)GpuMemoryManager* GpuCommandBufferStub::GetMemoryManager() const { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return channel()->gpu_channel_manager()->gpu_memory_manager(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) { 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) devtools_gpu_instrumentation::ScopedGpuTask task(this); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FastSetActiveURL(active_url_, active_url_hash_); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the appropriate GL context is current before handling any IPC 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // messages directed at the command buffer. This ensures that the message 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handler can assume that the context is current (not necessary for 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Echo, RetireSyncPoint, or WaitSyncPoint). 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoder_.get() && 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.type() != GpuCommandBufferMsg_Echo::ID && 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) message.type() != GpuCommandBufferMsg_GetStateFast::ID && 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message.type() != GpuCommandBufferMsg_RetireSyncPoint::ID && 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message.type() != GpuCommandBufferMsg_SetLatencyInfo::ID) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!MakeCurrent()) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always use IPC_MESSAGE_HANDLER_DELAY_REPLY for synchronous message handlers 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here. This is so the reply can be delayed if the scheduler is unscheduled. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInitialize); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetGetBuffer); 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_ProduceFrontBuffer, 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnProduceFrontBuffer); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Echo, OnEcho); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetState, OnGetState); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetStateFast, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetStateFast); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetLatencyInfo, OnSetLatencyInfo); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_Rescheduled, OnRescheduled); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RegisterTransferBuffer, 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnRegisterTransferBuffer); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyTransferBuffer, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDestroyTransferBuffer); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetTransferBuffer, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetTransferBuffer); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_CreateVideoDecoder, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnCreateVideoDecoder) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SetSurfaceVisible, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetSurfaceVisible) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RetireSyncPoint, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRetireSyncPoint) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalSyncPoint, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSignalSyncPoint) 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SignalQuery, 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnSignalQuery) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_SendClientManagedMemoryStats, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnReceivedClientManagedMemoryStats) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferMsg_SetClientHasMemoryAllocationChangedCallback, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnSetClientHasMemoryAllocationChangedCallback) 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_RegisterGpuMemoryBuffer, 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnRegisterGpuMemoryBuffer); 2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_DestroyGpuMemoryBuffer, 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OnDestroyGpuMemoryBuffer); 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_CreateStreamTexture, 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnCreateStreamTexture) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that any delayed work that was created will be handled. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleDelayedWork(kHandleMoreWorkPeriodMs); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(handled); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuCommandBufferStub::Send(IPC::Message* message) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return channel_->Send(message); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuCommandBufferStub::IsScheduled() { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (!scheduler_.get() || scheduler_->IsScheduled()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuCommandBufferStub::HasMoreWork() { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scheduler_.get() && scheduler_->HasMoreWork(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::PollWork() { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::PollWork"); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delayed_work_scheduled_ = false; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FastSetActiveURL(active_url_, active_url_hash_); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoder_.get() && !MakeCurrent()) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (scheduler_) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fences_complete = scheduler_->PollUnscheduleFences(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Perform idle work if all fences are complete. 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fences_complete) { 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 current_messages_processed = 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel()->gpu_channel_manager()->MessagesProcessed(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We're idle when no messages were processed or scheduled. 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_idle = 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (previous_messages_processed_ == current_messages_processed) && 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !channel()->gpu_channel_manager()->HandleMessagesScheduled(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_idle && !last_idle_time_.is_null()) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta time_since_idle = base::TimeTicks::Now() - 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_idle_time_; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta max_time_since_idle = 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kMaxTimeSinceIdleMs); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force idle when it's been too long since last time we were idle. 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (time_since_idle > max_time_since_idle) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_idle = true; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_idle) { 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_idle_time_ = base::TimeTicks::Now(); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->PerformIdleWork(); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleDelayedWork(kHandleMoreWorkPeriodBusyMs); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuCommandBufferStub::HasUnprocessedCommands() { 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State state = command_buffer_->GetLastState(); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return state.put_offset != state.get_offset && 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !gpu::error::IsError(state.error); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::ScheduleDelayedWork(int64 delay) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasMoreWork()) { 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_idle_time_ = base::TimeTicks(); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delayed_work_scheduled_) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delayed_work_scheduled_ = true; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Idle when no messages are processed between now and when 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PollWork is called. 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) previous_messages_processed_ = 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel()->gpu_channel_manager()->MessagesProcessed(); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_idle_time_.is_null()) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_idle_time_ = base::TimeTicks::Now(); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IsScheduled() returns true after passing all unschedule fences 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and this is when we can start performing idle work. Idle work 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is done synchronously so we can set delay to 0 and instead poll 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for more work at the rate idle work is performed. This also ensures 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that idle work is done as efficiently as possible without any 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unnecessary delays. 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scheduler_.get() && 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->IsScheduled() && 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->HasMoreIdleWork()) { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delay = 0; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&GpuCommandBufferStub::PollWork, AsWeakPtr()), 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(delay)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnEcho(const IPC::Message& message) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnEcho"); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new IPC::Message(message)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GpuCommandBufferStub::MakeCurrent() { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoder_->MakeCurrent()) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Context lost because MakeCurrent failed."; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetParseError(gpu::error::kLostContext); 3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckContextLost(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::Destroy() { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (handle_.is_null() && !active_url_.is_empty()) { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_channel_manager->Send(new GpuHostMsg_DidDestroyOffscreenContext( 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_url_)); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_.reset(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!sync_points_.empty()) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRetireSyncPoint(sync_points_.front()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (decoder_) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_->set_engine(NULL); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The scheduler has raw references to the decoder and the command buffer so 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroy it before those. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduler_.reset(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_context = false; 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (decoder_ && command_buffer_ && 3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->GetState().error != gpu::error::kLostContext) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) have_context = decoder_->MakeCurrent(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(DestructionObserver, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destruction_observers_, 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWillDestroyStub()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (decoder_) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->Destroy(have_context); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.reset(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_.reset(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) // Remove this after crbug.com/248395 is sorted out. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_ = NULL; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnInitializeFailed(IPC::Message* reply_message) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Destroy(); 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GpuCommandBufferMsg_Initialize::WriteReplyParams( 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reply_message, false, gpu::Capabilities()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnInitialize( 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SharedMemoryHandle shared_state_handle, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnInitialize"); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!command_buffer_.get()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::SharedMemory> shared_state_shm( 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::SharedMemory(shared_state_handle, false)); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_.reset(new gpu::CommandBufferService( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_group_->transfer_buffer_manager())); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool result = command_buffer_->Initialize(); 405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(result); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group_.get())); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.get(), 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.get())); 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (preemption_flag_.get()) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetPreemptByFlag(preemption_flag_); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->set_engine(scheduler_.get()); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handle_.is_null()) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(UI_COMPOSITOR_IMAGE_TRANSPORT) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (software_) { 420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LOG(ERROR) << "No software support.\n"; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInitializeFailed(reply_message); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_ = ImageTransportSurface::CreateSurface( 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_->gpu_channel_manager(), 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_ = manager->GetDefaultOffscreenSurface(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!surface_.get()) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Failed to create surface.\n"; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInitializeFailed(reply_message); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<gfx::GLContext> context; 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (use_virtualized_gl_context_ && channel_->share_group()) { 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context = channel_->share_group()->GetSharedContext(); 444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!context.get()) { 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context = gfx::GLContext::CreateGLContext( 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_->share_group(), 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_->gpu_channel_manager()->GetDefaultOffscreenSurface(), 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_preference_); 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) channel_->share_group()->SetSharedContext(context.get()); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This should be a non-virtual GL context. 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(context->GetHandle()); 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context = new gpu::GLContextVirtual( 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) channel_->share_group(), context.get(), decoder_->AsWeakPtr()); 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!context->Initialize(surface_.get(), gpu_preference_)) { 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sievers): The real context created above for the default 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // offscreen surface might not be compatible with this surface. 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Need to adjust at least GLX to be able to create the initial context 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with a config that is compatible with onscreen and offscreen surfaces. 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context = NULL; 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DLOG(ERROR) << "Failed to initialize virtual GL context."; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnInitializeFailed(reply_message); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!context.get()) { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context = gfx::GLContext::CreateGLContext( 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) channel_->share_group(), surface_.get(), gpu_preference_); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!context.get()) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Failed to create context.\n"; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInitializeFailed(reply_message); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!context->MakeCurrent(surface_.get())) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to make context current."; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInitializeFailed(reply_message); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 483a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!context->GetGLStateRestorer()) { 484a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) context->SetGLStateRestorer( 485a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new gpu::GLStateRestorerImpl(decoder_->AsWeakPtr())); 486a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 487a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!context->GetTotalGpuMemory(&total_gpu_memory_)) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) total_gpu_memory_ = 0; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!context_group_->has_program_cache()) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_group_->set_program_cache( 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_->gpu_channel_manager()->program_cache()); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the decoder with either the view or pbuffer GLContext. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!decoder_->Initialize(surface_, 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !surface_id(), 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_size_, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disallowed_features_, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_attribs_)) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Failed to initialize decoder."; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInitializeFailed(reply_message); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gpu_control_.reset( 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new gpu::GpuControlService(context_group_->image_manager(), 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) context_group_->mailbox_manager(), 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL, 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) decoder_->GetCapabilities())); 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableGPUServiceLogging)) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->set_log_commands(true); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) decoder_->GetLogger()->SetMsgCallback( 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::SendConsoleMessage, 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_->SetShaderCacheCallback( 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GpuCommandBufferStub::SendCachedShader, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decoder_->SetWaitSyncPointCallback( 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnWaitSyncPoint, 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetPutOffsetChangeCallback( 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::PutChanged, base::Unretained(this))); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetGetBufferChangeCallback( 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&gpu::GpuScheduler::SetGetBuffer, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(scheduler_.get()))); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->SetParseErrorCallback( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnParseError, base::Unretained(this))); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetSchedulingChangedCallback( 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&GpuChannel::StubSchedulingChanged, 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(channel_))); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (watchdog_) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduler_->SetCommandProcessedCallback( 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnCommandProcessed, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!command_buffer_->SetSharedStateBuffer(shared_state_shm.Pass())) { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DLOG(ERROR) << "Failed to map shared stae buffer."; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnInitializeFailed(reply_message); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GpuCommandBufferMsg_Initialize::WriteReplyParams( 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reply_message, true, gpu_control_->GetCapabilities()); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (handle_.is_null() && !active_url_.is_empty()) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_channel_manager->Send(new GpuHostMsg_DidCreateOffscreenContext( 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_url_)); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuCommandBufferStub::OnSetLatencyInfo( 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<ui::LatencyInfo>& latency_info) { 5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ui::LatencyInfo::Verify(latency_info, 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GpuCommandBufferStub::OnSetLatencyInfo")) 5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!latency_info_callback_.is_null()) 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_callback_.Run(latency_info); 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void GpuCommandBufferStub::OnCreateStreamTexture(uint32 texture_id, 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32* stream_id) { 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID) 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *stream_id = StreamTexture::Create(this, texture_id); 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *stream_id = 0; 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuCommandBufferStub::SetLatencyInfoCallback( 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LatencyInfoCallback& callback) { 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) latency_info_callback_ = callback; 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int32 GpuCommandBufferStub::GetRequestedAttribute(int attr) const { 588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The command buffer is pairs of enum, value 589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // search for the requested attribute, return the value. 590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (std::vector<int32>::const_iterator it = requested_attribs_.begin(); 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) it != requested_attribs_.end(); ++it) { 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (*it++ == attr) { 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return *it; 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return -1; 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::OnSetGetBuffer(int32 shm_id, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::Message* reply_message) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnSetGetBuffer"); 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_buffer_->SetGetBuffer(shm_id); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void GpuCommandBufferStub::OnProduceFrontBuffer(const gpu::Mailbox& mailbox) { 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnProduceFrontBuffer"); 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!decoder_) { 610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LOG(ERROR) << "Can't produce front buffer before initialization."; 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decoder_->ProduceFrontBuffer(mailbox); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnGetState(IPC::Message* reply_message) { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnGetState"); 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State state = command_buffer_->GetState(); 6217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckContextLost(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferMsg_GetState::WriteReplyParams(reply_message, state); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "no command_buffer."; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_message->set_reply_error(); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnParseError() { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnParseError"); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(command_buffer_.get()); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State state = command_buffer_->GetState(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* msg = new GpuCommandBufferMsg_Destroyed( 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id_, state.context_lost_reason); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg->set_unblock(true); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(msg); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tell the browser about this context loss as well, so it can 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // determine whether client APIs like WebGL need to be immediately 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // blocked from automatically running. 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_channel_manager->Send(new GpuHostMsg_DidLoseContext( 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handle_.is_null(), state.context_lost_reason, active_url_)); 6457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckContextLost(); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnGetStateFast(IPC::Message* reply_message) { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnGetStateFast"); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(command_buffer_.get()); 6527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CheckContextLost(); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State state = command_buffer_->GetState(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferMsg_GetStateFast::WriteReplyParams(reply_message, state); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnAsyncFlush(int32 put_offset, 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flush_count) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT1("gpu", "GpuCommandBufferStub::OnAsyncFlush", 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "put_offset", put_offset); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(command_buffer_.get()); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flush_count - last_flush_count_ < 0x8000000U) { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_flush_count_ = flush_count; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->Flush(put_offset); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We received this message out-of-order. This should not happen but is here 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to catch regressions. Ignore the message. 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Received a Flush message out-of-order"; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportState(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnRescheduled() { 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State pre_state = command_buffer_->GetLastState(); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->Flush(pre_state.put_offset); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::CommandBuffer::State post_state = command_buffer_->GetLastState(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pre_state.get_offset != post_state.get_offset) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportState(); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnRegisterTransferBuffer( 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 id, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle transfer_buffer, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 size) { 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnRegisterTransferBuffer"); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemory shared_memory(transfer_buffer, false); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_buffer_->RegisterTransferBuffer(id, &shared_memory, size); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::OnDestroyTransferBuffer(int32 id) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyTransferBuffer"); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->DestroyTransferBuffer(id); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnGetTransferBuffer( 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id, 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnGetTransferBuffer"); 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle transfer_buffer = base::SharedMemoryHandle(); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 size = 0; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::Buffer buffer = command_buffer_->GetTransferBuffer(id); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer.shared_memory) { 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer = NULL; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrokerDuplicateHandle(buffer.shared_memory->handle(), 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_->renderer_pid(), &transfer_buffer, FILE_MAP_READ | 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_MAP_WRITE, 0); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(transfer_buffer != NULL); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.shared_memory->ShareToProcess(channel_->renderer_pid(), 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transfer_buffer); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = buffer.size; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferMsg_GetTransferBuffer::WriteReplyParams(reply_message, 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer, 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_message->set_reply_error(); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnCommandProcessed() { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (watchdog_) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watchdog_->CheckArmed(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::ReportState() { 7407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!CheckContextLost()) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->UpdateState(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::PutChanged() { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FastSetActiveURL(active_url_, active_url_hash_); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduler_->PutChanged(); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnCreateVideoDecoder( 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::VideoCodecProfile profile, 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateVideoDecoder"); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int decoder_route_id = channel_->GenerateRouteID(); 75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GpuVideoDecodeAccelerator* decoder = new GpuVideoDecodeAccelerator( 75558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) decoder_route_id, this, channel_->io_message_loop()); 75658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) decoder->Initialize(profile, reply_message); 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // decoder is registered as a DestructionObserver of this stub and will 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // self-delete during destruction of this stub. 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSetSurfaceVisible(bool visible) { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnSetSurfaceVisible"); 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (memory_manager_client_state_) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_->SetVisible(visible); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::AddSyncPoint(uint32 sync_point) { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_points_.push_back(sync_point); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_points_.pop_front(); 774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (context_group_->mailbox_manager()->UsesSync() && MakeCurrent()) 775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_group_->mailbox_manager()->PushTextureUpdates(); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->sync_point_manager()->RetireSyncPoint(sync_point); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) { 781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!sync_point) 782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager->sync_point_manager()->IsSyncPointRetired(sync_point)) 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sync_point_wait_count_ == 0) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub", this); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetScheduled(false); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++sync_point_wait_count_; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->sync_point_manager()->AddSyncPointCallback( 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_point, 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnSyncPointRetired, 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->AsWeakPtr())); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scheduler_->IsScheduled(); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSyncPointRetired() { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --sync_point_wait_count_; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sync_point_wait_count_ == 0) { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub", this); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetScheduled(true); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) { 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->sync_point_manager()->AddSyncPointCallback( 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_point, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->AsWeakPtr(), 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id)); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSignalSyncPointAck(uint32 id) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new GpuCommandBufferMsg_SignalSyncPointAck(route_id_, id)); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GpuCommandBufferStub::OnSignalQuery(uint32 query_id, uint32 id) { 823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decoder_) { 824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu::gles2::QueryManager* query_manager = decoder_->GetQueryManager(); 825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (query_manager) { 826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu::gles2::QueryManager::Query* query = 827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch query_manager->GetQuery(query_id); 828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (query) { 829eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch query->AddCallback( 830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 831eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this->AsWeakPtr(), 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch id)); 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Something went wrong, run callback immediately. 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnSignalSyncPointAck(id); 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnReceivedClientManagedMemoryStats( 8431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gpu::ManagedMemoryStats& stats) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0( 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gpu", 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub::OnReceivedClientManagedMemoryStats"); 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (memory_manager_client_state_) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_->SetManagedMemoryStats(stats); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback( 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_callback) { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0( 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gpu", 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback"); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_callback) { 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!memory_manager_client_state_) { 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_.reset(GetMemoryManager()->CreateClientState( 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, surface_id_ != 0, true)); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_.reset(); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GpuCommandBufferStub::OnRegisterGpuMemoryBuffer( 8671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int32 id, 8681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::GpuMemoryBufferHandle gpu_memory_buffer, 8691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 width, 8701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 height, 8711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 internalformat) { 8721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnRegisterGpuMemoryBuffer"); 8731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (gpu_control_) { 8741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_control_->RegisterGpuMemoryBuffer(id, 8751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_memory_buffer, 8761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) width, 8771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) height, 8781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) internalformat); 8791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 8801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 8811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GpuCommandBufferStub::OnDestroyGpuMemoryBuffer(int32 id) { 8831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyGpuMemoryBuffer"); 8841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (gpu_control_) 8851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_control_->DestroyGpuMemoryBuffer(id); 8861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 8871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::SendConsoleMessage( 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id, 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GPUCommandBufferConsoleMessage console_message; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console_message.id = id; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console_message.message = message; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* msg = new GpuCommandBufferMsg_ConsoleMsg( 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id_, console_message); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg->set_unblock(true); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(msg); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::SendCachedShader( 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, const std::string& shader) { 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_->CacheShader(key, shader); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::AddDestructionObserver( 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestructionObserver* observer) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destruction_observers_.AddObserver(observer); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::RemoveDestructionObserver( 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestructionObserver* observer) { 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destruction_observers_.RemoveObserver(observer); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::SetPreemptByFlag( 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<gpu::PreemptionFlag> flag) { 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preemption_flag_ = flag; 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (scheduler_) 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetPreemptByFlag(preemption_flag_); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuCommandBufferStub::GetTotalGpuMemory(uint64* bytes) { 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *bytes = total_gpu_memory_; 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !!total_gpu_memory_; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size GpuCommandBufferStub::GetSurfaceSize() const { 928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!surface_.get()) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return surface_->GetSize(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::gles2::MemoryTracker* GpuCommandBufferStub::GetMemoryTracker() const { 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_group_->memory_tracker(); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::SetMemoryAllocation( 9381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gpu::MemoryAllocation& allocation) { 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!last_memory_allocation_valid_ || 9401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) !allocation.Equals(last_memory_allocation_)) { 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new GpuCommandBufferMsg_SetMemoryAllocation( 9421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) route_id_, allocation)); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_memory_allocation_valid_ = true; 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_memory_allocation_ = allocation; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GpuCommandBufferStub::SuggestHaveFrontBuffer( 9501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool suggest_have_frontbuffer) { 9511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This can be called outside of OnMessageReceived, so the context needs 9521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // to be made current before calling methods on the surface. 9531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (surface_.get() && MakeCurrent()) 9541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) surface_->SetFrontbufferAllocation(suggest_have_frontbuffer); 9551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool GpuCommandBufferStub::CheckContextLost() { 9587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(command_buffer_); 9597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gpu::CommandBuffer::State state = command_buffer_->GetState(); 9607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool was_lost = state.error == gpu::error::kLostContext; 9617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Lose all other contexts if the reset was triggered by the robustness 9627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // extension instead of being synthetic. 9637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (was_lost && decoder_ && decoder_->WasContextLostByRobustnessExtension() && 9647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (gfx::GLContext::LosesAllContextsOnContextLost() || 9657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch use_virtualized_gl_context_)) 9667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch channel_->LoseAllContexts(); 9677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return was_lost; 9687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid GpuCommandBufferStub::MarkContextLost() { 9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!command_buffer_ || 9727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->GetState().error == gpu::error::kLostContext) 9737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 9747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->SetContextLostReason(gpu::error::kUnknown); 9767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (decoder_) 9777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch decoder_->LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB); 9787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->SetParseError(gpu::error::kLostContext); 9797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)uint64 GpuCommandBufferStub::GetMemoryUsage() const { 982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetMemoryManager()->GetClientMemoryUsage(this); 983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 986