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