OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/test/test_context_provider.h" | 5 #include "cc/test/test_context_provider.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "cc/test/test_gles2_interface.h" | 13 #include "cc/test/test_gles2_interface.h" |
14 #include "cc/test/test_web_graphics_context_3d.h" | 14 #include "cc/test/test_web_graphics_context_3d.h" |
15 #include "third_party/skia/include/gpu/GrContext.h" | 15 #include "third_party/skia/include/gpu/GrContext.h" |
16 #include "third_party/skia/include/gpu/gl/SkNullGLContext.h" | 16 #include "third_party/skia/include/gpu/gl/SkNullGLContext.h" |
17 | 17 |
18 namespace cc { | 18 namespace cc { |
19 | 19 |
20 // static | 20 // static |
21 scoped_refptr<TestContextProvider> TestContextProvider::Create() { | 21 scoped_refptr<TestContextProvider> TestContextProvider::Create() { |
22 return Create(TestWebGraphicsContext3D::Create().Pass()); | 22 return Create(TestWebGraphicsContext3D::Create()); |
23 } | 23 } |
24 | 24 |
25 // static | 25 // static |
| 26 scoped_refptr<TestContextProvider> TestContextProvider::CreateWorker() { |
| 27 scoped_refptr<TestContextProvider> worker_context_provider = |
| 28 Create(TestWebGraphicsContext3D::Create()); |
| 29 if (!worker_context_provider) |
| 30 return nullptr; |
| 31 // Worker contexts are bound to the thread they are created on. |
| 32 if (!worker_context_provider->BindToCurrentThread()) |
| 33 return nullptr; |
| 34 worker_context_provider->SetupLock(); |
| 35 return worker_context_provider; |
| 36 } |
| 37 |
| 38 // static |
26 scoped_refptr<TestContextProvider> TestContextProvider::Create( | 39 scoped_refptr<TestContextProvider> TestContextProvider::Create( |
27 scoped_ptr<TestWebGraphicsContext3D> context) { | 40 scoped_ptr<TestWebGraphicsContext3D> context) { |
28 if (!context) | 41 if (!context) |
29 return NULL; | 42 return NULL; |
30 return new TestContextProvider(context.Pass()); | 43 return new TestContextProvider(context.Pass()); |
31 } | 44 } |
32 | 45 |
33 TestContextProvider::TestContextProvider( | 46 TestContextProvider::TestContextProvider( |
34 scoped_ptr<TestWebGraphicsContext3D> context) | 47 scoped_ptr<TestWebGraphicsContext3D> context) |
35 : context3d_(context.Pass()), | 48 : context3d_(context.Pass()), |
36 context_gl_(new TestGLES2Interface(context3d_.get())), | 49 context_gl_(new TestGLES2Interface(context3d_.get())), |
37 bound_(false), | 50 bound_(false), |
38 destroyed_(false), | 51 lost_(false), |
39 weak_ptr_factory_(this) { | 52 weak_ptr_factory_(this) { |
40 DCHECK(main_thread_checker_.CalledOnValidThread()); | 53 DCHECK(main_thread_checker_.CalledOnValidThread()); |
41 DCHECK(context3d_); | 54 DCHECK(context3d_); |
42 context_thread_checker_.DetachFromThread(); | 55 context_thread_checker_.DetachFromThread(); |
43 context3d_->set_test_support(&support_); | 56 context3d_->set_test_support(&support_); |
44 } | 57 } |
45 | 58 |
46 TestContextProvider::~TestContextProvider() { | 59 TestContextProvider::~TestContextProvider() { |
47 DCHECK(main_thread_checker_.CalledOnValidThread() || | |
48 context_thread_checker_.CalledOnValidThread()); | |
49 } | 60 } |
50 | 61 |
51 bool TestContextProvider::BindToCurrentThread() { | 62 bool TestContextProvider::BindToCurrentThread() { |
52 // This is called on the thread the context will be used. | 63 // This is called on the thread the context will be used. |
53 DCHECK(context_thread_checker_.CalledOnValidThread()); | 64 DCHECK(context_thread_checker_.CalledOnValidThread()); |
54 | 65 |
55 if (bound_) | 66 if (bound_) |
56 return true; | 67 return true; |
57 | 68 |
58 if (context_gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) { | 69 if (context_gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) { |
59 base::AutoLock lock(destroyed_lock_); | 70 base::AutoLock lock(lost_lock_); |
60 destroyed_ = true; | 71 lost_ = true; |
61 return false; | 72 return false; |
62 } | 73 } |
63 bound_ = true; | 74 bound_ = true; |
64 | 75 |
65 context3d_->set_context_lost_callback( | 76 context3d_->set_context_lost_callback( |
66 base::Bind(&TestContextProvider::OnLostContext, | 77 base::Bind(&TestContextProvider::OnLostContext, |
67 base::Unretained(this))); | 78 base::Unretained(this))); |
68 | 79 |
69 return true; | 80 return true; |
70 } | 81 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 | 136 |
126 base::Lock* TestContextProvider::GetLock() { | 137 base::Lock* TestContextProvider::GetLock() { |
127 return &context_lock_; | 138 return &context_lock_; |
128 } | 139 } |
129 | 140 |
130 void TestContextProvider::VerifyContexts() { | 141 void TestContextProvider::VerifyContexts() { |
131 DCHECK(bound_); | 142 DCHECK(bound_); |
132 DCHECK(context_thread_checker_.CalledOnValidThread()); | 143 DCHECK(context_thread_checker_.CalledOnValidThread()); |
133 | 144 |
134 if (ContextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERROR) { | 145 if (ContextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERROR) { |
135 base::AutoLock lock(destroyed_lock_); | 146 base::AutoLock lock(lost_lock_); |
136 destroyed_ = true; | 147 lost_ = true; |
137 } | 148 } |
138 } | 149 } |
139 | 150 |
140 void TestContextProvider::DeleteCachedResources() { | 151 void TestContextProvider::DeleteCachedResources() { |
141 } | 152 } |
142 | 153 |
143 bool TestContextProvider::DestroyedOnMainThread() { | 154 bool TestContextProvider::HasBeenLostOnMainThread() { |
144 DCHECK(main_thread_checker_.CalledOnValidThread()); | 155 DCHECK(main_thread_checker_.CalledOnValidThread()); |
145 | 156 |
146 base::AutoLock lock(destroyed_lock_); | 157 base::AutoLock lock(lost_lock_); |
147 return destroyed_; | 158 return lost_; |
148 } | 159 } |
149 | 160 |
150 void TestContextProvider::OnLostContext() { | 161 void TestContextProvider::OnLostContext() { |
151 DCHECK(context_thread_checker_.CalledOnValidThread()); | 162 DCHECK(context_thread_checker_.CalledOnValidThread()); |
152 { | 163 { |
153 base::AutoLock lock(destroyed_lock_); | 164 base::AutoLock lock(lost_lock_); |
154 if (destroyed_) | 165 if (lost_) |
155 return; | 166 return; |
156 destroyed_ = true; | 167 lost_ = true; |
157 } | 168 } |
158 if (!lost_context_callback_.is_null()) | 169 if (!lost_context_callback_.is_null()) |
159 base::ResetAndReturn(&lost_context_callback_).Run(); | 170 base::ResetAndReturn(&lost_context_callback_).Run(); |
160 if (gr_context_) | 171 if (gr_context_) |
161 gr_context_->abandonContext(); | 172 gr_context_->abandonContext(); |
162 } | 173 } |
163 | 174 |
164 TestWebGraphicsContext3D* TestContextProvider::TestContext3d() { | 175 TestWebGraphicsContext3D* TestContextProvider::TestContext3d() { |
165 DCHECK(bound_); | 176 DCHECK(bound_); |
166 DCHECK(context_thread_checker_.CalledOnValidThread()); | 177 DCHECK(context_thread_checker_.CalledOnValidThread()); |
(...skipping 24 matching lines...) Expand all Loading... |
191 DCHECK(context_thread_checker_.CalledOnValidThread()); | 202 DCHECK(context_thread_checker_.CalledOnValidThread()); |
192 DCHECK(memory_policy_changed_callback_.is_null() || cb.is_null()); | 203 DCHECK(memory_policy_changed_callback_.is_null() || cb.is_null()); |
193 memory_policy_changed_callback_ = cb; | 204 memory_policy_changed_callback_ = cb; |
194 } | 205 } |
195 | 206 |
196 void TestContextProvider::SetMaxTransferBufferUsageBytes( | 207 void TestContextProvider::SetMaxTransferBufferUsageBytes( |
197 size_t max_transfer_buffer_usage_bytes) { | 208 size_t max_transfer_buffer_usage_bytes) { |
198 context3d_->SetMaxTransferBufferUsageBytes(max_transfer_buffer_usage_bytes); | 209 context3d_->SetMaxTransferBufferUsageBytes(max_transfer_buffer_usage_bytes); |
199 } | 210 } |
200 | 211 |
| 212 bool TestContextProvider::HasBeenDestroyed() { |
| 213 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 214 return false; |
| 215 } |
| 216 |
201 } // namespace cc | 217 } // namespace cc |
OLD | NEW |