11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/output/compositor_frame.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/buffer_queue.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/reflector_impl.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/gpu/gpu_surface_tracker.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/gpu/client/context_provider_command_buffer.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/GLES2/gl2extchromium.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/client/gles2_interface.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGpuSurfacelessBrowserCompositorOutputSurface::
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GpuSurfacelessBrowserCompositorOutputSurface(
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const scoped_refptr<ContextProviderCommandBuffer>& context,
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        int surface_id,
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        IDMap<BrowserCompositorOutputSurface>* output_surface_map,
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        scoped_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        unsigned internalformat)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : GpuBrowserCompositorOutputSurface(context,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        surface_id,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        output_surface_map,
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        vsync_manager,
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        overlay_candidate_validator.Pass()),
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      internalformat_(internalformat) {
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGpuSurfacelessBrowserCompositorOutputSurface::
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~GpuSurfacelessBrowserCompositorOutputSurface() {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuSurfacelessBrowserCompositorOutputSurface::SwapBuffers(
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cc::CompositorFrame* frame) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(output_surface_);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GLuint texture = output_surface_->current_texture_id();
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  output_surface_->SwapBuffers(frame->gl_frame_data->sub_buffer_rect);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gfx::Size& size = frame->gl_frame_data->size;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  context_provider_->ContextGL()->ScheduleOverlayPlaneCHROMIUM(
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      0,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GL_OVERLAY_TRANSFORM_NONE_CHROMIUM,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      texture,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      0,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      0,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      size.width(),
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      size.height(),
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      0,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      0,
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1.0f,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      1.0f);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GpuBrowserCompositorOutputSurface::SwapBuffers(frame);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuSurfacelessBrowserCompositorOutputSurface::OnSwapBuffersComplete() {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(output_surface_);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  output_surface_->PageFlipComplete();
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GpuBrowserCompositorOutputSurface::OnSwapBuffersComplete();
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuSurfacelessBrowserCompositorOutputSurface::BindFramebuffer() {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(output_surface_);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  output_surface_->BindFramebuffer();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuSurfacelessBrowserCompositorOutputSurface::Reshape(
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const gfx::Size& size,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    float scale_factor) {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GpuBrowserCompositorOutputSurface::Reshape(size, scale_factor);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(output_surface_);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  output_surface_->Reshape(SurfaceSize(), scale_factor);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool GpuSurfacelessBrowserCompositorOutputSurface::BindToClient(
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cc::OutputSurfaceClient* client) {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!GpuBrowserCompositorOutputSurface::BindToClient(client))
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  output_surface_.reset(new BufferQueue(context_provider_, internalformat_));
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return output_surface_->Initialize();
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace content
87