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"
20 Display::Display(DisplayClient* client,
21 SurfaceManager* manager,
22 SharedBitmapManager* bitmap_manager)
23 : client_(client), manager_(manager), bitmap_manager_(bitmap_manager) {
29 void Display::Resize(SurfaceId id, const gfx::Size& size) {
30 current_surface_id_ = id;
31 current_surface_size_ = size;
34 void Display::InitializeOutputSurface() {
37 scoped_ptr<OutputSurface> output_surface = client_->CreateOutputSurface();
38 if (!output_surface->BindToClient(this))
41 int highp_threshold_min = 0;
42 bool use_rgba_4444_texture_format = false;
43 size_t id_allocation_chunk_size = 1;
44 bool use_distance_field_text = false;
45 scoped_ptr<ResourceProvider> resource_provider =
46 ResourceProvider::Create(output_surface.get(),
49 use_rgba_4444_texture_format,
50 id_allocation_chunk_size,
51 use_distance_field_text);
52 if (!resource_provider)
55 if (output_surface->context_provider()) {
56 TextureMailboxDeleter* texture_mailbox_deleter = NULL;
57 scoped_ptr<GLRenderer> renderer =
58 GLRenderer::Create(this,
61 resource_provider.get(),
62 texture_mailbox_deleter,
66 renderer_ = renderer.Pass();
68 scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create(
69 this, &settings_, output_surface.get(), resource_provider.get());
72 renderer_ = renderer.Pass();
75 output_surface_ = output_surface.Pass();
76 resource_provider_ = resource_provider.Pass();
77 aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get()));
80 bool Display::Draw() {
81 if (current_surface_id_.is_null())
84 InitializeOutputSurface();
88 scoped_ptr<CompositorFrame> frame =
89 aggregator_->Aggregate(current_surface_id_);
93 TRACE_EVENT0("cc", "Display::Draw");
94 DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
96 // Only reshape when we know we are going to draw. Otherwise, the reshape
97 // can leave the window at the wrong size if we never draw and the proper
98 // viewport size is never set.
99 output_surface_->Reshape(current_surface_size_, 1.f);
100 float device_scale_factor = 1.0f;
101 gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_);
102 gfx::Rect device_clip_rect = device_viewport_rect;
103 bool disable_picture_quad_image_filtering = false;
105 renderer_->DecideRenderPassAllocationsForFrame(frame_data->render_pass_list);
106 renderer_->DrawFrame(&frame_data->render_pass_list,
108 device_viewport_rect,
110 disable_picture_quad_image_filtering);
111 CompositorFrameMetadata metadata;
112 renderer_->SwapBuffers(metadata);
116 SurfaceId Display::CurrentSurfaceId() {
117 return current_surface_id_;