diff options
Diffstat (limited to 'chromium/cc/output/software_renderer_unittest.cc')
-rw-r--r-- | chromium/cc/output/software_renderer_unittest.cc | 289 |
1 files changed, 145 insertions, 144 deletions
diff --git a/chromium/cc/output/software_renderer_unittest.cc b/chromium/cc/output/software_renderer_unittest.cc index fc1c7070cb4..536b2ef168b 100644 --- a/chromium/cc/output/software_renderer_unittest.cc +++ b/chromium/cc/output/software_renderer_unittest.cc @@ -4,8 +4,11 @@ #include "cc/output/software_renderer.h" +#include "base/run_loop.h" #include "cc/layers/quad_sink.h" #include "cc/output/compositor_frame_metadata.h" +#include "cc/output/copy_output_request.h" +#include "cc/output/copy_output_result.h" #include "cc/output/software_output_device.h" #include "cc/quads/render_pass.h" #include "cc/quads/render_pass_draw_quad.h" @@ -17,10 +20,10 @@ #include "cc/test/geometry_test_utils.h" #include "cc/test/render_pass_test_common.h" #include "cc/test/render_pass_test_utils.h" +#include "cc/test/test_shared_bitmap_manager.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" -#include "third_party/skia/include/core/SkDevice.h" namespace cc { namespace { @@ -33,8 +36,10 @@ class SoftwareRendererTest : public testing::Test, public RendererClient { software_output_device.Pass()); CHECK(output_surface_->BindToClient(&output_surface_client_)); - resource_provider_ = - ResourceProvider::Create(output_surface_.get(), NULL, 0, false, 1); + shared_bitmap_manager_.reset(new TestSharedBitmapManager()); + resource_provider_ = ResourceProvider::Create( + output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1, + false); renderer_ = SoftwareRenderer::Create( this, &settings_, output_surface_.get(), resource_provider()); } @@ -47,11 +52,42 @@ class SoftwareRendererTest : public testing::Test, public RendererClient { // RendererClient implementation. virtual void SetFullRootLayerDamage() OVERRIDE {} + virtual void RunOnDemandRasterTask(Task* on_demand_raster_task) OVERRIDE {} + + scoped_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, + float device_scale_factor, + gfx::Rect device_viewport_rect) { + scoped_ptr<SkBitmap> bitmap_result; + base::RunLoop loop; + + list->back()->copy_requests.push_back( + CopyOutputRequest::CreateBitmapRequest( + base::Bind(&SoftwareRendererTest::SaveBitmapResult, + base::Unretained(&bitmap_result), + loop.QuitClosure()))); + + renderer()->DrawFrame(list, + device_scale_factor, + device_viewport_rect, + device_viewport_rect, + false); + loop.Run(); + return bitmap_result.Pass(); + } + + static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result, + const base::Closure& quit_closure, + scoped_ptr<CopyOutputResult> result) { + DCHECK(result->HasBitmap()); + *bitmap_result = result->TakeBitmap(); + quit_closure.Run(); + } protected: LayerTreeSettings settings_; FakeOutputSurfaceClient output_surface_client_; scoped_ptr<FakeOutputSurface> output_surface_; + scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; scoped_ptr<ResourceProvider> resource_provider_; scoped_ptr<SoftwareRenderer> renderer_; }; @@ -65,23 +101,26 @@ TEST_F(SoftwareRendererTest, SolidColorQuad) { InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); - scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); + RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); + scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); + root_render_pass->SetNew( + root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); + SharedQuadState* shared_quad_state = + root_render_pass->CreateAndAppendSharedQuadState(); shared_quad_state->SetAll(gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0, - SkXfermode::kSrcOver_Mode); - RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); - scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); - root_render_pass->SetNew( - root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); + SkXfermode::kSrcOver_Mode, + 0); scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create(); outer_quad->SetNew( - shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); + shared_quad_state, outer_rect, outer_rect, SK_ColorYELLOW, false); scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); - inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); + inner_quad->SetNew( + shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); inner_quad->visible_rect = visible_rect; root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); @@ -91,27 +130,18 @@ TEST_F(SoftwareRendererTest, SolidColorQuad) { float device_scale_factor = 1.f; gfx::Rect device_viewport_rect(outer_size); - renderer()->DrawFrame(&list, - NULL, - device_scale_factor, - device_viewport_rect, - device_viewport_rect, - true, - false); - - SkBitmap output; - output.setConfig( - SkBitmap::kARGB_8888_Config, outer_rect.width(), outer_rect.height()); - output.allocPixels(); - renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); - - EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); + scoped_ptr<SkBitmap> output = + DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); + EXPECT_EQ(outer_rect.width(), output->info().fWidth); + EXPECT_EQ(outer_rect.width(), output->info().fHeight); + + EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); EXPECT_EQ(SK_ColorYELLOW, - output.getColor(outer_size.width() - 1, outer_size.height() - 1)); - EXPECT_EQ(SK_ColorYELLOW, output.getColor(1, 1)); - EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 2)); + output->getColor(outer_size.width() - 1, outer_size.height() - 1)); + EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); + EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); EXPECT_EQ(SK_ColorCYAN, - output.getColor(inner_size.width() - 1, inner_size.height() - 1)); + output->getColor(inner_size.width() - 1, inner_size.height() - 1)); } TEST_F(SoftwareRendererTest, TileQuad) { @@ -158,20 +188,23 @@ TEST_F(SoftwareRendererTest, TileQuad) { gfx::Rect root_rect = outer_rect; - scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); + RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); + scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); + root_render_pass->SetNew( + root_render_pass_id, root_rect, root_rect, gfx::Transform()); + SharedQuadState* shared_quad_state = + root_render_pass->CreateAndAppendSharedQuadState(); shared_quad_state->SetAll(gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0, - SkXfermode::kSrcOver_Mode); - RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); - scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); - root_render_pass->SetNew( - root_render_pass_id, root_rect, root_rect, gfx::Transform()); + SkXfermode::kSrcOver_Mode, + 0); scoped_ptr<TileDrawQuad> outer_quad = TileDrawQuad::Create(); - outer_quad->SetNew(shared_quad_state.get(), + outer_quad->SetNew(shared_quad_state, + outer_rect, outer_rect, outer_rect, resource_yellow, @@ -179,7 +212,8 @@ TEST_F(SoftwareRendererTest, TileQuad) { outer_size, false); scoped_ptr<TileDrawQuad> inner_quad = TileDrawQuad::Create(); - inner_quad->SetNew(shared_quad_state.get(), + inner_quad->SetNew(shared_quad_state, + inner_rect, inner_rect, inner_rect, resource_cyan, @@ -194,26 +228,17 @@ TEST_F(SoftwareRendererTest, TileQuad) { float device_scale_factor = 1.f; gfx::Rect device_viewport_rect(outer_size); - renderer()->DrawFrame(&list, - NULL, - device_scale_factor, - device_viewport_rect, - device_viewport_rect, - true, - false); - - SkBitmap output; - output.setConfig( - SkBitmap::kARGB_8888_Config, outer_size.width(), outer_size.height()); - output.allocPixels(); - renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); + scoped_ptr<SkBitmap> output = + DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); + EXPECT_EQ(outer_rect.width(), output->info().fWidth); + EXPECT_EQ(outer_rect.width(), output->info().fHeight); - EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); + EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); EXPECT_EQ(SK_ColorYELLOW, - output.getColor(outer_size.width() - 1, outer_size.height() - 1)); - EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); + output->getColor(outer_size.width() - 1, outer_size.height() - 1)); + EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); EXPECT_EQ(SK_ColorCYAN, - output.getColor(inner_size.width() - 1, inner_size.height() - 1)); + output->getColor(inner_size.width() - 1, inner_size.height() - 1)); } TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { @@ -247,20 +272,23 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { gfx::Rect root_rect(tile_size); - scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); + RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); + scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); + root_render_pass->SetNew( + root_render_pass_id, root_rect, root_rect, gfx::Transform()); + SharedQuadState* shared_quad_state = + root_render_pass->CreateAndAppendSharedQuadState(); shared_quad_state->SetAll(gfx::Transform(), tile_size, tile_rect, tile_rect, false, 1.0, - SkXfermode::kSrcOver_Mode); - RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); - scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); - root_render_pass->SetNew( - root_render_pass_id, root_rect, root_rect, gfx::Transform()); + SkXfermode::kSrcOver_Mode, + 0); scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create(); - quad->SetNew(shared_quad_state.get(), + quad->SetNew(shared_quad_state, + tile_rect, tile_rect, tile_rect, resource_cyan, @@ -275,74 +303,57 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { float device_scale_factor = 1.f; gfx::Rect device_viewport_rect(tile_size); - renderer()->DrawFrame(&list, - NULL, - device_scale_factor, - device_viewport_rect, - device_viewport_rect, - true, - false); - - SkBitmap output; - output.setConfig( - SkBitmap::kARGB_8888_Config, tile_size.width(), tile_size.height()); - output.allocPixels(); - renderer()->GetFramebufferPixels(output.getPixels(), tile_rect); + scoped_ptr<SkBitmap> output = + DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); + EXPECT_EQ(tile_rect.width(), output->info().fWidth); + EXPECT_EQ(tile_rect.width(), output->info().fHeight); // Check portion of tile not in visible rect isn't drawn. const unsigned int kTransparent = SK_ColorTRANSPARENT; - EXPECT_EQ(kTransparent, output.getColor(0, 0)); + EXPECT_EQ(kTransparent, output->getColor(0, 0)); EXPECT_EQ(kTransparent, - output.getColor(tile_rect.width() - 1, tile_rect.height() - 1)); + output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); EXPECT_EQ(kTransparent, - output.getColor(visible_rect.x() - 1, visible_rect.y() - 1)); + output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); EXPECT_EQ(kTransparent, - output.getColor(visible_rect.right(), visible_rect.bottom())); + output->getColor(visible_rect.right(), visible_rect.bottom())); // Ensure visible part is drawn correctly. - EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y())); + EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); EXPECT_EQ( SK_ColorCYAN, - output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); + output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); // Ensure last visible line is correct. EXPECT_EQ( SK_ColorYELLOW, - output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); + output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); } TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { float device_scale_factor = 1.f; - gfx::Rect viewport_rect(0, 0, 100, 100); + gfx::Rect device_viewport_rect(0, 0, 100, 100); settings_.should_clear_root_render_pass = false; InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); RenderPassList list; - SkBitmap output; - output.setConfig(SkBitmap::kARGB_8888_Config, - viewport_rect.width(), - viewport_rect.height()); - output.allocPixels(); - // Draw a fullscreen green quad in a first frame. RenderPass::Id root_clear_pass_id(1, 0); TestRenderPass* root_clear_pass = AddRenderPass( - &list, root_clear_pass_id, viewport_rect, gfx::Transform()); - AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); + &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); + AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); renderer()->DecideRenderPassAllocationsForFrame(list); - renderer()->DrawFrame(&list, - NULL, - device_scale_factor, - viewport_rect, - viewport_rect, - true, - false); - renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); - - EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); + + scoped_ptr<SkBitmap> output = + DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); + EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); + EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); + + EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); EXPECT_EQ(SK_ColorGREEN, - output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); + output->getColor(device_viewport_rect.width() - 1, + device_viewport_rect.height() - 1)); list.clear(); @@ -352,43 +363,35 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { RenderPass::Id root_smaller_pass_id(2, 0); TestRenderPass* root_smaller_pass = AddRenderPass( - &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); + &list, root_smaller_pass_id, device_viewport_rect, gfx::Transform()); AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); renderer()->DecideRenderPassAllocationsForFrame(list); - renderer()->DrawFrame(&list, - NULL, - device_scale_factor, - viewport_rect, - viewport_rect, - true, - false); - renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); + + output = DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); + EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); + EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); // If we didn't clear, the borders should still be green. - EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); + EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); EXPECT_EQ(SK_ColorGREEN, - output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); + output->getColor(device_viewport_rect.width() - 1, + device_viewport_rect.height() - 1)); EXPECT_EQ(SK_ColorMAGENTA, - output.getColor(smaller_rect.x(), smaller_rect.y())); - EXPECT_EQ(SK_ColorMAGENTA, - output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); + output->getColor(smaller_rect.x(), smaller_rect.y())); + EXPECT_EQ( + SK_ColorMAGENTA, + output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); } TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { float device_scale_factor = 1.f; - gfx::Rect viewport_rect(0, 0, 100, 100); + gfx::Rect device_viewport_rect(0, 0, 100, 100); InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); RenderPassList list; - SkBitmap output; - output.setConfig(SkBitmap::kARGB_8888_Config, - viewport_rect.width(), - viewport_rect.height()); - output.allocPixels(); - // Pass drawn as inner quad is magenta. gfx::Rect smaller_rect(20, 20, 60, 60); RenderPass::Id smaller_pass_id(2, 1); @@ -398,42 +401,40 @@ TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { // Root pass is green. RenderPass::Id root_clear_pass_id(1, 0); - TestRenderPass* root_clear_pass = - AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform()); + TestRenderPass* root_clear_pass = AddRenderPass( + &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); AddRenderPassQuad(root_clear_pass, smaller_pass); - AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); + AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); // Interior pass quad has smaller visible rect. gfx::Rect interior_visible_rect(30, 30, 40, 40); root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect; renderer()->DecideRenderPassAllocationsForFrame(list); - renderer()->DrawFrame(&list, - NULL, - device_scale_factor, - viewport_rect, - viewport_rect, - true, - false); - renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); - - EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); - EXPECT_EQ( - SK_ColorGREEN, - output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); + + scoped_ptr<SkBitmap> output = + DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); + EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); + EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); + + EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); + EXPECT_EQ(SK_ColorGREEN, + output->getColor(device_viewport_rect.width() - 1, + device_viewport_rect.height() - 1)); // Part outside visible rect should remain green. - EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y())); + EXPECT_EQ(SK_ColorGREEN, + output->getColor(smaller_rect.x(), smaller_rect.y())); EXPECT_EQ( SK_ColorGREEN, - output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); + output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); EXPECT_EQ( SK_ColorMAGENTA, - output.getColor(interior_visible_rect.x(), interior_visible_rect.y())); + output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); EXPECT_EQ(SK_ColorMAGENTA, - output.getColor(interior_visible_rect.right() - 1, - interior_visible_rect.bottom() - 1)); + output->getColor(interior_visible_rect.right() - 1, + interior_visible_rect.bottom() - 1)); } } // namespace |