context_provider_in_process.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "webkit/common/gpu/context_provider_in_process.h" 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <set> 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/bind.h" 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/callback_helpers.h" 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/string_split.h" 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/stringprintf.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/output/managed_memory_policy.h" 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h" 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h" 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace webkit { 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace gpu { 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ContextProviderInProcess::LostContextCallbackProxy 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback { 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit LostContextCallbackProxy(ContextProviderInProcess* provider) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : provider_(provider) { 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) provider_->context3d_->setContextLostCallback(this); 2693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual ~LostContextCallbackProxy() { 298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) provider_->context3d_->setContextLostCallback(NULL); 301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) virtual void onContextLost() { 33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) provider_->OnLostContext(); 3493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 3593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) private: 3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ContextProviderInProcess* provider_; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)class ContextProviderInProcess::SwapBuffersCompleteCallbackProxy 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : public WebKit::WebGraphicsContext3D:: 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) WebGraphicsSwapBuffersCompleteCallbackCHROMIUM { 43f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) public: 445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) explicit SwapBuffersCompleteCallbackProxy(ContextProviderInProcess* provider) 4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : provider_(provider) { 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(this); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~SwapBuffersCompleteCallbackProxy() { 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(NULL); 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void onSwapBuffersComplete() { 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) provider_->OnSwapBuffersComplete(); 55f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 5893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ContextProviderInProcess* provider_; 5993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}; 6093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 6193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)// static 6293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)scoped_refptr<ContextProviderInProcess> ContextProviderInProcess::Create( 6393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context3d, 6493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const std::string& debug_name) { 6593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!context3d) 6693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return NULL; 6793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return new ContextProviderInProcess(context3d.Pass(), debug_name); 6893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 6993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 7093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)// static 7193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)scoped_refptr<ContextProviderInProcess> 7293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)ContextProviderInProcess::CreateOffscreen() { 7393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) WebKit::WebGraphicsContext3D::Attributes attributes; 7493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) attributes.depth = false; 7593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) attributes.stencil = true; 7693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) attributes.antialias = false; 7793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) attributes.shareResources = true; 7893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) attributes.noAutomaticFlushes = true; 7993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return Create( 8193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext( 8293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) attributes), "Offscreen"); 8393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 8493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 8593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)ContextProviderInProcess::ContextProviderInProcess( 865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context3d, 8793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const std::string& debug_name) 885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) : context3d_(context3d.Pass()), 895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) destroyed_(false), 905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) debug_name_(debug_name) { 915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context3d_); 935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context_thread_checker_.DetachFromThread(); 945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 9593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)ContextProviderInProcess::~ContextProviderInProcess() { 9793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread() || 9893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) context_thread_checker_.CalledOnValidThread()); 9993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)bool ContextProviderInProcess::BindToCurrentThread() { 10293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(context3d_); 10393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 10493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // This is called on the thread the context will be used. 10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 10793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (lost_context_callback_proxy_) 10893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return true; 10993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 11093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!context3d_->makeContextCurrent()) 1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return false; 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) std::string unique_context_name = 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) base::StringPrintf("%s-%p", debug_name_.c_str(), context3d_.get()); 1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context3d_->pushGroupMarkerEXT(unique_context_name.c_str()); 1165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) lost_context_callback_proxy_.reset(new LostContextCallbackProxy(this)); 1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) swap_buffers_complete_callback_proxy_.reset( 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) new SwapBuffersCompleteCallbackProxy(this)); 1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return true; 1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)cc::ContextProvider::Capabilities 12493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)ContextProviderInProcess::ContextCapabilities() { 1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) // We always use a WebGraphicsContext3DInProcessCommandBufferImpl which 12693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // provides the following capabilities: 12793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) Capabilities caps; 12893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.bind_uniform_location = true; 12993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.discard_backbuffer = true; 13093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.map_image = true; 13193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.map_sub = true; 13293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.set_visibility = true; 13393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.shallow_flush = true; 13493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.texture_format_bgra8888 = true; 13593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.texture_rectangle = true; 13693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 1375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) WebKit::WebString extensions = 1385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context3d_->getString(0x1F03 /* GL_EXTENSIONS */); 13993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) std::vector<std::string> extension_list; 14093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) base::SplitString(extensions.utf8(), ' ', &extension_list); 1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) std::set<std::string> extension_set(extension_list.begin(), 14293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) extension_list.end()); 1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 14493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) caps.post_sub_buffer = extension_set.count("GL_CHROMIUM_post_sub_buffer") > 0; 14593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return caps; 14693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 14793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebKit::WebGraphicsContext3D* ContextProviderInProcess::Context3d() { 1497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch DCHECK(context3d_); 1505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(lost_context_callback_proxy_); // Is bound to thread. 1515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 15293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 15393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return context3d_.get(); 1545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 15593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 15693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)::gpu::ContextSupport* ContextProviderInProcess::ContextSupport() { 15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(context3d_); 15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(lost_context_callback_proxy_); // Is bound to thread. 1595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 1605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return context3d_->GetContextSupport(); 1627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 1635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)class GrContext* ContextProviderInProcess::GrContext() { 1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context3d_); 1665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(lost_context_callback_proxy_); // Is bound to thread. 1675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 16893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 16993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (gr_context_) 1705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return gr_context_->get(); 17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 1725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) gr_context_.reset( 1735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) new webkit::gpu::GrContextForWebGraphicsContext3D(context3d_.get())); 1745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return gr_context_->get(); 1755267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1765267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1775267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void ContextProviderInProcess::VerifyContexts() { 1785267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context3d_); 1795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(lost_context_callback_proxy_); // Is bound to thread. 1805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 18193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 18293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (context3d_->isContextLost()) 18393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) OnLostContext(); 18493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 18593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 18693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void ContextProviderInProcess::OnLostContext() { 18793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 1885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) { 18993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) base::AutoLock lock(destroyed_lock_); 19093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (destroyed_) 1915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) destroyed_ = true; 1935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!lost_context_callback_.is_null()) 19593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) base::ResetAndReturn(&lost_context_callback_).Run(); 19693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 1975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void ContextProviderInProcess::OnSwapBuffersComplete() { 19993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 2005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!swap_buffers_complete_callback_.is_null()) 20193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) swap_buffers_complete_callback_.Run(); 20293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 20393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)bool ContextProviderInProcess::DestroyedOnMainThread() { 20593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 20693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) base::AutoLock lock(destroyed_lock_); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return destroyed_; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContextProviderInProcess::SetLostContextCallback( 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const LostContextCallback& lost_context_callback) { 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DCHECK(context_thread_checker_.CalledOnValidThread()); 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DCHECK(lost_context_callback_.is_null() || 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lost_context_callback.is_null()); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lost_context_callback_ = lost_context_callback; 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContextProviderInProcess::SetSwapBuffersCompleteCallback( 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SwapBuffersCompleteCallback& swap_buffers_complete_callback) { 2217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch DCHECK(context_thread_checker_.CalledOnValidThread()); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DCHECK(swap_buffers_complete_callback_.is_null() || 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) swap_buffers_complete_callback.is_null()); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) swap_buffers_complete_callback_ = swap_buffers_complete_callback; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ContextProviderInProcess::SetMemoryPolicyChangedCallback( 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const MemoryPolicyChangedCallback& memory_policy_changed_callback) { 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // There's no memory manager for the in-process implementation. 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} // namespace gpu 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace webkit 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)