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