blob: b148eaeb94dabf115c3ab0730a39fe2bba8a9c75 [file] [log] [blame]
Aldo Culquicondor9152d532018-09-25 14:55:141// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/vr/cmd_buffer_surface_provider.h"
6
7#include "base/logging.h"
8#include "gpu/command_buffer/client/gles2_implementation.h"
9#include "gpu/command_buffer/client/gles2_lib.h"
10#include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
11#include "third_party/skia/include/core/SkCanvas.h"
12#include "third_party/skia/include/core/SkSurface.h"
13#include "third_party/skia/include/gpu/GrBackendSurface.h"
14#include "third_party/skia/include/gpu/GrContext.h"
15#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
16#include "ui/gfx/geometry/size.h"
17
18namespace vr {
19
20CmdBufferSurfaceProvider::CmdBufferSurfaceProvider() {
21 auto* gles2_implementation =
22 static_cast<gpu::gles2::GLES2Implementation*>(gles2::GetGLContext());
23 DCHECK(gles2_implementation);
24 sk_sp<const GrGLInterface> gr_interface =
25 skia_bindings::CreateGLES2InterfaceBindings(gles2_implementation,
26 gles2_implementation);
27 gr_context_ = GrContext::MakeGL(std::move(gr_interface));
28 DCHECK(gr_context_);
29 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &main_fbo_);
30}
31
32CmdBufferSurfaceProvider::~CmdBufferSurfaceProvider() = default;
33
34sk_sp<SkSurface> CmdBufferSurfaceProvider::MakeSurface(const gfx::Size& size) {
35 return SkSurface::MakeRenderTarget(
36 gr_context_.get(), SkBudgeted::kNo,
37 SkImageInfo::MakeN32Premul(size.width(), size.height()), 0,
38 kTopLeft_GrSurfaceOrigin, nullptr);
39}
40
41GLuint CmdBufferSurfaceProvider::FlushSurface(SkSurface* surface,
42 GLuint reuse_texture_id) {
43 surface->getCanvas()->flush();
44 GrBackendTexture backend_texture =
45 surface->getBackendTexture(SkSurface::kFlushRead_BackendHandleAccess);
46 DCHECK(backend_texture.isValid());
47 GrGLTextureInfo info;
48 bool result = backend_texture.getGLTextureInfo(&info);
49 DCHECK(result);
50 GLuint texture_id = info.fID;
51 DCHECK_NE(texture_id, 0u);
52 surface->getCanvas()->getGrContext()->resetContext();
53 glBindFramebuffer(GL_FRAMEBUFFER, main_fbo_);
54
55 return texture_id;
56}
57
58} // namespace vr