| Index: mojo/skia/ganesh_context.cc
|
| diff --git a/mojo/skia/ganesh_context.cc b/mojo/skia/ganesh_context.cc
|
| index 76b7c597332914472b8d6a52ecb903a2a0fb7e80..735a902ca492579792fb7271fad22466d7bd7555 100644
|
| --- a/mojo/skia/ganesh_context.cc
|
| +++ b/mojo/skia/ganesh_context.cc
|
| @@ -9,63 +9,80 @@
|
| #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
|
|
|
| namespace mojo {
|
| -namespace {
|
| +namespace skia {
|
|
|
| // The limit of the number of GPU resources we hold in the GrContext's
|
| // GPU cache.
|
| -const int kMaxGaneshResourceCacheCount = 2048;
|
| +constexpr int kMaxGaneshResourceCacheCount = 2048;
|
|
|
| // The limit of the bytes allocated toward GPU resources in the GrContext's
|
| // GPU cache.
|
| -const size_t kMaxGaneshResourceCacheBytes = 96 * 1024 * 1024;
|
| -}
|
| -
|
| -GaneshContext::Scope::Scope(GaneshContext* context)
|
| - : previous_(gles2::GetGLContext()) {
|
| - auto gl = context->gl_context_->gl();
|
| - DCHECK(gl);
|
| - gles2::SetGLContext(gl);
|
| - DCHECK(gles2::GetGLContext());
|
| -}
|
| -
|
| -GaneshContext::Scope::~Scope() {
|
| - gles2::SetGLContext(previous_);
|
| -}
|
| +constexpr size_t kMaxGaneshResourceCacheBytes = 96 * 1024 * 1024;
|
|
|
| GaneshContext::GaneshContext(base::WeakPtr<GLContext> gl_context)
|
| : gl_context_(gl_context) {
|
| DCHECK(gl_context_);
|
| gl_context_->AddObserver(this);
|
| +
|
| Scope scope(this);
|
|
|
| - skia::RefPtr<GrGLInterface> interface =
|
| - skia::AdoptRef(skia_bindings::CreateMojoSkiaGLBinding());
|
| + ::skia::RefPtr<GrGLInterface> interface =
|
| + ::skia::AdoptRef(CreateMojoSkiaGLBinding());
|
| DCHECK(interface);
|
|
|
| - context_ = skia::AdoptRef(GrContext::Create(
|
| + gr_context_ = ::skia::AdoptRef(GrContext::Create(
|
| kOpenGL_GrBackend, reinterpret_cast<GrBackendContext>(interface.get())));
|
| - DCHECK(context_);
|
| - context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount,
|
| - kMaxGaneshResourceCacheBytes);
|
| + DCHECK(gr_context_);
|
| +
|
| + gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount,
|
| + kMaxGaneshResourceCacheBytes);
|
| }
|
|
|
| GaneshContext::~GaneshContext() {
|
| - if (context_) {
|
| - Scope scope(this);
|
| - context_.clear();
|
| - }
|
| - if (gl_context_.get())
|
| + if (gl_context_)
|
| gl_context_->RemoveObserver(this);
|
| -}
|
|
|
| -bool GaneshContext::InScope() const {
|
| - return gl_context_->IsCurrent();
|
| + ReleaseContext();
|
| }
|
|
|
| void GaneshContext::OnContextLost() {
|
| - context_->abandonContext();
|
| - context_.clear();
|
| + ReleaseContext();
|
| +}
|
| +
|
| +void GaneshContext::ReleaseContext() {
|
| + Scope(this);
|
| + gr_context_->abandonContext();
|
| + gr_context_.clear();
|
| gl_context_.reset();
|
| }
|
|
|
| +void GaneshContext::EnterScope() {
|
| + CHECK(!scope_entered_);
|
| + scope_entered_ = true;
|
| +
|
| + if (gl_context_) {
|
| + previous_mgl_context_ = MGLGetCurrentContext();
|
| + gl_context_->MakeCurrent();
|
| +
|
| + // Reset the Ganesh context when entering its scope in case the caller
|
| + // performed low-level GL operations which might interfere with Ganesh's
|
| + // state expectations.
|
| + if (gr_context_)
|
| + gr_context_->resetContext();
|
| + }
|
| +}
|
| +
|
| +void GaneshContext::ExitScope() {
|
| + CHECK(scope_entered_);
|
| + scope_entered_ = false;
|
| +
|
| + // Flush the Ganesh context when exiting its scope.
|
| + if (gr_context_)
|
| + gr_context_->flush();
|
| +
|
| + MGLMakeCurrent(previous_mgl_context_);
|
| + previous_mgl_context_ = MGL_NO_CONTEXT;
|
| +}
|
| +
|
| +} // namespace skia
|
| } // namespace mojo
|
|
|