1// Copyright 2014 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 "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h"
6
7#include "cc/output/compositor_frame.h"
8#include "content/browser/compositor/buffer_queue.h"
9#include "content/browser/compositor/reflector_impl.h"
10#include "content/browser/gpu/gpu_surface_tracker.h"
11#include "content/common/gpu/client/context_provider_command_buffer.h"
12#include "gpu/GLES2/gl2extchromium.h"
13#include "gpu/command_buffer/client/gles2_interface.h"
14
15namespace content {
16
17GpuSurfacelessBrowserCompositorOutputSurface::
18    GpuSurfacelessBrowserCompositorOutputSurface(
19        const scoped_refptr<ContextProviderCommandBuffer>& context,
20        int surface_id,
21        IDMap<BrowserCompositorOutputSurface>* output_surface_map,
22        const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
23        scoped_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator,
24        unsigned internalformat)
25    : GpuBrowserCompositorOutputSurface(context,
26                                        surface_id,
27                                        output_surface_map,
28                                        vsync_manager,
29                                        overlay_candidate_validator.Pass()),
30      internalformat_(internalformat) {
31}
32
33GpuSurfacelessBrowserCompositorOutputSurface::
34    ~GpuSurfacelessBrowserCompositorOutputSurface() {
35}
36
37void GpuSurfacelessBrowserCompositorOutputSurface::SwapBuffers(
38    cc::CompositorFrame* frame) {
39  DCHECK(output_surface_);
40
41  GLuint texture = output_surface_->current_texture_id();
42  output_surface_->SwapBuffers(frame->gl_frame_data->sub_buffer_rect);
43  const gfx::Size& size = frame->gl_frame_data->size;
44  context_provider_->ContextGL()->ScheduleOverlayPlaneCHROMIUM(
45      0,
46      GL_OVERLAY_TRANSFORM_NONE_CHROMIUM,
47      texture,
48      0,
49      0,
50      size.width(),
51      size.height(),
52      0,
53      0,
54      1.0f,
55      1.0f);
56  GpuBrowserCompositorOutputSurface::SwapBuffers(frame);
57}
58
59void GpuSurfacelessBrowserCompositorOutputSurface::OnSwapBuffersComplete() {
60  DCHECK(output_surface_);
61  output_surface_->PageFlipComplete();
62  GpuBrowserCompositorOutputSurface::OnSwapBuffersComplete();
63}
64
65void GpuSurfacelessBrowserCompositorOutputSurface::BindFramebuffer() {
66  DCHECK(output_surface_);
67  output_surface_->BindFramebuffer();
68}
69
70void GpuSurfacelessBrowserCompositorOutputSurface::Reshape(
71    const gfx::Size& size,
72    float scale_factor) {
73  GpuBrowserCompositorOutputSurface::Reshape(size, scale_factor);
74  DCHECK(output_surface_);
75  output_surface_->Reshape(SurfaceSize(), scale_factor);
76}
77
78bool GpuSurfacelessBrowserCompositorOutputSurface::BindToClient(
79    cc::OutputSurfaceClient* client) {
80  if (!GpuBrowserCompositorOutputSurface::BindToClient(client))
81    return false;
82  output_surface_.reset(new BufferQueue(context_provider_, internalformat_));
83  return output_surface_->Initialize();
84}
85
86}  // namespace content
87