1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/aura/gpu_browser_compositor_output_surface.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/output/compositor_frame.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/aura/reflector_impl.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content {
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GpuBrowserCompositorOutputSurface::GpuBrowserCompositorOutputSurface(
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<ContextProviderCommandBuffer>& context,
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int surface_id,
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    IDMap<BrowserCompositorOutputSurface>* output_surface_map,
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::MessageLoopProxy* compositor_message_loop,
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::WeakPtr<ui::Compositor> compositor)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : BrowserCompositorOutputSurface(context,
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     surface_id,
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     output_surface_map,
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     compositor_message_loop,
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     compositor) {}
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GpuBrowserCompositorOutputSurface::~GpuBrowserCompositorOutputSurface() {}
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GpuBrowserCompositorOutputSurface::SwapBuffers(
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    cc::CompositorFrame* frame) {
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(frame->gl_frame_data);
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebGraphicsContext3DCommandBufferImpl* command_buffer_context =
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<WebGraphicsContext3DCommandBufferImpl*>(
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          context_provider_->Context3d());
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CommandBufferProxyImpl* command_buffer_proxy =
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      command_buffer_context->GetCommandBufferProxy();
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(command_buffer_proxy);
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context_provider_->Context3d()->shallowFlushCHROMIUM();
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  command_buffer_proxy->SetLatencyInfo(frame->metadata.latency_info);
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (reflector_.get()) {
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (frame->gl_frame_data->sub_buffer_rect ==
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        gfx::Rect(frame->gl_frame_data->size))
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reflector_->OnSwapBuffers();
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    else
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reflector_->OnPostSubBuffer(frame->gl_frame_data->sub_buffer_rect);
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OutputSurface::SwapBuffers(frame);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace content
52