VR: Ensure state restored properly after skia use.

Each time we call SkSurface::flush or GrDirectContext::flush skia might
alter GL state, we need to ensure that we restore relevant state.

Before this CL FBO was restored to the value it was during construction,
and so it's always 0. But the drawing happens to fbo initialized from
shared image for specific draw, and so in cases skia draw was happening
part of browser ui was rendered to offscreen fbo 0.

This CL hides skia code from users, so we know when flush was called
and restores fbo that was bound before flush.

Bug: 1445523
Change-Id: If105c02948579fa257c92175abe8c9865bb9ccfe
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4623042
Reviewed-by: Alexander Cooper <[email protected]>
Commit-Queue: Vasiliy Telezhnikov <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1160258}
diff --git a/chrome/browser/vr/cmd_buffer_surface_provider.cc b/chrome/browser/vr/cmd_buffer_surface_provider.cc
index e9aff09..ab828b6a 100644
--- a/chrome/browser/vr/cmd_buffer_surface_provider.cc
+++ b/chrome/browser/vr/cmd_buffer_surface_provider.cc
@@ -8,12 +8,7 @@
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "gpu/command_buffer/client/gles2_lib.h"
 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkSurface.h"
-#include "third_party/skia/include/gpu/GpuTypes.h"
-#include "third_party/skia/include/gpu/GrBackendSurface.h"
 #include "third_party/skia/include/gpu/GrDirectContext.h"
-#include "third_party/skia/include/gpu/ganesh/SkSurfaceGanesh.h"
 #include "third_party/skia/include/gpu/gl/GrGLInterface.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -28,33 +23,24 @@
                                                   gles2_implementation);
   gr_context_ = GrDirectContext::MakeGL(std::move(gr_interface));
   DCHECK(gr_context_);
-  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &main_fbo_);
 }
 
 CmdBufferSurfaceProvider::~CmdBufferSurfaceProvider() = default;
 
-sk_sp<SkSurface> CmdBufferSurfaceProvider::MakeSurface(const gfx::Size& size) {
-  return SkSurfaces::RenderTarget(
-      gr_context_.get(), skgpu::Budgeted::kNo,
-      SkImageInfo::MakeN32Premul(size.width(), size.height()), 0,
-      kTopLeft_GrSurfaceOrigin, nullptr);
-}
+std::unique_ptr<SkiaSurfaceProvider::Texture>
+CmdBufferSurfaceProvider::CreateTextureWithSkia(
+    const gfx::Size& size,
+    base::FunctionRef<void(SkCanvas*)> paint) {
+  // We need to store and restore previous FBO after skia draw.
+  GLint prev_fbo = 0;
+  glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_fbo);
 
-GLuint CmdBufferSurfaceProvider::FlushSurface(SkSurface* surface,
-                                              GLuint reuse_texture_id) {
-  surface->getCanvas()->flush();
-  GrBackendTexture backend_texture = SkSurfaces::GetBackendTexture(
-      surface, SkSurfaces::BackendHandleAccess::kFlushRead);
-  DCHECK(backend_texture.isValid());
-  GrGLTextureInfo info;
-  bool result = backend_texture.getGLTextureInfo(&info);
-  DCHECK(result);
-  GLuint texture_id = info.fID;
-  DCHECK_NE(texture_id, 0u);
+  auto texture = CreateTextureWithSkiaImpl(gr_context_.get(), size, paint);
+
   gr_context_->resetContext();
-  glBindFramebuffer(GL_FRAMEBUFFER, main_fbo_);
+  glBindFramebuffer(GL_FRAMEBUFFER, prev_fbo);
 
-  return texture_id;
+  return texture;
 }
 
 }  // namespace vr