Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: cc/output/overlay_unittest.cc

Issue 2573603005: Compute damage rect for Cast video compositing (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "cc/base/region.h" 11 #include "cc/base/region.h"
12 #include "cc/output/ca_layer_overlay.h" 12 #include "cc/output/ca_layer_overlay.h"
13 #include "cc/output/filter_operation.h" 13 #include "cc/output/filter_operation.h"
14 #include "cc/output/gl_renderer.h" 14 #include "cc/output/gl_renderer.h"
15 #include "cc/output/output_surface.h" 15 #include "cc/output/output_surface.h"
16 #include "cc/output/output_surface_client.h" 16 #include "cc/output/output_surface_client.h"
17 #include "cc/output/output_surface_frame.h" 17 #include "cc/output/output_surface_frame.h"
18 #include "cc/output/overlay_candidate_validator.h" 18 #include "cc/output/overlay_candidate_validator.h"
19 #include "cc/output/overlay_processor.h" 19 #include "cc/output/overlay_processor.h"
20 #include "cc/output/overlay_strategy_cast_underlay.h"
20 #include "cc/output/overlay_strategy_fullscreen.h" 21 #include "cc/output/overlay_strategy_fullscreen.h"
21 #include "cc/output/overlay_strategy_single_on_top.h" 22 #include "cc/output/overlay_strategy_single_on_top.h"
22 #include "cc/output/overlay_strategy_underlay.h" 23 #include "cc/output/overlay_strategy_underlay.h"
23 #include "cc/quads/render_pass.h" 24 #include "cc/quads/render_pass.h"
24 #include "cc/quads/render_pass_draw_quad.h" 25 #include "cc/quads/render_pass_draw_quad.h"
25 #include "cc/quads/solid_color_draw_quad.h" 26 #include "cc/quads/solid_color_draw_quad.h"
26 #include "cc/quads/stream_video_draw_quad.h" 27 #include "cc/quads/stream_video_draw_quad.h"
27 #include "cc/quads/texture_draw_quad.h" 28 #include "cc/quads/texture_draw_quad.h"
28 #include "cc/resources/resource_provider.h" 29 #include "cc/resources/resource_provider.h"
29 #include "cc/resources/texture_mailbox.h" 30 #include "cc/resources/texture_mailbox.h"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 } 124 }
124 }; 125 };
125 126
126 class UnderlayOverlayValidator : public SingleOverlayValidator { 127 class UnderlayOverlayValidator : public SingleOverlayValidator {
127 public: 128 public:
128 void GetStrategies(OverlayProcessor::StrategyList* strategies) override { 129 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
129 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this)); 130 strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
130 } 131 }
131 }; 132 };
132 133
134 class CastUnderlayOverlayValidator : public SingleOverlayValidator {
135 public:
136 void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
137 strategies->push_back(base::MakeUnique<OverlayStrategyCastUnderlay>(this));
138 }
139 };
140
133 class DefaultOverlayProcessor : public OverlayProcessor { 141 class DefaultOverlayProcessor : public OverlayProcessor {
134 public: 142 public:
135 explicit DefaultOverlayProcessor(OutputSurface* surface); 143 explicit DefaultOverlayProcessor(OutputSurface* surface);
136 size_t GetStrategyCount(); 144 size_t GetStrategyCount();
137 }; 145 };
138 146
139 DefaultOverlayProcessor::DefaultOverlayProcessor(OutputSurface* surface) 147 DefaultOverlayProcessor::DefaultOverlayProcessor(OutputSurface* surface)
140 : OverlayProcessor(surface) { 148 : OverlayProcessor(surface) {
141 } 149 }
142 150
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 304
297 void CreateOpaqueQuadAt(ResourceProvider* resource_provider, 305 void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
298 const SharedQuadState* shared_quad_state, 306 const SharedQuadState* shared_quad_state,
299 RenderPass* render_pass, 307 RenderPass* render_pass,
300 const gfx::Rect& rect) { 308 const gfx::Rect& rect) {
301 SolidColorDrawQuad* color_quad = 309 SolidColorDrawQuad* color_quad =
302 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 310 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
303 color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false); 311 color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false);
304 } 312 }
305 313
314 void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
315 const SharedQuadState* shared_quad_state,
316 RenderPass* render_pass,
317 const gfx::Rect& rect,
318 SkColor color) {
319 SolidColorDrawQuad* color_quad =
320 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
321 color_quad->SetNew(shared_quad_state, rect, rect, color, false);
322 }
323
306 void CreateFullscreenOpaqueQuad(ResourceProvider* resource_provider, 324 void CreateFullscreenOpaqueQuad(ResourceProvider* resource_provider,
307 const SharedQuadState* shared_quad_state, 325 const SharedQuadState* shared_quad_state,
308 RenderPass* render_pass) { 326 RenderPass* render_pass) {
309 CreateOpaqueQuadAt(resource_provider, shared_quad_state, render_pass, 327 CreateOpaqueQuadAt(resource_provider, shared_quad_state, render_pass,
310 render_pass->output_rect); 328 render_pass->output_rect);
311 } 329 }
312 330
313 static void CompareRenderPassLists(const RenderPassList& expected_list, 331 static void CompareRenderPassLists(const RenderPassList& expected_list,
314 const RenderPassList& actual_list) { 332 const RenderPassList& actual_list) {
315 EXPECT_EQ(expected_list.size(), actual_list.size()); 333 EXPECT_EQ(expected_list.size(), actual_list.size());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; 383 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
366 std::unique_ptr<ResourceProvider> resource_provider_; 384 std::unique_ptr<ResourceProvider> resource_provider_;
367 std::unique_ptr<OverlayProcessor> overlay_processor_; 385 std::unique_ptr<OverlayProcessor> overlay_processor_;
368 gfx::Rect damage_rect_; 386 gfx::Rect damage_rect_;
369 }; 387 };
370 388
371 typedef OverlayTest<FullscreenOverlayValidator> FullscreenOverlayTest; 389 typedef OverlayTest<FullscreenOverlayValidator> FullscreenOverlayTest;
372 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest; 390 typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest;
373 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest; 391 typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest;
374 typedef OverlayTest<CALayerValidator> CALayerOverlayTest; 392 typedef OverlayTest<CALayerValidator> CALayerOverlayTest;
393 typedef OverlayTest<CastUnderlayOverlayValidator> CastUnderlayTest;
375 394
376 TEST(OverlayTest, NoOverlaysByDefault) { 395 TEST(OverlayTest, NoOverlaysByDefault) {
377 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(); 396 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
378 OverlayOutputSurface output_surface(provider); 397 OverlayOutputSurface output_surface(provider);
379 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator()); 398 EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator());
380 399
381 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator); 400 output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator);
382 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL); 401 EXPECT_TRUE(output_surface.GetOverlayCandidateValidator() != NULL);
383 } 402 }
384 403
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 1152
1134 OverlayCandidateList candidate_list; 1153 OverlayCandidateList candidate_list;
1135 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(), 1154 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(),
1136 &candidate_list, nullptr, 1155 &candidate_list, nullptr,
1137 &damage_rect_); 1156 &damage_rect_);
1138 } 1157 }
1139 1158
1140 EXPECT_TRUE(damage_rect_.IsEmpty()); 1159 EXPECT_TRUE(damage_rect_.IsEmpty());
1141 } 1160 }
1142 1161
1162 TEST_F(CastUnderlayTest, NoOverlayDamageRect) {
1163 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1164
1165 CreateOpaqueQuadAt(resource_provider_.get(),
1166 pass->shared_quad_state_list.back(), pass.get(),
1167 kOverlayTopLeftRect);
1168
1169 OverlayCandidateList candidate_list;
1170 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(),
1171 &candidate_list, nullptr,
1172 &damage_rect_);
1173
1174 gfx::Rect swap_with_damage_rect;
1175 EXPECT_FALSE(
1176 overlay_processor_->GetSwapWithDamageRect(&swap_with_damage_rect));
1177 }
1178
1179 TEST_F(CastUnderlayTest, FullScreenOverlayDamageRect) {
1180 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1181 CreateCandidateQuadAt(resource_provider_.get(),
1182 pass->shared_quad_state_list.back(), pass.get(),
1183 kOverlayRect);
1184
1185 OverlayCandidateList candidate_list;
1186 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(),
1187 &candidate_list, nullptr,
1188 &damage_rect_);
1189
1190 gfx::Rect swap_with_damage_rect;
1191 EXPECT_TRUE(
1192 overlay_processor_->GetSwapWithDamageRect(&swap_with_damage_rect));
1193 EXPECT_TRUE(swap_with_damage_rect.IsEmpty());
1194 }
1195
1196 TEST_F(CastUnderlayTest, BlackOutsideOverlayDamageRect) {
1197 const gfx::Rect kLeftSide(0, 0, 128, 256);
1198 const gfx::Rect kTopRight(128, 0, 128, 128);
1199
1200 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1201 CreateCandidateQuadAt(resource_provider_.get(),
1202 pass->shared_quad_state_list.back(), pass.get(),
1203 kOverlayBottomRightRect);
1204 CreateOpaqueQuadAt(resource_provider_.get(),
1205 pass->shared_quad_state_list.back(), pass.get(), kLeftSide,
1206 SK_ColorBLACK);
1207 CreateOpaqueQuadAt(resource_provider_.get(),
1208 pass->shared_quad_state_list.back(), pass.get(), kTopRight,
1209 SK_ColorBLACK);
1210
1211 OverlayCandidateList candidate_list;
1212 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(),
1213 &candidate_list, nullptr,
1214 &damage_rect_);
1215
1216 gfx::Rect swap_with_damage_rect;
1217 EXPECT_TRUE(
1218 overlay_processor_->GetSwapWithDamageRect(&swap_with_damage_rect));
1219 EXPECT_TRUE(swap_with_damage_rect.IsEmpty());
1220 }
1221
1222 TEST_F(CastUnderlayTest, OverlayOccludedDamageRect) {
1223 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1224 CreateOpaqueQuadAt(resource_provider_.get(),
1225 pass->shared_quad_state_list.back(), pass.get(),
1226 kOverlayTopLeftRect);
1227 CreateCandidateQuadAt(resource_provider_.get(),
1228 pass->shared_quad_state_list.back(), pass.get(),
1229 kOverlayRect);
1230
1231 OverlayCandidateList candidate_list;
1232 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(),
1233 &candidate_list, nullptr,
1234 &damage_rect_);
1235
1236 gfx::Rect swap_with_damage_rect;
1237 EXPECT_TRUE(
1238 overlay_processor_->GetSwapWithDamageRect(&swap_with_damage_rect));
1239 EXPECT_EQ(kOverlayTopLeftRect, swap_with_damage_rect);
1240 }
1241
1242 TEST_F(CastUnderlayTest, OverlayOccludedUnionDamageRect) {
1243 std::unique_ptr<RenderPass> pass = CreateRenderPass();
1244 CreateOpaqueQuadAt(resource_provider_.get(),
1245 pass->shared_quad_state_list.back(), pass.get(),
1246 kOverlayTopLeftRect);
1247 CreateOpaqueQuadAt(resource_provider_.get(),
1248 pass->shared_quad_state_list.back(), pass.get(),
1249 kOverlayBottomRightRect);
1250 CreateCandidateQuadAt(resource_provider_.get(),
1251 pass->shared_quad_state_list.back(), pass.get(),
1252 kOverlayRect);
1253
1254 OverlayCandidateList candidate_list;
1255 overlay_processor_->ProcessForOverlays(resource_provider_.get(), pass.get(),
1256 &candidate_list, nullptr,
1257 &damage_rect_);
1258
1259 gfx::Rect swap_with_damage_rect;
1260 EXPECT_TRUE(
1261 overlay_processor_->GetSwapWithDamageRect(&swap_with_damage_rect));
1262 EXPECT_EQ(kOverlayRect, swap_with_damage_rect);
1263 }
1264
1143 OverlayCandidateList BackbufferOverlayList(const RenderPass* root_render_pass) { 1265 OverlayCandidateList BackbufferOverlayList(const RenderPass* root_render_pass) {
1144 OverlayCandidateList list; 1266 OverlayCandidateList list;
1145 OverlayCandidate output_surface_plane; 1267 OverlayCandidate output_surface_plane;
1146 output_surface_plane.display_rect = gfx::RectF(root_render_pass->output_rect); 1268 output_surface_plane.display_rect = gfx::RectF(root_render_pass->output_rect);
1147 output_surface_plane.quad_rect_in_target_space = 1269 output_surface_plane.quad_rect_in_target_space =
1148 root_render_pass->output_rect; 1270 root_render_pass->output_rect;
1149 output_surface_plane.use_output_surface_for_resource = true; 1271 output_surface_plane.use_output_surface_for_resource = true;
1150 output_surface_plane.overlay_handled = true; 1272 output_surface_plane.overlay_handled = true;
1151 list.push_back(output_surface_plane); 1273 list.push_back(output_surface_plane);
1152 return list; 1274 return list;
(...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after
1890 gfx::Size(), filters_, gfx::Vector2dF(1, 1), gfx::PointF(), 2012 gfx::Size(), filters_, gfx::Vector2dF(1, 1), gfx::PointF(),
1891 background_filters_); 2013 background_filters_);
1892 } 2014 }
1893 2015
1894 ProcessForOverlays(); 2016 ProcessForOverlays();
1895 EXPECT_EQ(0U, ca_layer_list_.size()); 2017 EXPECT_EQ(0U, ca_layer_list_.size());
1896 } 2018 }
1897 2019
1898 } // namespace 2020 } // namespace
1899 } // namespace cc 2021 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/overlay_strategy_cast_underlay.cc ('k') | chromecast/browser/cast_browser_main_parts.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698