1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/test/test_context_provider.h"
10 #include "base/bind.h"
11 #include "base/callback_helpers.h"
12 #include "base/logging.h"
13 #include "base/strings/string_split.h"
14 #include "cc/test/test_web_graphics_context_3d.h"
18 class TestContextProvider::LostContextCallbackProxy
19 : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
21 explicit LostContextCallbackProxy(TestContextProvider* provider)
22 : provider_(provider) {
23 provider_->context3d_->setContextLostCallback(this);
26 virtual ~LostContextCallbackProxy() {
27 provider_->context3d_->setContextLostCallback(NULL);
30 virtual void onContextLost() {
31 provider_->OnLostContext();
35 TestContextProvider* provider_;
38 class TestContextProvider::SwapBuffersCompleteCallbackProxy
39 : public WebKit::WebGraphicsContext3D::
40 WebGraphicsSwapBuffersCompleteCallbackCHROMIUM {
42 explicit SwapBuffersCompleteCallbackProxy(TestContextProvider* provider)
43 : provider_(provider) {
44 provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(this);
47 virtual ~SwapBuffersCompleteCallbackProxy() {
48 provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(NULL);
51 virtual void onSwapBuffersComplete() {
52 provider_->OnSwapBuffersComplete();
56 TestContextProvider* provider_;
60 scoped_refptr<TestContextProvider> TestContextProvider::Create() {
61 return Create(TestWebGraphicsContext3D::Create().Pass());
65 scoped_refptr<TestContextProvider> TestContextProvider::Create(
66 scoped_ptr<TestWebGraphicsContext3D> context) {
69 return new TestContextProvider(context.Pass());
72 TestContextProvider::TestContextProvider(
73 scoped_ptr<TestWebGraphicsContext3D> context)
74 : context3d_(context.Pass()), bound_(false), destroyed_(false) {
75 DCHECK(main_thread_checker_.CalledOnValidThread());
77 context_thread_checker_.DetachFromThread();
78 context3d_->set_test_support(&support_);
81 TestContextProvider::~TestContextProvider() {
82 DCHECK(main_thread_checker_.CalledOnValidThread() ||
83 context_thread_checker_.CalledOnValidThread());
86 bool TestContextProvider::BindToCurrentThread() {
89 // This is called on the thread the context will be used.
90 DCHECK(context_thread_checker_.CalledOnValidThread());
96 if (!context3d_->makeContextCurrent()) {
97 base::AutoLock lock(destroyed_lock_);
102 lost_context_callback_proxy_.reset(new LostContextCallbackProxy(this));
103 swap_buffers_complete_callback_proxy_.reset(
104 new SwapBuffersCompleteCallbackProxy(this));
109 ContextProvider::Capabilities TestContextProvider::ContextCapabilities() {
112 DCHECK(context_thread_checker_.CalledOnValidThread());
114 return context3d_->test_capabilities();
117 WebKit::WebGraphicsContext3D* TestContextProvider::Context3d() {
120 DCHECK(context_thread_checker_.CalledOnValidThread());
122 return context3d_.get();
125 gpu::ContextSupport* TestContextProvider::ContextSupport() {
128 DCHECK(context_thread_checker_.CalledOnValidThread());
133 class GrContext* TestContextProvider::GrContext() {
136 DCHECK(context_thread_checker_.CalledOnValidThread());
138 // TODO(danakj): Make a test GrContext that works with a test Context3d.
142 void TestContextProvider::VerifyContexts() {
145 DCHECK(context_thread_checker_.CalledOnValidThread());
147 if (context3d_->isContextLost()) {
148 base::AutoLock lock(destroyed_lock_);
153 bool TestContextProvider::DestroyedOnMainThread() {
154 DCHECK(main_thread_checker_.CalledOnValidThread());
156 base::AutoLock lock(destroyed_lock_);
160 void TestContextProvider::OnLostContext() {
161 DCHECK(context_thread_checker_.CalledOnValidThread());
163 base::AutoLock lock(destroyed_lock_);
168 if (!lost_context_callback_.is_null())
169 base::ResetAndReturn(&lost_context_callback_).Run();
172 void TestContextProvider::OnSwapBuffersComplete() {
173 DCHECK(context_thread_checker_.CalledOnValidThread());
174 if (!swap_buffers_complete_callback_.is_null())
175 swap_buffers_complete_callback_.Run();
178 TestWebGraphicsContext3D* TestContextProvider::TestContext3d() {
181 DCHECK(context_thread_checker_.CalledOnValidThread());
183 return context3d_.get();
186 TestWebGraphicsContext3D* TestContextProvider::UnboundTestContext3d() {
188 DCHECK(context_thread_checker_.CalledOnValidThread());
190 return context3d_.get();
193 void TestContextProvider::SetMemoryAllocation(
194 const ManagedMemoryPolicy& policy) {
195 if (memory_policy_changed_callback_.is_null())
197 memory_policy_changed_callback_.Run(policy);
200 void TestContextProvider::SetLostContextCallback(
201 const LostContextCallback& cb) {
202 DCHECK(context_thread_checker_.CalledOnValidThread());
203 DCHECK(lost_context_callback_.is_null() || cb.is_null());
204 lost_context_callback_ = cb;
207 void TestContextProvider::SetSwapBuffersCompleteCallback(
208 const SwapBuffersCompleteCallback& cb) {
209 DCHECK(context_thread_checker_.CalledOnValidThread());
210 DCHECK(swap_buffers_complete_callback_.is_null() || cb.is_null());
211 swap_buffers_complete_callback_ = cb;
214 void TestContextProvider::SetMemoryPolicyChangedCallback(
215 const MemoryPolicyChangedCallback& cb) {
216 DCHECK(context_thread_checker_.CalledOnValidThread());
217 DCHECK(memory_policy_changed_callback_.is_null() || cb.is_null());
218 memory_policy_changed_callback_ = cb;
221 void TestContextProvider::SetMaxTransferBufferUsageBytes(
222 size_t max_transfer_buffer_usage_bytes) {
223 context3d_->SetMaxTransferBufferUsageBytes(max_transfer_buffer_usage_bytes);