Componentize component_updater: Copy over test data with executable bit.
[chromium-blink-merge.git] / cc / surfaces / display.cc
blobdf64a6c908cb60ef785802ca3ca61ea73f17e647
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.
5 #include "cc/surfaces/display.h"
7 #include "base/debug/trace_event.h"
8 #include "base/message_loop/message_loop.h"
9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h"
11 #include "cc/output/direct_renderer.h"
12 #include "cc/output/gl_renderer.h"
13 #include "cc/output/software_renderer.h"
14 #include "cc/surfaces/display_client.h"
15 #include "cc/surfaces/surface.h"
16 #include "cc/surfaces/surface_aggregator.h"
17 #include "cc/surfaces/surface_manager.h"
19 namespace cc {
21 Display::Display(DisplayClient* client,
22 SurfaceManager* manager,
23 SharedBitmapManager* bitmap_manager)
24 : client_(client), manager_(manager), bitmap_manager_(bitmap_manager) {
25 manager_->AddObserver(this);
28 Display::~Display() {
29 manager_->RemoveObserver(this);
32 void Display::Resize(SurfaceId id, const gfx::Size& size) {
33 current_surface_id_ = id;
34 current_surface_size_ = size;
35 client_->DisplayDamaged();
38 void Display::InitializeOutputSurface() {
39 if (output_surface_)
40 return;
41 scoped_ptr<OutputSurface> output_surface = client_->CreateOutputSurface();
42 if (!output_surface->BindToClient(this))
43 return;
45 int highp_threshold_min = 0;
46 bool use_rgba_4444_texture_format = false;
47 size_t id_allocation_chunk_size = 1;
48 bool use_distance_field_text = false;
49 scoped_ptr<ResourceProvider> resource_provider =
50 ResourceProvider::Create(output_surface.get(),
51 bitmap_manager_,
52 highp_threshold_min,
53 use_rgba_4444_texture_format,
54 id_allocation_chunk_size,
55 use_distance_field_text);
56 if (!resource_provider)
57 return;
59 if (output_surface->context_provider()) {
60 TextureMailboxDeleter* texture_mailbox_deleter = NULL;
61 scoped_ptr<GLRenderer> renderer =
62 GLRenderer::Create(this,
63 &settings_,
64 output_surface.get(),
65 resource_provider.get(),
66 texture_mailbox_deleter,
67 highp_threshold_min);
68 if (!renderer)
69 return;
70 renderer_ = renderer.Pass();
71 } else {
72 scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create(
73 this, &settings_, output_surface.get(), resource_provider.get());
74 if (!renderer)
75 return;
76 renderer_ = renderer.Pass();
79 output_surface_ = output_surface.Pass();
80 resource_provider_ = resource_provider.Pass();
81 aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get()));
84 bool Display::Draw() {
85 if (current_surface_id_.is_null())
86 return false;
88 InitializeOutputSurface();
89 if (!output_surface_)
90 return false;
92 contained_surfaces_.clear();
94 scoped_ptr<CompositorFrame> frame =
95 aggregator_->Aggregate(current_surface_id_, &contained_surfaces_);
96 if (!frame)
97 return false;
99 TRACE_EVENT0("cc", "Display::Draw");
100 DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
102 // Only reshape when we know we are going to draw. Otherwise, the reshape
103 // can leave the window at the wrong size if we never draw and the proper
104 // viewport size is never set.
105 output_surface_->Reshape(current_surface_size_, 1.f);
106 float device_scale_factor = 1.0f;
107 gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_);
108 gfx::Rect device_clip_rect = device_viewport_rect;
109 bool disable_picture_quad_image_filtering = false;
111 renderer_->DecideRenderPassAllocationsForFrame(frame_data->render_pass_list);
112 renderer_->DrawFrame(&frame_data->render_pass_list,
113 device_scale_factor,
114 device_viewport_rect,
115 device_clip_rect,
116 disable_picture_quad_image_filtering);
117 CompositorFrameMetadata metadata;
118 renderer_->SwapBuffers(metadata);
119 return true;
122 void Display::OnSurfaceDamaged(SurfaceId surface) {
123 if (contained_surfaces_.find(surface) != contained_surfaces_.end())
124 client_->DisplayDamaged();
127 SurfaceId Display::CurrentSurfaceId() {
128 return current_surface_id_;
131 } // namespace cc