12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_context_provider.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeContextProvider::FakeContextProvider()
12fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    : bound_(false),
13fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      destroyed_(false) {
14fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(main_thread_checker_.CalledOnValidThread());
15fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  context_thread_checker_.DetachFromThread();
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochFakeContextProvider::~FakeContextProvider() {
19fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(main_thread_checker_.CalledOnValidThread() ||
20fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch         context_thread_checker_.CalledOnValidThread());
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochbool FakeContextProvider::InitializeOnMainThread(
24fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    const CreateCallback& create_callback) {
25fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(main_thread_checker_.CalledOnValidThread());
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!context3d_);
28fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  if (create_callback.is_null())
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context3d_ = TestWebGraphicsContext3D::Create().Pass();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
31fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    context3d_ = create_callback.Run();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context3d_;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FakeContextProvider::BindToCurrentThread() {
36fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(context3d_);
37fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
38fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // This is called on the thread the context will be used.
39fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(context_thread_checker_.CalledOnValidThread());
40fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
41fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  if (bound_)
42fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    return true;
43fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bound_ = true;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!context3d_->makeContextCurrent()) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoLock lock(destroyed_lock_);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    destroyed_ = true;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebGraphicsContext3D* FakeContextProvider::Context3d() {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(context3d_);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(bound_);
56fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(context_thread_checker_.CalledOnValidThread());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context3d_.get();
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GrContext* FakeContextProvider::GrContext() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(context3d_);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(bound_);
63fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(context_thread_checker_.CalledOnValidThread());
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(danakj): Make a fake GrContext.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeContextProvider::VerifyContexts() {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(context3d_);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(bound_);
72fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(context_thread_checker_.CalledOnValidThread());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (context3d_->isContextLost()) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoLock lock(destroyed_lock_);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    destroyed_ = true;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FakeContextProvider::DestroyedOnMainThread() {
81fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(main_thread_checker_.CalledOnValidThread());
82fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AutoLock lock(destroyed_lock_);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return destroyed_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
87fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochvoid FakeContextProvider::SetLostContextCallback(
88fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    const LostContextCallback& cb) {
89fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  DCHECK(context_thread_checker_.CalledOnValidThread());
90fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  NOTIMPLEMENTED();
91fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
92fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
94