blob: 42073a8e5d3a474cb4c7acec04d0bba611ca4dae [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2018 The Chromium Authors
Aldo Culquicondor9152d532018-09-25 14:55:142// 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
Hans Wennborg1790e6b2020-04-24 19:10:337#include "base/check_op.h"
Aldo Culquicondor9152d532018-09-25 14:55:148#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"
Kevin Lubick78421a32023-01-05 20:26:3713#include "third_party/skia/include/gpu/GpuTypes.h"
Aldo Culquicondor9152d532018-09-25 14:55:1414#include "third_party/skia/include/gpu/GrBackendSurface.h"
Robert Phillipsdbb0b7d2020-07-29 16:07:4415#include "third_party/skia/include/gpu/GrDirectContext.h"
Aldo Culquicondor9152d532018-09-25 14:55:1416#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
17#include "ui/gfx/geometry/size.h"
18
19namespace vr {
20
21CmdBufferSurfaceProvider::CmdBufferSurfaceProvider() {
22 auto* gles2_implementation =
23 static_cast<gpu::gles2::GLES2Implementation*>(gles2::GetGLContext());
24 DCHECK(gles2_implementation);
25 sk_sp<const GrGLInterface> gr_interface =
26 skia_bindings::CreateGLES2InterfaceBindings(gles2_implementation,
27 gles2_implementation);
Robert Phillipsdbb0b7d2020-07-29 16:07:4428 gr_context_ = GrDirectContext::MakeGL(std::move(gr_interface));
Aldo Culquicondor9152d532018-09-25 14:55:1429 DCHECK(gr_context_);
30 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &main_fbo_);
31}
32
33CmdBufferSurfaceProvider::~CmdBufferSurfaceProvider() = default;
34
35sk_sp<SkSurface> CmdBufferSurfaceProvider::MakeSurface(const gfx::Size& size) {
36 return SkSurface::MakeRenderTarget(
Kevin Lubick78421a32023-01-05 20:26:3737 gr_context_.get(), skgpu::Budgeted::kNo,
Aldo Culquicondor9152d532018-09-25 14:55:1438 SkImageInfo::MakeN32Premul(size.width(), size.height()), 0,
39 kTopLeft_GrSurfaceOrigin, nullptr);
40}
41
42GLuint CmdBufferSurfaceProvider::FlushSurface(SkSurface* surface,
43 GLuint reuse_texture_id) {
44 surface->getCanvas()->flush();
45 GrBackendTexture backend_texture =
46 surface->getBackendTexture(SkSurface::kFlushRead_BackendHandleAccess);
47 DCHECK(backend_texture.isValid());
48 GrGLTextureInfo info;
49 bool result = backend_texture.getGLTextureInfo(&info);
50 DCHECK(result);
51 GLuint texture_id = info.fID;
52 DCHECK_NE(texture_id, 0u);
Adlai Hollerabb78ea2020-09-16 11:27:5753 gr_context_->resetContext();
Aldo Culquicondor9152d532018-09-25 14:55:1454 glBindFramebuffer(GL_FRAMEBUFFER, main_fbo_);
55
56 return texture_id;
57}
58
59} // namespace vr