io_surface_layer_impl.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright 2012 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 "cc/layers/io_surface_layer_impl.h"
6
7#include "base/strings/stringprintf.h"
8#include "cc/output/gl_renderer.h"  // For the GLC() macro.
9#include "cc/output/output_surface.h"
10#include "cc/quads/io_surface_draw_quad.h"
11#include "cc/trees/layer_tree_impl.h"
12#include "cc/trees/occlusion_tracker.h"
13#include "gpu/GLES2/gl2extchromium.h"
14#include "gpu/command_buffer/client/gles2_interface.h"
15#include "third_party/khronos/GLES2/gl2.h"
16#include "third_party/khronos/GLES2/gl2ext.h"
17
18namespace cc {
19
20IOSurfaceLayerImpl::IOSurfaceLayerImpl(LayerTreeImpl* tree_impl, int id)
21    : LayerImpl(tree_impl, id),
22      io_surface_id_(0),
23      io_surface_changed_(false),
24      io_surface_resource_id_(0) {}
25
26IOSurfaceLayerImpl::~IOSurfaceLayerImpl() {
27  DestroyResource();
28}
29
30void IOSurfaceLayerImpl::DestroyResource() {
31  if (io_surface_resource_id_) {
32    ResourceProvider* resource_provider =
33        layer_tree_impl()->resource_provider();
34    resource_provider->DeleteResource(io_surface_resource_id_);
35    io_surface_resource_id_ = 0;
36  }
37}
38
39scoped_ptr<LayerImpl> IOSurfaceLayerImpl::CreateLayerImpl(
40    LayerTreeImpl* tree_impl) {
41  return IOSurfaceLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
42}
43
44void IOSurfaceLayerImpl::PushPropertiesTo(LayerImpl* layer) {
45  LayerImpl::PushPropertiesTo(layer);
46
47  IOSurfaceLayerImpl* io_surface_layer =
48      static_cast<IOSurfaceLayerImpl*>(layer);
49  io_surface_layer->SetIOSurfaceProperties(io_surface_id_, io_surface_size_);
50}
51
52bool IOSurfaceLayerImpl::WillDraw(DrawMode draw_mode,
53                                  ResourceProvider* resource_provider) {
54  if (draw_mode != DRAW_MODE_HARDWARE)
55    return false;
56
57  if (io_surface_changed_) {
58    DestroyResource();
59    io_surface_resource_id_ = resource_provider->CreateResourceFromIOSurface(
60        io_surface_size_, io_surface_id_);
61    io_surface_changed_ = false;
62  }
63
64  return LayerImpl::WillDraw(draw_mode, resource_provider);
65}
66
67void IOSurfaceLayerImpl::AppendQuads(
68    RenderPass* render_pass,
69    const OcclusionTracker<LayerImpl>& occlusion_tracker,
70    AppendQuadsData* append_quads_data) {
71  SharedQuadState* shared_quad_state =
72      render_pass->CreateAndAppendSharedQuadState();
73  PopulateSharedQuadState(shared_quad_state);
74
75  AppendDebugBorderQuad(
76      render_pass, content_bounds(), shared_quad_state, append_quads_data);
77
78  gfx::Rect quad_rect(content_bounds());
79  gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
80  gfx::Rect visible_quad_rect =
81      occlusion_tracker.GetCurrentOcclusionForLayer(
82                            draw_properties().target_space_transform)
83          .GetUnoccludedContentRect(quad_rect);
84  if (visible_quad_rect.IsEmpty())
85    return;
86
87  IOSurfaceDrawQuad* quad =
88      render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>();
89  quad->SetNew(shared_quad_state,
90               quad_rect,
91               opaque_rect,
92               visible_quad_rect,
93               io_surface_size_,
94               io_surface_resource_id_,
95               IOSurfaceDrawQuad::FLIPPED);
96}
97
98void IOSurfaceLayerImpl::ReleaseResources() {
99  // We don't have a valid resource ID in the new context; however,
100  // the IOSurface is still valid.
101  DestroyResource();
102  io_surface_changed_ = true;
103}
104
105void IOSurfaceLayerImpl::SetIOSurfaceProperties(unsigned io_surface_id,
106                                                const gfx::Size& size) {
107  if (io_surface_id_ != io_surface_id)
108    io_surface_changed_ = true;
109
110  io_surface_id_ = io_surface_id;
111  io_surface_size_ = size;
112}
113
114const char* IOSurfaceLayerImpl::LayerTypeAsString() const {
115  return "cc::IOSurfaceLayerImpl";
116}
117
118}  // namespace cc
119