blob: 32f04a57bf8f41ce84a23388e1fd2c9f351f744d [file] [log] [blame]
// Copyright 2017 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/ganesh_surface_provider.h"
#include "skia/ext/texture_handle.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/gpu/GrContext.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_version_info.h"
#include "ui/gl/init/create_gr_gl_interface.h"
namespace vr {
GaneshSurfaceProvider::GaneshSurfaceProvider() {
const char* version_str =
reinterpret_cast<const char*>(glGetString(GL_VERSION));
const char* renderer_str =
reinterpret_cast<const char*>(glGetString(GL_RENDERER));
std::string extensions_string(gl::GetGLExtensionsFromCurrentContext());
gl::ExtensionSet extensions(gl::MakeExtensionSet(extensions_string));
gl::GLVersionInfo gl_version_info(version_str, renderer_str, extensions);
sk_sp<const GrGLInterface> gr_interface =
gl::init::CreateGrGLInterface(gl_version_info);
DCHECK(gr_interface.get());
gr_context_ = GrContext::MakeGL(std::move(gr_interface));
DCHECK(gr_context_.get());
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &main_fbo_);
}
GaneshSurfaceProvider::~GaneshSurfaceProvider() = default;
sk_sp<SkSurface> GaneshSurfaceProvider::MakeSurface(const gfx::Size& size) {
return SkSurface::MakeRenderTarget(
gr_context_.get(), SkBudgeted::kNo,
SkImageInfo::MakeN32Premul(size.width(), size.height()), 0,
kTopLeft_GrSurfaceOrigin, nullptr);
}
GLuint GaneshSurfaceProvider::FlushSurface(SkSurface* surface,
GLuint reuse_texture_id) {
surface->getCanvas()->flush();
GrBackendObject backend_object =
surface->getTextureHandle(SkSurface::kFlushRead_BackendHandleAccess);
DCHECK_NE(backend_object, 0);
GLuint texture_id =
skia::GrBackendObjectToGrGLTextureInfo(backend_object)->fID;
DCHECK_NE(texture_id, 0u);
surface->getCanvas()->getGrContext()->resetContext();
glBindFramebufferEXT(GL_FRAMEBUFFER, main_fbo_);
return texture_id;
}
} // namespace vr