Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / cc / surfaces / display.cc
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.
4
5 #include "cc/surfaces/display.h"
6
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
18 namespace cc {
19
20 Display::Display(DisplayClient* client,
21                  SurfaceManager* manager,
22                  SharedBitmapManager* bitmap_manager)
23     : client_(client), manager_(manager), bitmap_manager_(bitmap_manager) {
24 }
25
26 Display::~Display() {
27 }
28
29 void Display::Resize(SurfaceId id, const gfx::Size& size) {
30   current_surface_id_ = id;
31   current_surface_size_ = size;
32 }
33
34 void Display::InitializeOutputSurface() {
35   if (output_surface_)
36     return;
37   scoped_ptr<OutputSurface> output_surface = client_->CreateOutputSurface();
38   if (!output_surface->BindToClient(this))
39     return;
40
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(),
47                                bitmap_manager_,
48                                highp_threshold_min,
49                                use_rgba_4444_texture_format,
50                                id_allocation_chunk_size,
51                                use_distance_field_text);
52   if (!resource_provider)
53     return;
54
55   if (output_surface->context_provider()) {
56     TextureMailboxDeleter* texture_mailbox_deleter = NULL;
57     scoped_ptr<GLRenderer> renderer =
58         GLRenderer::Create(this,
59                            &settings_,
60                            output_surface.get(),
61                            resource_provider.get(),
62                            texture_mailbox_deleter,
63                            highp_threshold_min);
64     if (!renderer)
65       return;
66     renderer_ = renderer.Pass();
67   } else {
68     scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create(
69         this, &settings_, output_surface.get(), resource_provider.get());
70     if (!renderer)
71       return;
72     renderer_ = renderer.Pass();
73   }
74
75   output_surface_ = output_surface.Pass();
76   resource_provider_ = resource_provider.Pass();
77   aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get()));
78 }
79
80 bool Display::Draw() {
81   if (current_surface_id_.is_null())
82     return false;
83
84   InitializeOutputSurface();
85   if (!output_surface_)
86     return false;
87
88   scoped_ptr<CompositorFrame> frame =
89       aggregator_->Aggregate(current_surface_id_);
90   if (!frame)
91     return false;
92
93   TRACE_EVENT0("cc", "Display::Draw");
94   DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
95
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;
104
105   renderer_->DecideRenderPassAllocationsForFrame(frame_data->render_pass_list);
106   renderer_->DrawFrame(&frame_data->render_pass_list,
107                        device_scale_factor,
108                        device_viewport_rect,
109                        device_clip_rect,
110                        disable_picture_quad_image_filtering);
111   CompositorFrameMetadata metadata;
112   renderer_->SwapBuffers(metadata);
113   return true;
114 }
115
116 SurfaceId Display::CurrentSurfaceId() {
117   return current_surface_id_;
118 }
119
120 }  // namespace cc