| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "cc/output/software_renderer.h" | 5 #include "cc/output/software_renderer.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" |
| 9 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| 10 #include "cc/output/compositor_frame_metadata.h" | 11 #include "cc/output/compositor_frame_metadata.h" |
| 11 #include "cc/output/copy_output_request.h" | 12 #include "cc/output/copy_output_request.h" |
| 12 #include "cc/output/copy_output_result.h" | 13 #include "cc/output/copy_output_result.h" |
| 13 #include "cc/output/software_output_device.h" | 14 #include "cc/output/software_output_device.h" |
| 14 #include "cc/quads/render_pass.h" | 15 #include "cc/quads/render_pass.h" |
| 15 #include "cc/quads/render_pass_draw_quad.h" | 16 #include "cc/quads/render_pass_draw_quad.h" |
| 16 #include "cc/quads/solid_color_draw_quad.h" | 17 #include "cc/quads/solid_color_draw_quad.h" |
| 17 #include "cc/quads/tile_draw_quad.h" | 18 #include "cc/quads/tile_draw_quad.h" |
| 18 #include "cc/test/animation_test_common.h" | 19 #include "cc/test/animation_test_common.h" |
| 19 #include "cc/test/fake_output_surface.h" | 20 #include "cc/test/fake_output_surface.h" |
| 20 #include "cc/test/fake_output_surface_client.h" | 21 #include "cc/test/fake_output_surface_client.h" |
| 21 #include "cc/test/fake_resource_provider.h" | 22 #include "cc/test/fake_resource_provider.h" |
| 22 #include "cc/test/geometry_test_utils.h" | 23 #include "cc/test/geometry_test_utils.h" |
| 23 #include "cc/test/render_pass_test_utils.h" | 24 #include "cc/test/render_pass_test_utils.h" |
| 24 #include "cc/test/test_shared_bitmap_manager.h" | 25 #include "cc/test/test_shared_bitmap_manager.h" |
| 25 #include "testing/gmock/include/gmock/gmock.h" | 26 #include "testing/gmock/include/gmock/gmock.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 27 #include "third_party/skia/include/core/SkCanvas.h" | 28 #include "third_party/skia/include/core/SkCanvas.h" |
| 28 | 29 |
| 29 namespace cc { | 30 namespace cc { |
| 30 namespace { | 31 namespace { |
| 31 | 32 |
| 32 class SoftwareRendererTest : public testing::Test, public RendererClient { | 33 class SoftwareRendererTest : public testing::Test, public RendererClient { |
| 33 public: | 34 public: |
| 34 void InitializeRenderer( | 35 void InitializeRenderer( |
| 35 scoped_ptr<SoftwareOutputDevice> software_output_device) { | 36 std::unique_ptr<SoftwareOutputDevice> software_output_device) { |
| 36 output_surface_ = | 37 output_surface_ = |
| 37 FakeOutputSurface::CreateSoftware(std::move(software_output_device)); | 38 FakeOutputSurface::CreateSoftware(std::move(software_output_device)); |
| 38 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 39 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
| 39 | 40 |
| 40 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); | 41 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); |
| 41 resource_provider_ = FakeResourceProvider::Create( | 42 resource_provider_ = FakeResourceProvider::Create( |
| 42 output_surface_.get(), shared_bitmap_manager_.get()); | 43 output_surface_.get(), shared_bitmap_manager_.get()); |
| 43 renderer_ = SoftwareRenderer::Create( | 44 renderer_ = SoftwareRenderer::Create( |
| 44 this, &settings_, output_surface_.get(), resource_provider()); | 45 this, &settings_, output_surface_.get(), resource_provider()); |
| 45 } | 46 } |
| 46 | 47 |
| 47 ResourceProvider* resource_provider() const { | 48 ResourceProvider* resource_provider() const { |
| 48 return resource_provider_.get(); | 49 return resource_provider_.get(); |
| 49 } | 50 } |
| 50 | 51 |
| 51 SoftwareRenderer* renderer() const { return renderer_.get(); } | 52 SoftwareRenderer* renderer() const { return renderer_.get(); } |
| 52 | 53 |
| 53 // RendererClient implementation. | 54 // RendererClient implementation. |
| 54 void SetFullRootLayerDamage() override {} | 55 void SetFullRootLayerDamage() override {} |
| 55 | 56 |
| 56 scoped_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, | 57 std::unique_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, |
| 57 float device_scale_factor, | 58 float device_scale_factor, |
| 58 gfx::Rect device_viewport_rect) { | 59 gfx::Rect device_viewport_rect) { |
| 59 scoped_ptr<SkBitmap> bitmap_result; | 60 std::unique_ptr<SkBitmap> bitmap_result; |
| 60 base::RunLoop loop; | 61 base::RunLoop loop; |
| 61 | 62 |
| 62 list->back()->copy_requests.push_back( | 63 list->back()->copy_requests.push_back( |
| 63 CopyOutputRequest::CreateBitmapRequest( | 64 CopyOutputRequest::CreateBitmapRequest( |
| 64 base::Bind(&SoftwareRendererTest::SaveBitmapResult, | 65 base::Bind(&SoftwareRendererTest::SaveBitmapResult, |
| 65 base::Unretained(&bitmap_result), | 66 base::Unretained(&bitmap_result), |
| 66 loop.QuitClosure()))); | 67 loop.QuitClosure()))); |
| 67 | 68 |
| 68 renderer()->DrawFrame(list, | 69 renderer()->DrawFrame(list, |
| 69 device_scale_factor, | 70 device_scale_factor, |
| 70 device_viewport_rect, | 71 device_viewport_rect, |
| 71 device_viewport_rect, | 72 device_viewport_rect, |
| 72 false); | 73 false); |
| 73 loop.Run(); | 74 loop.Run(); |
| 74 return bitmap_result; | 75 return bitmap_result; |
| 75 } | 76 } |
| 76 | 77 |
| 77 static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result, | 78 static void SaveBitmapResult(std::unique_ptr<SkBitmap>* bitmap_result, |
| 78 const base::Closure& quit_closure, | 79 const base::Closure& quit_closure, |
| 79 scoped_ptr<CopyOutputResult> result) { | 80 std::unique_ptr<CopyOutputResult> result) { |
| 80 DCHECK(result->HasBitmap()); | 81 DCHECK(result->HasBitmap()); |
| 81 *bitmap_result = result->TakeBitmap(); | 82 *bitmap_result = result->TakeBitmap(); |
| 82 quit_closure.Run(); | 83 quit_closure.Run(); |
| 83 } | 84 } |
| 84 | 85 |
| 85 protected: | 86 protected: |
| 86 RendererSettings settings_; | 87 RendererSettings settings_; |
| 87 FakeOutputSurfaceClient output_surface_client_; | 88 FakeOutputSurfaceClient output_surface_client_; |
| 88 scoped_ptr<FakeOutputSurface> output_surface_; | 89 std::unique_ptr<FakeOutputSurface> output_surface_; |
| 89 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 90 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| 90 scoped_ptr<ResourceProvider> resource_provider_; | 91 std::unique_ptr<ResourceProvider> resource_provider_; |
| 91 scoped_ptr<SoftwareRenderer> renderer_; | 92 std::unique_ptr<SoftwareRenderer> renderer_; |
| 92 }; | 93 }; |
| 93 | 94 |
| 94 TEST_F(SoftwareRendererTest, SolidColorQuad) { | 95 TEST_F(SoftwareRendererTest, SolidColorQuad) { |
| 95 gfx::Size outer_size(100, 100); | 96 gfx::Size outer_size(100, 100); |
| 96 gfx::Size inner_size(98, 98); | 97 gfx::Size inner_size(98, 98); |
| 97 gfx::Rect outer_rect(outer_size); | 98 gfx::Rect outer_rect(outer_size); |
| 98 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 99 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
| 99 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); | 100 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); |
| 100 | 101 |
| 101 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 102 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 102 | 103 |
| 103 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 104 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
| 104 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 105 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
| 105 root_render_pass->SetNew( | 106 root_render_pass->SetNew( |
| 106 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); | 107 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); |
| 107 SharedQuadState* shared_quad_state = | 108 SharedQuadState* shared_quad_state = |
| 108 root_render_pass->CreateAndAppendSharedQuadState(); | 109 root_render_pass->CreateAndAppendSharedQuadState(); |
| 109 shared_quad_state->SetAll(gfx::Transform(), | 110 shared_quad_state->SetAll(gfx::Transform(), |
| 110 outer_size, | 111 outer_size, |
| 111 outer_rect, | 112 outer_rect, |
| 112 outer_rect, | 113 outer_rect, |
| 113 false, | 114 false, |
| 114 1.0, | 115 1.0, |
| 115 SkXfermode::kSrcOver_Mode, | 116 SkXfermode::kSrcOver_Mode, |
| 116 0); | 117 0); |
| 117 SolidColorDrawQuad* inner_quad = | 118 SolidColorDrawQuad* inner_quad = |
| 118 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 119 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 119 inner_quad->SetNew( | 120 inner_quad->SetNew( |
| 120 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); | 121 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); |
| 121 inner_quad->visible_rect = visible_rect; | 122 inner_quad->visible_rect = visible_rect; |
| 122 SolidColorDrawQuad* outer_quad = | 123 SolidColorDrawQuad* outer_quad = |
| 123 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 124 root_render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 124 outer_quad->SetNew( | 125 outer_quad->SetNew( |
| 125 shared_quad_state, outer_rect, outer_rect, SK_ColorYELLOW, false); | 126 shared_quad_state, outer_rect, outer_rect, SK_ColorYELLOW, false); |
| 126 | 127 |
| 127 RenderPassList list; | 128 RenderPassList list; |
| 128 list.push_back(std::move(root_render_pass)); | 129 list.push_back(std::move(root_render_pass)); |
| 129 | 130 |
| 130 float device_scale_factor = 1.f; | 131 float device_scale_factor = 1.f; |
| 131 gfx::Rect device_viewport_rect(outer_size); | 132 gfx::Rect device_viewport_rect(outer_size); |
| 132 scoped_ptr<SkBitmap> output = | 133 std::unique_ptr<SkBitmap> output = |
| 133 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 134 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 134 EXPECT_EQ(outer_rect.width(), output->info().width()); | 135 EXPECT_EQ(outer_rect.width(), output->info().width()); |
| 135 EXPECT_EQ(outer_rect.height(), output->info().height()); | 136 EXPECT_EQ(outer_rect.height(), output->info().height()); |
| 136 | 137 |
| 137 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); | 138 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
| 138 EXPECT_EQ(SK_ColorYELLOW, | 139 EXPECT_EQ(SK_ColorYELLOW, |
| 139 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); | 140 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
| 140 EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); | 141 EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); |
| 141 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); | 142 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); |
| 142 EXPECT_EQ(SK_ColorCYAN, | 143 EXPECT_EQ(SK_ColorCYAN, |
| 143 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); | 144 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
| 144 } | 145 } |
| 145 | 146 |
| 146 TEST_F(SoftwareRendererTest, TileQuad) { | 147 TEST_F(SoftwareRendererTest, TileQuad) { |
| 147 gfx::Size outer_size(100, 100); | 148 gfx::Size outer_size(100, 100); |
| 148 gfx::Size inner_size(98, 98); | 149 gfx::Size inner_size(98, 98); |
| 149 gfx::Rect outer_rect(outer_size); | 150 gfx::Rect outer_rect(outer_size); |
| 150 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 151 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
| 151 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 152 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 152 | 153 |
| 153 ResourceId resource_yellow = resource_provider()->CreateResource( | 154 ResourceId resource_yellow = resource_provider()->CreateResource( |
| 154 outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | 155 outer_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
| 155 ResourceId resource_cyan = resource_provider()->CreateResource( | 156 ResourceId resource_cyan = resource_provider()->CreateResource( |
| 156 inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | 157 inner_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
| 157 | 158 |
| 158 SkBitmap yellow_tile; | 159 SkBitmap yellow_tile; |
| 159 yellow_tile.allocN32Pixels(outer_size.width(), outer_size.height()); | 160 yellow_tile.allocN32Pixels(outer_size.width(), outer_size.height()); |
| 160 yellow_tile.eraseColor(SK_ColorYELLOW); | 161 yellow_tile.eraseColor(SK_ColorYELLOW); |
| 161 | 162 |
| 162 SkBitmap cyan_tile; | 163 SkBitmap cyan_tile; |
| 163 cyan_tile.allocN32Pixels(inner_size.width(), inner_size.height()); | 164 cyan_tile.allocN32Pixels(inner_size.width(), inner_size.height()); |
| 164 cyan_tile.eraseColor(SK_ColorCYAN); | 165 cyan_tile.eraseColor(SK_ColorCYAN); |
| 165 | 166 |
| 166 resource_provider()->CopyToResource( | 167 resource_provider()->CopyToResource( |
| 167 resource_yellow, static_cast<uint8_t*>(yellow_tile.getPixels()), | 168 resource_yellow, static_cast<uint8_t*>(yellow_tile.getPixels()), |
| 168 outer_size); | 169 outer_size); |
| 169 resource_provider()->CopyToResource( | 170 resource_provider()->CopyToResource( |
| 170 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), inner_size); | 171 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), inner_size); |
| 171 | 172 |
| 172 gfx::Rect root_rect = outer_rect; | 173 gfx::Rect root_rect = outer_rect; |
| 173 | 174 |
| 174 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 175 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
| 175 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 176 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
| 176 root_render_pass->SetNew( | 177 root_render_pass->SetNew( |
| 177 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 178 root_render_pass_id, root_rect, root_rect, gfx::Transform()); |
| 178 SharedQuadState* shared_quad_state = | 179 SharedQuadState* shared_quad_state = |
| 179 root_render_pass->CreateAndAppendSharedQuadState(); | 180 root_render_pass->CreateAndAppendSharedQuadState(); |
| 180 shared_quad_state->SetAll(gfx::Transform(), | 181 shared_quad_state->SetAll(gfx::Transform(), |
| 181 outer_size, | 182 outer_size, |
| 182 outer_rect, | 183 outer_rect, |
| 183 outer_rect, | 184 outer_rect, |
| 184 false, | 185 false, |
| 185 1.0, | 186 1.0, |
| 186 SkXfermode::kSrcOver_Mode, | 187 SkXfermode::kSrcOver_Mode, |
| 187 0); | 188 0); |
| 188 TileDrawQuad* inner_quad = | 189 TileDrawQuad* inner_quad = |
| 189 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 190 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
| 190 inner_quad->SetNew(shared_quad_state, inner_rect, inner_rect, inner_rect, | 191 inner_quad->SetNew(shared_quad_state, inner_rect, inner_rect, inner_rect, |
| 191 resource_cyan, gfx::RectF(gfx::SizeF(inner_size)), | 192 resource_cyan, gfx::RectF(gfx::SizeF(inner_size)), |
| 192 inner_size, false, false); | 193 inner_size, false, false); |
| 193 TileDrawQuad* outer_quad = | 194 TileDrawQuad* outer_quad = |
| 194 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 195 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
| 195 outer_quad->SetNew(shared_quad_state, outer_rect, outer_rect, outer_rect, | 196 outer_quad->SetNew(shared_quad_state, outer_rect, outer_rect, outer_rect, |
| 196 resource_yellow, gfx::RectF(gfx::SizeF(outer_size)), | 197 resource_yellow, gfx::RectF(gfx::SizeF(outer_size)), |
| 197 outer_size, false, false); | 198 outer_size, false, false); |
| 198 | 199 |
| 199 RenderPassList list; | 200 RenderPassList list; |
| 200 list.push_back(std::move(root_render_pass)); | 201 list.push_back(std::move(root_render_pass)); |
| 201 | 202 |
| 202 float device_scale_factor = 1.f; | 203 float device_scale_factor = 1.f; |
| 203 gfx::Rect device_viewport_rect(outer_size); | 204 gfx::Rect device_viewport_rect(outer_size); |
| 204 scoped_ptr<SkBitmap> output = | 205 std::unique_ptr<SkBitmap> output = |
| 205 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 206 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 206 EXPECT_EQ(outer_rect.width(), output->info().width()); | 207 EXPECT_EQ(outer_rect.width(), output->info().width()); |
| 207 EXPECT_EQ(outer_rect.height(), output->info().height()); | 208 EXPECT_EQ(outer_rect.height(), output->info().height()); |
| 208 | 209 |
| 209 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); | 210 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
| 210 EXPECT_EQ(SK_ColorYELLOW, | 211 EXPECT_EQ(SK_ColorYELLOW, |
| 211 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); | 212 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
| 212 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); | 213 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); |
| 213 EXPECT_EQ(SK_ColorCYAN, | 214 EXPECT_EQ(SK_ColorCYAN, |
| 214 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); | 215 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
| 215 } | 216 } |
| 216 | 217 |
| 217 TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { | 218 TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { |
| 218 gfx::Size tile_size(100, 100); | 219 gfx::Size tile_size(100, 100); |
| 219 gfx::Rect tile_rect(tile_size); | 220 gfx::Rect tile_rect(tile_size); |
| 220 gfx::Rect visible_rect = tile_rect; | 221 gfx::Rect visible_rect = tile_rect; |
| 221 visible_rect.Inset(1, 2, 3, 4); | 222 visible_rect.Inset(1, 2, 3, 4); |
| 222 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 223 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 223 | 224 |
| 224 ResourceId resource_cyan = resource_provider()->CreateResource( | 225 ResourceId resource_cyan = resource_provider()->CreateResource( |
| 225 tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | 226 tile_size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
| 226 | 227 |
| 227 SkBitmap cyan_tile; // The lowest five rows are yellow. | 228 SkBitmap cyan_tile; // The lowest five rows are yellow. |
| 228 cyan_tile.allocN32Pixels(tile_size.width(), tile_size.height()); | 229 cyan_tile.allocN32Pixels(tile_size.width(), tile_size.height()); |
| 229 cyan_tile.eraseColor(SK_ColorCYAN); | 230 cyan_tile.eraseColor(SK_ColorCYAN); |
| 230 cyan_tile.eraseArea( | 231 cyan_tile.eraseArea( |
| 231 SkIRect::MakeLTRB( | 232 SkIRect::MakeLTRB( |
| 232 0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()), | 233 0, visible_rect.bottom() - 1, tile_rect.width(), tile_rect.bottom()), |
| 233 SK_ColorYELLOW); | 234 SK_ColorYELLOW); |
| 234 | 235 |
| 235 resource_provider()->CopyToResource( | 236 resource_provider()->CopyToResource( |
| 236 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), tile_size); | 237 resource_cyan, static_cast<uint8_t*>(cyan_tile.getPixels()), tile_size); |
| 237 | 238 |
| 238 gfx::Rect root_rect(tile_size); | 239 gfx::Rect root_rect(tile_size); |
| 239 | 240 |
| 240 RenderPassId root_render_pass_id = RenderPassId(1, 1); | 241 RenderPassId root_render_pass_id = RenderPassId(1, 1); |
| 241 scoped_ptr<RenderPass> root_render_pass = RenderPass::Create(); | 242 std::unique_ptr<RenderPass> root_render_pass = RenderPass::Create(); |
| 242 root_render_pass->SetNew( | 243 root_render_pass->SetNew( |
| 243 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 244 root_render_pass_id, root_rect, root_rect, gfx::Transform()); |
| 244 SharedQuadState* shared_quad_state = | 245 SharedQuadState* shared_quad_state = |
| 245 root_render_pass->CreateAndAppendSharedQuadState(); | 246 root_render_pass->CreateAndAppendSharedQuadState(); |
| 246 shared_quad_state->SetAll(gfx::Transform(), | 247 shared_quad_state->SetAll(gfx::Transform(), |
| 247 tile_size, | 248 tile_size, |
| 248 tile_rect, | 249 tile_rect, |
| 249 tile_rect, | 250 tile_rect, |
| 250 false, | 251 false, |
| 251 1.0, | 252 1.0, |
| 252 SkXfermode::kSrcOver_Mode, | 253 SkXfermode::kSrcOver_Mode, |
| 253 0); | 254 0); |
| 254 TileDrawQuad* quad = | 255 TileDrawQuad* quad = |
| 255 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); | 256 root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); |
| 256 quad->SetNew(shared_quad_state, tile_rect, tile_rect, tile_rect, | 257 quad->SetNew(shared_quad_state, tile_rect, tile_rect, tile_rect, |
| 257 resource_cyan, gfx::RectF(gfx::SizeF(tile_size)), tile_size, | 258 resource_cyan, gfx::RectF(gfx::SizeF(tile_size)), tile_size, |
| 258 false, false); | 259 false, false); |
| 259 quad->visible_rect = visible_rect; | 260 quad->visible_rect = visible_rect; |
| 260 | 261 |
| 261 RenderPassList list; | 262 RenderPassList list; |
| 262 list.push_back(std::move(root_render_pass)); | 263 list.push_back(std::move(root_render_pass)); |
| 263 | 264 |
| 264 float device_scale_factor = 1.f; | 265 float device_scale_factor = 1.f; |
| 265 gfx::Rect device_viewport_rect(tile_size); | 266 gfx::Rect device_viewport_rect(tile_size); |
| 266 scoped_ptr<SkBitmap> output = | 267 std::unique_ptr<SkBitmap> output = |
| 267 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 268 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 268 EXPECT_EQ(tile_rect.width(), output->info().width()); | 269 EXPECT_EQ(tile_rect.width(), output->info().width()); |
| 269 EXPECT_EQ(tile_rect.height(), output->info().height()); | 270 EXPECT_EQ(tile_rect.height(), output->info().height()); |
| 270 | 271 |
| 271 // Check portion of tile not in visible rect isn't drawn. | 272 // Check portion of tile not in visible rect isn't drawn. |
| 272 const unsigned int kTransparent = SK_ColorTRANSPARENT; | 273 const unsigned int kTransparent = SK_ColorTRANSPARENT; |
| 273 EXPECT_EQ(kTransparent, output->getColor(0, 0)); | 274 EXPECT_EQ(kTransparent, output->getColor(0, 0)); |
| 274 EXPECT_EQ(kTransparent, | 275 EXPECT_EQ(kTransparent, |
| 275 output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); | 276 output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); |
| 276 EXPECT_EQ(kTransparent, | 277 EXPECT_EQ(kTransparent, |
| 277 output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); | 278 output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); |
| 278 EXPECT_EQ(kTransparent, | 279 EXPECT_EQ(kTransparent, |
| 279 output->getColor(visible_rect.right(), visible_rect.bottom())); | 280 output->getColor(visible_rect.right(), visible_rect.bottom())); |
| 280 // Ensure visible part is drawn correctly. | 281 // Ensure visible part is drawn correctly. |
| 281 EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); | 282 EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); |
| 282 EXPECT_EQ( | 283 EXPECT_EQ( |
| 283 SK_ColorCYAN, | 284 SK_ColorCYAN, |
| 284 output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); | 285 output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); |
| 285 // Ensure last visible line is correct. | 286 // Ensure last visible line is correct. |
| 286 EXPECT_EQ( | 287 EXPECT_EQ( |
| 287 SK_ColorYELLOW, | 288 SK_ColorYELLOW, |
| 288 output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); | 289 output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); |
| 289 } | 290 } |
| 290 | 291 |
| 291 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { | 292 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
| 292 float device_scale_factor = 1.f; | 293 float device_scale_factor = 1.f; |
| 293 gfx::Rect device_viewport_rect(0, 0, 100, 100); | 294 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
| 294 | 295 |
| 295 settings_.should_clear_root_render_pass = false; | 296 settings_.should_clear_root_render_pass = false; |
| 296 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 297 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 297 | 298 |
| 298 RenderPassList list; | 299 RenderPassList list; |
| 299 | 300 |
| 300 // Draw a fullscreen green quad in a first frame. | 301 // Draw a fullscreen green quad in a first frame. |
| 301 RenderPassId root_clear_pass_id(1, 0); | 302 RenderPassId root_clear_pass_id(1, 0); |
| 302 RenderPass* root_clear_pass = AddRenderPass( | 303 RenderPass* root_clear_pass = AddRenderPass( |
| 303 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); | 304 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
| 304 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); | 305 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
| 305 | 306 |
| 306 renderer()->DecideRenderPassAllocationsForFrame(list); | 307 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 307 | 308 |
| 308 scoped_ptr<SkBitmap> output = | 309 std::unique_ptr<SkBitmap> output = |
| 309 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 310 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 310 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); | 311 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); |
| 311 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); | 312 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); |
| 312 | 313 |
| 313 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); | 314 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| 314 EXPECT_EQ(SK_ColorGREEN, | 315 EXPECT_EQ(SK_ColorGREEN, |
| 315 output->getColor(device_viewport_rect.width() - 1, | 316 output->getColor(device_viewport_rect.width() - 1, |
| 316 device_viewport_rect.height() - 1)); | 317 device_viewport_rect.height() - 1)); |
| 317 | 318 |
| 318 list.clear(); | 319 list.clear(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 341 EXPECT_EQ(SK_ColorMAGENTA, | 342 EXPECT_EQ(SK_ColorMAGENTA, |
| 342 output->getColor(smaller_rect.x(), smaller_rect.y())); | 343 output->getColor(smaller_rect.x(), smaller_rect.y())); |
| 343 EXPECT_EQ( | 344 EXPECT_EQ( |
| 344 SK_ColorMAGENTA, | 345 SK_ColorMAGENTA, |
| 345 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 346 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
| 346 } | 347 } |
| 347 | 348 |
| 348 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { | 349 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { |
| 349 float device_scale_factor = 1.f; | 350 float device_scale_factor = 1.f; |
| 350 gfx::Rect device_viewport_rect(0, 0, 100, 100); | 351 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
| 351 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 352 InitializeRenderer(base::WrapUnique(new SoftwareOutputDevice)); |
| 352 | 353 |
| 353 RenderPassList list; | 354 RenderPassList list; |
| 354 | 355 |
| 355 // Pass drawn as inner quad is magenta. | 356 // Pass drawn as inner quad is magenta. |
| 356 gfx::Rect smaller_rect(20, 20, 60, 60); | 357 gfx::Rect smaller_rect(20, 20, 60, 60); |
| 357 RenderPassId smaller_pass_id(2, 1); | 358 RenderPassId smaller_pass_id(2, 1); |
| 358 RenderPass* smaller_pass = | 359 RenderPass* smaller_pass = |
| 359 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); | 360 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); |
| 360 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); | 361 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); |
| 361 | 362 |
| 362 // Root pass is green. | 363 // Root pass is green. |
| 363 RenderPassId root_clear_pass_id(1, 0); | 364 RenderPassId root_clear_pass_id(1, 0); |
| 364 RenderPass* root_clear_pass = AddRenderPass( | 365 RenderPass* root_clear_pass = AddRenderPass( |
| 365 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); | 366 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
| 366 AddRenderPassQuad(root_clear_pass, smaller_pass); | 367 AddRenderPassQuad(root_clear_pass, smaller_pass); |
| 367 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); | 368 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
| 368 | 369 |
| 369 // Interior pass quad has smaller visible rect. | 370 // Interior pass quad has smaller visible rect. |
| 370 gfx::Rect interior_visible_rect(30, 30, 40, 40); | 371 gfx::Rect interior_visible_rect(30, 30, 40, 40); |
| 371 root_clear_pass->quad_list.front()->visible_rect = interior_visible_rect; | 372 root_clear_pass->quad_list.front()->visible_rect = interior_visible_rect; |
| 372 | 373 |
| 373 renderer()->DecideRenderPassAllocationsForFrame(list); | 374 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 374 | 375 |
| 375 scoped_ptr<SkBitmap> output = | 376 std::unique_ptr<SkBitmap> output = |
| 376 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); | 377 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 377 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); | 378 EXPECT_EQ(device_viewport_rect.width(), output->info().width()); |
| 378 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); | 379 EXPECT_EQ(device_viewport_rect.height(), output->info().height()); |
| 379 | 380 |
| 380 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); | 381 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| 381 EXPECT_EQ(SK_ColorGREEN, | 382 EXPECT_EQ(SK_ColorGREEN, |
| 382 output->getColor(device_viewport_rect.width() - 1, | 383 output->getColor(device_viewport_rect.width() - 1, |
| 383 device_viewport_rect.height() - 1)); | 384 device_viewport_rect.height() - 1)); |
| 384 | 385 |
| 385 // Part outside visible rect should remain green. | 386 // Part outside visible rect should remain green. |
| 386 EXPECT_EQ(SK_ColorGREEN, | 387 EXPECT_EQ(SK_ColorGREEN, |
| 387 output->getColor(smaller_rect.x(), smaller_rect.y())); | 388 output->getColor(smaller_rect.x(), smaller_rect.y())); |
| 388 EXPECT_EQ( | 389 EXPECT_EQ( |
| 389 SK_ColorGREEN, | 390 SK_ColorGREEN, |
| 390 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 391 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
| 391 | 392 |
| 392 EXPECT_EQ( | 393 EXPECT_EQ( |
| 393 SK_ColorMAGENTA, | 394 SK_ColorMAGENTA, |
| 394 output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); | 395 output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); |
| 395 EXPECT_EQ(SK_ColorMAGENTA, | 396 EXPECT_EQ(SK_ColorMAGENTA, |
| 396 output->getColor(interior_visible_rect.right() - 1, | 397 output->getColor(interior_visible_rect.right() - 1, |
| 397 interior_visible_rect.bottom() - 1)); | 398 interior_visible_rect.bottom() - 1)); |
| 398 } | 399 } |
| 399 | 400 |
| 400 } // namespace | 401 } // namespace |
| 401 } // namespace cc | 402 } // namespace cc |
| OLD | NEW |