blob: ec0e62dc65c2fed44d3f7704b08c82d0d0d22d8a [file] [log] [blame]
// Copyright 2014 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 "mojo/gpu/gl_context.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/interfaces/application/application_connector.mojom.h"
#include "mojo/services/gpu/interfaces/gpu.mojom.h"
namespace mojo {
GLContext::GLContext(InterfaceHandle<CommandBuffer> command_buffer)
: mgl_context_(
MGLCreateContext(MGL_API_VERSION_GLES2,
command_buffer.PassHandle().release().value(),
MGL_NO_CONTEXT,
&ContextLostThunk,
this,
Environment::GetDefaultAsyncWaiter())) {
DCHECK(mgl_context_ != MGL_NO_CONTEXT);
}
GLContext::~GLContext() {
MGLDestroyContext(mgl_context_);
}
scoped_refptr<GLContext> GLContext::CreateOffscreen(
ApplicationConnector* connector) {
ServiceProviderPtr native_viewport;
connector->ConnectToApplication("mojo:native_viewport_service",
GetProxy(&native_viewport), nullptr);
GpuPtr gpu_service;
ConnectToService(native_viewport.get(), GetProxy(&gpu_service));
InterfaceHandle<CommandBuffer> command_buffer;
gpu_service->CreateOffscreenGLES2Context(GetProxy(&command_buffer));
return new GLContext(command_buffer.Pass());
}
scoped_refptr<GLContext> GLContext::CreateFromCommandBuffer(
InterfaceHandle<CommandBuffer> command_buffer) {
return new GLContext(command_buffer.Pass());
}
bool GLContext::IsCurrent() const {
return mgl_context_ == MGLGetCurrentContext();
}
void GLContext::AddObserver(Observer* observer) {
DCHECK(observer);
observers_.AddObserver(observer);
}
void GLContext::RemoveObserver(Observer* observer) {
DCHECK(observer);
observers_.RemoveObserver(observer);
}
void GLContext::ContextLostThunk(void* self) {
static_cast<GLContext*>(self)->OnContextLost();
}
void GLContext::OnContextLost() {
DCHECK(!lost_);
lost_ = true;
FOR_EACH_OBSERVER(Observer, observers_, OnContextLost());
}
GLContext::Scope::Scope(const scoped_refptr<GLContext>& gl_context)
: gl_context_(gl_context), prior_mgl_context_(MGLGetCurrentContext()) {
DCHECK(gl_context_);
CHECK(!gl_context_->is_lost()); // common bug, check it in release builds
MGLMakeCurrent(gl_context_->mgl_context_);
}
GLContext::Scope::~Scope() {
DCHECK(gl_context_->IsCurrent());
MGLMakeCurrent(prior_mgl_context_);
}
GLContext::Observer::~Observer() {}
} // namespace mojo