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)