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/output/compositor_frame.h"
6 #include "cc/quads/render_pass.h"
7 #include "cc/quads/solid_color_draw_quad.h"
8 #include "cc/quads/surface_draw_quad.h"
9 #include "cc/surfaces/surface.h"
10 #include "cc/surfaces/surface_aggregator.h"
11 #include "cc/surfaces/surface_manager.h"
12 #include "cc/test/pixel_comparator.h"
13 #include "cc/test/pixel_test.h"
14 #include "testing/gtest/include/gtest/gtest.h"
16 #if !defined(OS_ANDROID)
21 class SurfacesPixelTest
: public RendererPixelTest
<GLRenderer
> {
23 SurfaceManager manager_
;
26 SharedQuadState
* CreateAndAppendTestSharedQuadState(
27 RenderPass
* render_pass
,
28 const gfx::Transform
& transform
,
29 const gfx::Size
& size
) {
30 const gfx::Size content_bounds
= size
;
31 const gfx::Rect visible_content_rect
= gfx::Rect(size
);
32 const gfx::Rect clip_rect
= gfx::Rect(size
);
33 bool is_clipped
= false;
35 const SkXfermode::Mode blend_mode
= SkXfermode::kSrcOver_Mode
;
36 SharedQuadState
* shared_state
= render_pass
->CreateAndAppendSharedQuadState();
37 shared_state
->SetAll(transform
,
47 // Draws a very simple frame with no surface references.
48 TEST_F(SurfacesPixelTest
, DrawSimpleFrame
) {
49 gfx::Rect
rect(device_viewport_size_
);
50 RenderPass::Id
id(1, 1);
51 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
52 pass
->SetNew(id
, rect
, rect
, gfx::Transform());
54 CreateAndAppendTestSharedQuadState(
55 pass
.get(), gfx::Transform(), device_viewport_size_
);
57 scoped_ptr
<SolidColorDrawQuad
> color_quad
= SolidColorDrawQuad::Create();
58 bool force_anti_aliasing_off
= false;
59 color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
63 force_anti_aliasing_off
);
64 pass
->quad_list
.push_back(color_quad
.PassAs
<DrawQuad
>());
66 scoped_ptr
<DelegatedFrameData
> delegated_frame_data(new DelegatedFrameData
);
67 delegated_frame_data
->render_pass_list
.push_back(pass
.Pass());
69 scoped_ptr
<CompositorFrame
> root_frame(new CompositorFrame
);
70 root_frame
->delegated_frame_data
= delegated_frame_data
.Pass();
72 Surface
root_surface(&manager_
, NULL
, device_viewport_size_
);
73 root_surface
.QueueFrame(root_frame
.Pass());
75 SurfaceAggregator
aggregator(&manager_
);
76 scoped_ptr
<CompositorFrame
> aggregated_frame
=
77 aggregator
.Aggregate(root_surface
.surface_id());
79 bool discard_alpha
= false;
80 ExactPixelComparator
pixel_comparator(discard_alpha
);
81 RenderPassList
* pass_list
=
82 &aggregated_frame
->delegated_frame_data
->render_pass_list
;
83 EXPECT_TRUE(RunPixelTest(pass_list
,
84 base::FilePath(FILE_PATH_LITERAL("green.png")),
88 // Draws a frame with simple surface embedding.
89 TEST_F(SurfacesPixelTest
, DrawSimpleAggregatedFrame
) {
90 gfx::Size
child_size(200, 100);
91 Surface
child_surface(&manager_
, NULL
, child_size
);
92 Surface
root_surface(&manager_
, NULL
, device_viewport_size_
);
95 gfx::Rect
rect(device_viewport_size_
);
96 RenderPass::Id
id(1, 1);
97 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
98 pass
->SetNew(id
, rect
, rect
, gfx::Transform());
100 CreateAndAppendTestSharedQuadState(
101 pass
.get(), gfx::Transform(), device_viewport_size_
);
103 scoped_ptr
<SurfaceDrawQuad
> surface_quad
= SurfaceDrawQuad::Create();
104 surface_quad
->SetNew(pass
->shared_quad_state_list
.back(),
105 gfx::Rect(child_size
),
106 gfx::Rect(child_size
),
107 child_surface
.surface_id());
108 pass
->quad_list
.push_back(surface_quad
.PassAs
<DrawQuad
>());
110 scoped_ptr
<SolidColorDrawQuad
> color_quad
= SolidColorDrawQuad::Create();
111 bool force_anti_aliasing_off
= false;
112 color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
116 force_anti_aliasing_off
);
117 pass
->quad_list
.push_back(color_quad
.PassAs
<DrawQuad
>());
119 scoped_ptr
<DelegatedFrameData
> delegated_frame_data(new DelegatedFrameData
);
120 delegated_frame_data
->render_pass_list
.push_back(pass
.Pass());
122 scoped_ptr
<CompositorFrame
> root_frame(new CompositorFrame
);
123 root_frame
->delegated_frame_data
= delegated_frame_data
.Pass();
125 root_surface
.QueueFrame(root_frame
.Pass());
129 gfx::Rect
rect(child_size
);
130 RenderPass::Id
id(1, 1);
131 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
132 pass
->SetNew(id
, rect
, rect
, gfx::Transform());
134 CreateAndAppendTestSharedQuadState(
135 pass
.get(), gfx::Transform(), child_size
);
137 scoped_ptr
<SolidColorDrawQuad
> color_quad
= SolidColorDrawQuad::Create();
138 bool force_anti_aliasing_off
= false;
139 color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
143 force_anti_aliasing_off
);
144 pass
->quad_list
.push_back(color_quad
.PassAs
<DrawQuad
>());
146 scoped_ptr
<DelegatedFrameData
> delegated_frame_data(new DelegatedFrameData
);
147 delegated_frame_data
->render_pass_list
.push_back(pass
.Pass());
149 scoped_ptr
<CompositorFrame
> child_frame(new CompositorFrame
);
150 child_frame
->delegated_frame_data
= delegated_frame_data
.Pass();
152 child_surface
.QueueFrame(child_frame
.Pass());
155 SurfaceAggregator
aggregator(&manager_
);
156 scoped_ptr
<CompositorFrame
> aggregated_frame
=
157 aggregator
.Aggregate(root_surface
.surface_id());
159 bool discard_alpha
= false;
160 ExactPixelComparator
pixel_comparator(discard_alpha
);
161 RenderPassList
* pass_list
=
162 &aggregated_frame
->delegated_frame_data
->render_pass_list
;
163 EXPECT_TRUE(RunPixelTest(pass_list
,
164 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
168 // Tests a surface quad that has a non-identity transform into its pass.
169 TEST_F(SurfacesPixelTest
, DrawAggregatedFrameWithSurfaceTransforms
) {
170 gfx::Size
child_size(100, 200);
171 gfx::Size
quad_size(100, 100);
173 // root (200x200) -> left_child (100x200 @ 0x0,
174 // right_child (100x200 @ 0x100)
175 // left_child -> top_green_quad (100x100 @ 0x0),
176 // bottom_blue_quad (100x100 @ 0x100)
177 // right_child -> top_blue_quad (100x100 @ 0x0),
178 // bottom_green_quad (100x100 @ 0x100)
179 Surface
left_child(&manager_
, NULL
, child_size
);
180 Surface
right_child(&manager_
, NULL
, child_size
);
181 Surface
root_surface(&manager_
, NULL
, device_viewport_size_
);
184 gfx::Rect
rect(device_viewport_size_
);
185 RenderPass::Id
id(1, 1);
186 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
187 pass
->SetNew(id
, rect
, rect
, gfx::Transform());
189 gfx::Transform surface_transform
;
190 CreateAndAppendTestSharedQuadState(
191 pass
.get(), surface_transform
, device_viewport_size_
);
193 scoped_ptr
<SurfaceDrawQuad
> left_surface_quad
= SurfaceDrawQuad::Create();
194 left_surface_quad
->SetNew(pass
->shared_quad_state_list
.back(),
195 gfx::Rect(child_size
),
196 gfx::Rect(child_size
),
197 left_child
.surface_id());
198 pass
->quad_list
.push_back(left_surface_quad
.PassAs
<DrawQuad
>());
200 surface_transform
.Translate(100, 0);
201 CreateAndAppendTestSharedQuadState(
202 pass
.get(), surface_transform
, device_viewport_size_
);
204 scoped_ptr
<SurfaceDrawQuad
> right_surface_quad
= SurfaceDrawQuad::Create();
205 right_surface_quad
->SetNew(pass
->shared_quad_state_list
.back(),
206 gfx::Rect(child_size
),
207 gfx::Rect(child_size
),
208 right_child
.surface_id());
209 pass
->quad_list
.push_back(right_surface_quad
.PassAs
<DrawQuad
>());
211 scoped_ptr
<DelegatedFrameData
> delegated_frame_data(new DelegatedFrameData
);
212 delegated_frame_data
->render_pass_list
.push_back(pass
.Pass());
214 scoped_ptr
<CompositorFrame
> root_frame(new CompositorFrame
);
215 root_frame
->delegated_frame_data
= delegated_frame_data
.Pass();
217 root_surface
.QueueFrame(root_frame
.Pass());
221 gfx::Rect
rect(child_size
);
222 RenderPass::Id
id(1, 1);
223 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
224 pass
->SetNew(id
, rect
, rect
, gfx::Transform());
226 CreateAndAppendTestSharedQuadState(
227 pass
.get(), gfx::Transform(), child_size
);
229 scoped_ptr
<SolidColorDrawQuad
> top_color_quad
=
230 SolidColorDrawQuad::Create();
231 bool force_anti_aliasing_off
= false;
232 top_color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
233 gfx::Rect(quad_size
),
234 gfx::Rect(quad_size
),
236 force_anti_aliasing_off
);
237 pass
->quad_list
.push_back(top_color_quad
.PassAs
<DrawQuad
>());
239 scoped_ptr
<SolidColorDrawQuad
> bottom_color_quad
=
240 SolidColorDrawQuad::Create();
241 bottom_color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
242 gfx::Rect(0, 100, 100, 100),
243 gfx::Rect(0, 100, 100, 100),
245 force_anti_aliasing_off
);
246 pass
->quad_list
.push_back(bottom_color_quad
.PassAs
<DrawQuad
>());
248 scoped_ptr
<DelegatedFrameData
> delegated_frame_data(new DelegatedFrameData
);
249 delegated_frame_data
->render_pass_list
.push_back(pass
.Pass());
251 scoped_ptr
<CompositorFrame
> child_frame(new CompositorFrame
);
252 child_frame
->delegated_frame_data
= delegated_frame_data
.Pass();
254 left_child
.QueueFrame(child_frame
.Pass());
258 gfx::Rect
rect(child_size
);
259 RenderPass::Id
id(1, 1);
260 scoped_ptr
<RenderPass
> pass
= RenderPass::Create();
261 pass
->SetNew(id
, rect
, rect
, gfx::Transform());
263 CreateAndAppendTestSharedQuadState(
264 pass
.get(), gfx::Transform(), child_size
);
266 scoped_ptr
<SolidColorDrawQuad
> top_color_quad
=
267 SolidColorDrawQuad::Create();
268 bool force_anti_aliasing_off
= false;
269 top_color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
270 gfx::Rect(quad_size
),
271 gfx::Rect(quad_size
),
273 force_anti_aliasing_off
);
274 pass
->quad_list
.push_back(top_color_quad
.PassAs
<DrawQuad
>());
276 scoped_ptr
<SolidColorDrawQuad
> bottom_color_quad
=
277 SolidColorDrawQuad::Create();
278 bottom_color_quad
->SetNew(pass
->shared_quad_state_list
.back(),
279 gfx::Rect(0, 100, 100, 100),
280 gfx::Rect(0, 100, 100, 100),
282 force_anti_aliasing_off
);
283 pass
->quad_list
.push_back(bottom_color_quad
.PassAs
<DrawQuad
>());
285 scoped_ptr
<DelegatedFrameData
> delegated_frame_data(new DelegatedFrameData
);
286 delegated_frame_data
->render_pass_list
.push_back(pass
.Pass());
288 scoped_ptr
<CompositorFrame
> child_frame(new CompositorFrame
);
289 child_frame
->delegated_frame_data
= delegated_frame_data
.Pass();
291 right_child
.QueueFrame(child_frame
.Pass());
294 SurfaceAggregator
aggregator(&manager_
);
295 scoped_ptr
<CompositorFrame
> aggregated_frame
=
296 aggregator
.Aggregate(root_surface
.surface_id());
298 bool discard_alpha
= false;
299 ExactPixelComparator
pixel_comparator(discard_alpha
);
300 RenderPassList
* pass_list
=
301 &aggregated_frame
->delegated_frame_data
->render_pass_list
;
302 EXPECT_TRUE(RunPixelTest(
304 base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
311 #endif // !defined(OS_ANDROID)