Index: cc/test/test_context_provider.cc |
diff --git a/cc/test/test_context_provider.cc b/cc/test/test_context_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..90df22a2f40a8dea283ccdf00f0cf87fb2b2f7ee |
--- /dev/null |
+++ b/cc/test/test_context_provider.cc |
@@ -0,0 +1,199 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "cc/test/test_context_provider.h" |
+ |
+#include <set> |
+#include <vector> |
+ |
+#include "base/bind.h" |
+#include "base/callback_helpers.h" |
+#include "base/logging.h" |
+#include "cc/test/test_gles2_interface.h" |
+#include "third_party/skia/include/gpu/GrContext.h" |
+#include "third_party/skia/include/gpu/gl/SkNullGLContext.h" |
+ |
+namespace cc { |
+ |
+// static |
+scoped_refptr<TestContextProvider> TestContextProvider::Create() { |
+ return Create(TestWebGraphicsContext3D::Create().Pass()); |
+} |
+ |
+// static |
+scoped_refptr<TestContextProvider> TestContextProvider::Create( |
+ scoped_ptr<TestWebGraphicsContext3D> context) { |
+ if (!context) |
+ return NULL; |
+ return new TestContextProvider(context.Pass()); |
+} |
+ |
+TestContextProvider::TestContextProvider( |
+ scoped_ptr<TestWebGraphicsContext3D> context) |
+ : context3d_(context.Pass()), |
+ context_gl_(new TestGLES2Interface(context3d_.get())), |
+ bound_(false), |
+ destroyed_(false), |
+ weak_ptr_factory_(this) { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ DCHECK(context3d_); |
+ context_thread_checker_.DetachFromThread(); |
+ context3d_->set_test_support(&support_); |
+} |
+ |
+TestContextProvider::~TestContextProvider() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread() || |
+ context_thread_checker_.CalledOnValidThread()); |
+} |
+ |
+bool TestContextProvider::BindToCurrentThread() { |
+ // This is called on the thread the context will be used. |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ if (bound_) |
+ return true; |
+ |
+ if (context3d_->isContextLost()) { |
+ base::AutoLock lock(destroyed_lock_); |
+ destroyed_ = true; |
+ return false; |
+ } |
+ bound_ = true; |
+ |
+ context3d_->set_context_lost_callback( |
+ base::Bind(&TestContextProvider::OnLostContext, |
+ base::Unretained(this))); |
+ |
+ return true; |
+} |
+ |
+void TestContextProvider::DetachFromThread() { |
+ context_thread_checker_.DetachFromThread(); |
+} |
+ |
+ContextProvider::Capabilities TestContextProvider::ContextCapabilities() { |
+ DCHECK(bound_); |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ return context3d_->test_capabilities(); |
+} |
+ |
+gpu::gles2::GLES2Interface* TestContextProvider::ContextGL() { |
+ DCHECK(context3d_); |
+ DCHECK(bound_); |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ return context_gl_.get(); |
+} |
+ |
+gpu::ContextSupport* TestContextProvider::ContextSupport() { |
+ return &support_; |
+} |
+ |
+class GrContext* TestContextProvider::GrContext() { |
+ DCHECK(bound_); |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ if (gr_context_) |
+ return gr_context_.get(); |
+ |
+ skia::RefPtr<class SkGLContext> gl_context = |
+ skia::AdoptRef(SkNullGLContext::Create(kNone_GrGLStandard)); |
+ gl_context->makeCurrent(); |
+ gr_context_ = skia::AdoptRef(GrContext::Create( |
+ kOpenGL_GrBackend, reinterpret_cast<GrBackendContext>(gl_context->gl()))); |
+ |
+ // If GlContext is already lost, also abandon the new GrContext. |
+ if (IsContextLost()) |
+ gr_context_->abandonContext(); |
+ |
+ return gr_context_.get(); |
+} |
+ |
+void TestContextProvider::SetupLock() { |
+} |
+ |
+base::Lock* TestContextProvider::GetLock() { |
+ return &context_lock_; |
+} |
+ |
+bool TestContextProvider::IsContextLost() { |
+ DCHECK(bound_); |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ return context3d_->isContextLost(); |
+} |
+ |
+void TestContextProvider::VerifyContexts() { |
+ DCHECK(bound_); |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ if (context3d_->isContextLost()) { |
+ base::AutoLock lock(destroyed_lock_); |
+ destroyed_ = true; |
+ } |
+} |
+ |
+void TestContextProvider::DeleteCachedResources() { |
+} |
+ |
+bool TestContextProvider::DestroyedOnMainThread() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ |
+ base::AutoLock lock(destroyed_lock_); |
+ return destroyed_; |
+} |
+ |
+void TestContextProvider::OnLostContext() { |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ { |
+ base::AutoLock lock(destroyed_lock_); |
+ if (destroyed_) |
+ return; |
+ destroyed_ = true; |
+ } |
+ if (!lost_context_callback_.is_null()) |
+ base::ResetAndReturn(&lost_context_callback_).Run(); |
+ if (gr_context_) |
+ gr_context_->abandonContext(); |
+} |
+ |
+TestWebGraphicsContext3D* TestContextProvider::TestContext3d() { |
+ DCHECK(bound_); |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ return context3d_.get(); |
+} |
+ |
+TestWebGraphicsContext3D* TestContextProvider::UnboundTestContext3d() { |
+ return context3d_.get(); |
+} |
+ |
+void TestContextProvider::SetMemoryAllocation( |
+ const ManagedMemoryPolicy& policy) { |
+ if (memory_policy_changed_callback_.is_null()) |
+ return; |
+ memory_policy_changed_callback_.Run(policy); |
+} |
+ |
+void TestContextProvider::SetLostContextCallback( |
+ const LostContextCallback& cb) { |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ DCHECK(lost_context_callback_.is_null() || cb.is_null()); |
+ lost_context_callback_ = cb; |
+} |
+ |
+void TestContextProvider::SetMemoryPolicyChangedCallback( |
+ const MemoryPolicyChangedCallback& cb) { |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ DCHECK(memory_policy_changed_callback_.is_null() || cb.is_null()); |
+ memory_policy_changed_callback_ = cb; |
+} |
+ |
+void TestContextProvider::SetMaxTransferBufferUsageBytes( |
+ size_t max_transfer_buffer_usage_bytes) { |
+ context3d_->SetMaxTransferBufferUsageBytes(max_transfer_buffer_usage_bytes); |
+} |
+ |
+} // namespace cc |