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"
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);
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() {
41 scoped_ptr
<OutputSurface
> output_surface
= client_
->CreateOutputSurface();
42 if (!output_surface
->BindToClient(this))
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(),
53 use_rgba_4444_texture_format
,
54 id_allocation_chunk_size
,
55 use_distance_field_text
);
56 if (!resource_provider
)
59 if (output_surface
->context_provider()) {
60 TextureMailboxDeleter
* texture_mailbox_deleter
= NULL
;
61 scoped_ptr
<GLRenderer
> renderer
=
62 GLRenderer::Create(this,
65 resource_provider
.get(),
66 texture_mailbox_deleter
,
70 renderer_
= renderer
.Pass();
72 scoped_ptr
<SoftwareRenderer
> renderer
= SoftwareRenderer::Create(
73 this, &settings_
, output_surface
.get(), resource_provider
.get());
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())
88 InitializeOutputSurface();
92 contained_surfaces_
.clear();
94 scoped_ptr
<CompositorFrame
> frame
=
95 aggregator_
->Aggregate(current_surface_id_
, &contained_surfaces_
);
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
,
114 device_viewport_rect
,
116 disable_picture_quad_image_filtering
);
117 CompositorFrameMetadata metadata
;
118 renderer_
->SwapBuffers(metadata
);
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_
;