gpu_command_buffer_stub.cc revision 4ad1aa43a48567659193a298fad74f55e00b3dd9
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) { 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch devtools_gpu_instrumentation::ScopedGpuTask task(channel()); 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"); 689effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 690effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Take ownership of the memory and map it into this process. 691effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This validates the size. 692effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<base::SharedMemory> shared_memory( 693effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new base::SharedMemory(transfer_buffer, false)); 694effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!shared_memory->Map(size)) { 695effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DVLOG(0) << "Failed to map shared memory."; 696effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 697effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) 700effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch command_buffer_->RegisterTransferBuffer(id, shared_memory.Pass(), size); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::OnDestroyTransferBuffer(int32 id) { 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyTransferBuffer"); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->DestroyTransferBuffer(id); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnGetTransferBuffer( 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id, 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnGetTransferBuffer"); 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (command_buffer_) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle transfer_buffer = base::SharedMemoryHandle(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 size = 0; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 718effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<gpu::Buffer> buffer = command_buffer_->GetTransferBuffer(id); 719effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (buffer && buffer->shared_memory()) { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer = NULL; 722effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BrokerDuplicateHandle(buffer->shared_memory()->handle(), 723effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch channel_->renderer_pid(), 724effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &transfer_buffer, 725effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FILE_MAP_READ | FILE_MAP_WRITE, 726effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 0); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(transfer_buffer != NULL); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 729effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch buffer->shared_memory()->ShareToProcess(channel_->renderer_pid(), 730effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &transfer_buffer); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size = buffer->size(); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferMsg_GetTransferBuffer::WriteReplyParams(reply_message, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_buffer, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reply_message->set_reply_error(); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(reply_message); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnCommandProcessed() { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (watchdog_) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watchdog_->CheckArmed(); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::ReportState() { 7507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!CheckContextLost()) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_buffer_->UpdateState(); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::PutChanged() { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FastSetActiveURL(active_url_, active_url_hash_); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scheduler_->PutChanged(); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnCreateVideoDecoder( 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::VideoCodecProfile profile, 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_message) { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateVideoDecoder"); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int decoder_route_id = channel_->GenerateRouteID(); 76458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GpuVideoDecodeAccelerator* decoder = new GpuVideoDecodeAccelerator( 76558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) decoder_route_id, this, channel_->io_message_loop()); 76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) decoder->Initialize(profile, reply_message); 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // decoder is registered as a DestructionObserver of this stub and will 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // self-delete during destruction of this stub. 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSetSurfaceVisible(bool visible) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnSetSurfaceVisible"); 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (memory_manager_client_state_) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_->SetVisible(visible); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::AddSyncPoint(uint32 sync_point) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_points_.push_back(sync_point); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnRetireSyncPoint(uint32 sync_point) { 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!sync_points_.empty() && sync_points_.front() == sync_point); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_points_.pop_front(); 784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (context_group_->mailbox_manager()->UsesSync() && MakeCurrent()) 785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context_group_->mailbox_manager()->PushTextureUpdates(); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->sync_point_manager()->RetireSyncPoint(sync_point); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuCommandBufferStub::OnWaitSyncPoint(uint32 sync_point) { 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!sync_point) 792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager->sync_point_manager()->IsSyncPointRetired(sync_point)) 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sync_point_wait_count_ == 0) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN1("gpu", "WaitSyncPoint", this, 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub", this); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetScheduled(false); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++sync_point_wait_count_; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->sync_point_manager()->AddSyncPointCallback( 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_point, 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnSyncPointRetired, 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->AsWeakPtr())); 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scheduler_->IsScheduled(); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSyncPointRetired() { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --sync_point_wait_count_; 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sync_point_wait_count_ == 0) { 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_END1("gpu", "WaitSyncPoint", this, 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub", this); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetScheduled(true); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSignalSyncPoint(uint32 sync_point, uint32 id) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* manager = channel_->gpu_channel_manager(); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->sync_point_manager()->AddSyncPointCallback( 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_point, 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->AsWeakPtr(), 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id)); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSignalSyncPointAck(uint32 id) { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new GpuCommandBufferMsg_SignalSyncPointAck(route_id_, id)); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid GpuCommandBufferStub::OnSignalQuery(uint32 query_id, uint32 id) { 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decoder_) { 834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu::gles2::QueryManager* query_manager = decoder_->GetQueryManager(); 835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (query_manager) { 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu::gles2::QueryManager::Query* query = 837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch query_manager->GetQuery(query_id); 838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (query) { 839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch query->AddCallback( 840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&GpuCommandBufferStub::OnSignalSyncPointAck, 841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this->AsWeakPtr(), 842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch id)); 843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Something went wrong, run callback immediately. 848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnSignalSyncPointAck(id); 849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnReceivedClientManagedMemoryStats( 8531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gpu::ManagedMemoryStats& stats) { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0( 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gpu", 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub::OnReceivedClientManagedMemoryStats"); 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (memory_manager_client_state_) 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_->SetManagedMemoryStats(stats); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback( 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_callback) { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0( 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gpu", 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback"); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_callback) { 867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!memory_manager_client_state_) { 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_.reset(GetMemoryManager()->CreateClientState( 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, surface_id_ != 0, true)); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memory_manager_client_state_.reset(); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GpuCommandBufferStub::OnRegisterGpuMemoryBuffer( 8771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int32 id, 8781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::GpuMemoryBufferHandle gpu_memory_buffer, 8791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 width, 8801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 height, 8811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 internalformat) { 8821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnRegisterGpuMemoryBuffer"); 8834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#if defined(OS_ANDROID) 8844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // Verify that renderer is not trying to use a surface texture it doesn't own. 8854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch if (gpu_memory_buffer.type == gfx::SURFACE_TEXTURE_BUFFER && 8864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch gpu_memory_buffer.surface_texture_id.secondary_id != 8874ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch channel()->client_id()) { 8884ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch LOG(ERROR) << "Illegal surface texture ID for renderer."; 8894ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return; 8904ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 8914ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#endif 8921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (gpu_control_) { 8931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_control_->RegisterGpuMemoryBuffer(id, 8941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_memory_buffer, 8951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) width, 8961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) height, 8971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) internalformat); 8981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 8991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 9001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GpuCommandBufferStub::OnDestroyGpuMemoryBuffer(int32 id) { 9021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnDestroyGpuMemoryBuffer"); 9031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (gpu_control_) 9041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_control_->DestroyGpuMemoryBuffer(id); 9051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 9061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::SendConsoleMessage( 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GPUCommandBufferConsoleMessage console_message; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console_message.id = id; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console_message.message = message; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* msg = new GpuCommandBufferMsg_ConsoleMsg( 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) route_id_, console_message); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) msg->set_unblock(true); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(msg); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::SendCachedShader( 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, const std::string& shader) { 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel_->CacheShader(key, shader); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::AddDestructionObserver( 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestructionObserver* observer) { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destruction_observers_.AddObserver(observer); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::RemoveDestructionObserver( 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestructionObserver* observer) { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destruction_observers_.RemoveObserver(observer); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuCommandBufferStub::SetPreemptByFlag( 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<gpu::PreemptionFlag> flag) { 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preemption_flag_ = flag; 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (scheduler_) 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduler_->SetPreemptByFlag(preemption_flag_); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuCommandBufferStub::GetTotalGpuMemory(uint64* bytes) { 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *bytes = total_gpu_memory_; 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !!total_gpu_memory_; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size GpuCommandBufferStub::GetSurfaceSize() const { 947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!surface_.get()) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return surface_->GetSize(); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gpu::gles2::MemoryTracker* GpuCommandBufferStub::GetMemoryTracker() const { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return context_group_->memory_tracker(); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GpuCommandBufferStub::SetMemoryAllocation( 9571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gpu::MemoryAllocation& allocation) { 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!last_memory_allocation_valid_ || 9591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) !allocation.Equals(last_memory_allocation_)) { 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new GpuCommandBufferMsg_SetMemoryAllocation( 9611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) route_id_, allocation)); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_memory_allocation_valid_ = true; 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_memory_allocation_ = allocation; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void GpuCommandBufferStub::SuggestHaveFrontBuffer( 9691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool suggest_have_frontbuffer) { 9701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This can be called outside of OnMessageReceived, so the context needs 9711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // to be made current before calling methods on the surface. 9721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (surface_.get() && MakeCurrent()) 9731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) surface_->SetFrontbufferAllocation(suggest_have_frontbuffer); 9741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 9751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 9767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool GpuCommandBufferStub::CheckContextLost() { 9777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(command_buffer_); 9787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gpu::CommandBuffer::State state = command_buffer_->GetState(); 9797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool was_lost = state.error == gpu::error::kLostContext; 9807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Lose all other contexts if the reset was triggered by the robustness 9817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // extension instead of being synthetic. 9827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (was_lost && decoder_ && decoder_->WasContextLostByRobustnessExtension() && 9837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (gfx::GLContext::LosesAllContextsOnContextLost() || 9847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch use_virtualized_gl_context_)) 9857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch channel_->LoseAllContexts(); 9867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return was_lost; 9877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid GpuCommandBufferStub::MarkContextLost() { 9907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!command_buffer_ || 9917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->GetState().error == gpu::error::kLostContext) 9927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 9937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->SetContextLostReason(gpu::error::kUnknown); 9957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (decoder_) 9967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch decoder_->LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB); 9977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command_buffer_->SetParseError(gpu::error::kLostContext); 9987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)uint64 GpuCommandBufferStub::GetMemoryUsage() const { 1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetMemoryManager()->GetClientMemoryUsage(this); 1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1005