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