| // Copyright 2018 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 "chrome/browser/vr/base_graphics_delegate.h" |
| |
| #include <utility> |
| |
| #include "base/bind_helpers.h" |
| #include "base/trace_event/trace_event.h" |
| #include "ui/gl/gl_context.h" |
| #include "ui/gl/gl_share_group.h" |
| #include "ui/gl/gl_surface.h" |
| #include "ui/gl/init/gl_factory.h" |
| |
| namespace vr { |
| |
| BaseGraphicsDelegate::BaseGraphicsDelegate() {} |
| |
| BaseGraphicsDelegate::~BaseGraphicsDelegate() { |
| if (curr_context_id_ != kNone) |
| contexts_[curr_context_id_]->ReleaseCurrent(surface_.get()); |
| } |
| |
| bool BaseGraphicsDelegate::Initialize( |
| const scoped_refptr<gl::GLSurface>& surface) { |
| surface_ = surface; |
| share_group_ = base::MakeRefCounted<gl::GLShareGroup>(); |
| for (auto& context : contexts_) { |
| context = gl::init::CreateGLContext(share_group_.get(), surface_.get(), |
| gl::GLContextAttribs()); |
| if (!context.get()) { |
| LOG(ERROR) << "gl::init::CreateGLContext failed"; |
| return false; |
| } |
| } |
| return MakeContextCurrent(kMainContext); |
| } |
| |
| bool BaseGraphicsDelegate::RunInSkiaContext(base::OnceClosure callback) { |
| DCHECK_EQ(curr_context_id_, kMainContext); |
| if (!MakeContextCurrent(kSkiaContext)) |
| return false; |
| std::move(callback).Run(); |
| return MakeContextCurrent(kMainContext); |
| } |
| |
| void BaseGraphicsDelegate::SwapSurfaceBuffers() { |
| TRACE_EVENT0("gpu", __func__); |
| DCHECK(surface_); |
| surface_->SwapBuffers(base::DoNothing()); |
| } |
| |
| bool BaseGraphicsDelegate::MakeContextCurrent(ContextId context_id) { |
| DCHECK(context_id > kNone && context_id < kNumContexts); |
| if (curr_context_id_ == context_id) |
| return true; |
| auto& context = contexts_[context_id]; |
| if (!context->MakeCurrent(surface_.get())) { |
| LOG(ERROR) << "gl::GLContext::MakeCurrent() failed"; |
| return false; |
| } |
| curr_context_id_ = context_id; |
| return true; |
| } |
| |
| } // namespace vr |