Chromium Code Reviews| 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 "cc/layers/quad_sink.h" | 7 #include "cc/layers/quad_sink.h" |
| 8 #include "cc/output/compositor_frame_metadata.h" | 8 #include "cc/output/compositor_frame_metadata.h" |
| 9 #include "cc/output/software_output_device.h" | 9 #include "cc/output/software_output_device.h" |
| 10 #include "cc/quads/render_pass.h" | 10 #include "cc/quads/render_pass.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 scoped_ptr<FakeOutputSurface> output_surface_; | 75 scoped_ptr<FakeOutputSurface> output_surface_; |
| 76 scoped_ptr<ResourceProvider> resource_provider_; | 76 scoped_ptr<ResourceProvider> resource_provider_; |
| 77 scoped_ptr<SoftwareRenderer> renderer_; | 77 scoped_ptr<SoftwareRenderer> renderer_; |
| 78 gfx::Size viewport_size_; | 78 gfx::Size viewport_size_; |
| 79 LayerTreeSettings settings_; | 79 LayerTreeSettings settings_; |
| 80 bool should_clear_root_render_pass_; | 80 bool should_clear_root_render_pass_; |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 TEST_F(SoftwareRendererTest, SolidColorQuad) { | 83 TEST_F(SoftwareRendererTest, SolidColorQuad) { |
| 84 gfx::Size outer_size(100, 100); | 84 gfx::Size outer_size(100, 100); |
| 85 #if !defined(OS_ANDROID) | |
| 86 int outer_pixels = outer_size.width() * outer_size.height(); | 85 int outer_pixels = outer_size.width() * outer_size.height(); |
| 87 #endif | |
| 88 gfx::Size inner_size(98, 98); | 86 gfx::Size inner_size(98, 98); |
| 89 gfx::Rect outer_rect(outer_size); | 87 gfx::Rect outer_rect(outer_size); |
| 90 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 88 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
| 91 set_viewport_size(outer_size); | 89 set_viewport_size(outer_size); |
| 92 | 90 |
| 93 InitializeRenderer(); | 91 InitializeRenderer(); |
| 94 | 92 |
| 95 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); | 93 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); |
| 96 shared_quad_state->SetAll( | 94 shared_quad_state->SetAll( |
| 97 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); | 95 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); |
| 98 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); | 96 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); |
| 99 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); | 97 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); |
| 100 root_render_pass->SetNew( | 98 root_render_pass->SetNew( |
| 101 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); | 99 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); |
| 102 scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create(); | 100 scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create(); |
| 103 outer_quad->SetNew( | 101 outer_quad->SetNew( |
| 104 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); | 102 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); |
| 105 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); | 103 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); |
| 106 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); | 104 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); |
| 107 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 105 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
| 108 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 106 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
| 109 | 107 |
| 110 RenderPassList list; | 108 RenderPassList list; |
| 111 list.push_back(root_render_pass.PassAs<RenderPass>()); | 109 list.push_back(root_render_pass.PassAs<RenderPass>()); |
| 112 renderer()->DrawFrame(&list); | 110 renderer()->DrawFrame(&list); |
| 113 | 111 |
| 114 scoped_ptr<SkColor[]> pixels(new SkColor[DeviceViewportSize().width() * | 112 scoped_ptr<SkPMColor[]> pixels(new SkPMColor[DeviceViewportSize().width() * |
| 115 DeviceViewportSize().height()]); | 113 DeviceViewportSize().height()]); |
| 116 renderer()->GetFramebufferPixels(pixels.get(), outer_rect); | 114 renderer()->GetFramebufferPixels(pixels.get(), outer_rect); |
| 117 | 115 |
| 118 // FIXME: This fails on Android. Endianness maybe? | 116 EXPECT_EQ(SkPreMultiplyColor(SK_ColorYELLOW), pixels[0]); |
| 119 // Yellow: expects 0xFFFFFF00, was 0xFF00FFFF on android. | 117 EXPECT_EQ(SkPreMultiplyColor(SK_ColorYELLOW), pixels[outer_pixels - 1]); |
| 120 // Cyan: expects 0xFF00FFFF, was 0xFFFFFF00 on android. | 118 EXPECT_EQ(SkPreMultiplyColor(SK_ColorCYAN), pixels[outer_size.width() + 1]); |
| 121 // http://crbug.com/154528 | 119 EXPECT_EQ(SkPreMultiplyColor(SK_ColorCYAN), |
| 122 #if !defined(OS_ANDROID) | 120 pixels[outer_pixels - outer_size.width() - 2]); |
| 123 EXPECT_EQ(SK_ColorYELLOW, pixels[0]); | |
| 124 EXPECT_EQ(SK_ColorYELLOW, pixels[outer_pixels - 1]); | |
| 125 EXPECT_EQ(SK_ColorCYAN, pixels[outer_size.width() + 1]); | |
| 126 EXPECT_EQ(SK_ColorCYAN, pixels[outer_pixels - outer_size.width() - 2]); | |
| 127 #endif | |
| 128 } | 121 } |
| 129 | 122 |
| 130 TEST_F(SoftwareRendererTest, TileQuad) { | 123 TEST_F(SoftwareRendererTest, TileQuad) { |
| 131 gfx::Size outer_size(100, 100); | 124 gfx::Size outer_size(100, 100); |
| 132 int outer_pixels = outer_size.width() * outer_size.height(); | 125 int outer_pixels = outer_size.width() * outer_size.height(); |
| 133 gfx::Size inner_size(98, 98); | 126 gfx::Size inner_size(98, 98); |
| 134 int inner_pixels = inner_size.width() * inner_size.height(); | 127 int inner_pixels = inner_size.width() * inner_size.height(); |
| 135 gfx::Rect outer_rect(outer_size); | 128 gfx::Rect outer_rect(outer_size); |
| 136 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 129 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
| 137 set_viewport_size(outer_size); | 130 set_viewport_size(outer_size); |
| 138 InitializeRenderer(); | 131 InitializeRenderer(); |
| 139 | 132 |
| 140 ResourceProvider::ResourceId resource_yellow = | 133 ResourceProvider::ResourceId resource_yellow = |
| 141 resource_provider()->CreateResource( | 134 resource_provider()->CreateResource( |
| 142 outer_size, GL_RGBA, ResourceProvider::TextureUsageAny); | 135 outer_size, GL_RGBA, ResourceProvider::TextureUsageAny); |
| 143 ResourceProvider::ResourceId resource_cyan = | 136 ResourceProvider::ResourceId resource_cyan = |
| 144 resource_provider()->CreateResource( | 137 resource_provider()->CreateResource( |
| 145 inner_size, GL_RGBA, ResourceProvider::TextureUsageAny); | 138 inner_size, GL_RGBA, ResourceProvider::TextureUsageAny); |
| 146 | 139 |
| 147 SkColor yellow = SK_ColorYELLOW; | 140 SkPMColor yellow = SkPreMultiplyColor(SK_ColorYELLOW); |
|
danakj
2013/05/08 17:38:43
So I get that the readback is going to premultipli
| |
| 148 SkColor cyan = SK_ColorCYAN; | 141 SkPMColor cyan = SkPreMultiplyColor(SK_ColorCYAN); |
| 149 scoped_ptr<SkColor[]> yellow_pixels(new SkColor[outer_pixels]); | 142 scoped_ptr<SkPMColor[]> yellow_pixels(new SkPMColor[outer_pixels]); |
| 150 scoped_ptr<SkColor[]> cyan_pixels(new SkColor[inner_pixels]); | 143 scoped_ptr<SkPMColor[]> cyan_pixels(new SkPMColor[inner_pixels]); |
| 151 for (int i = 0; i < outer_pixels; i++) | 144 for (int i = 0; i < outer_pixels; i++) |
| 152 yellow_pixels[i] = yellow; | 145 yellow_pixels[i] = yellow; |
| 153 for (int i = 0; i < inner_pixels; i++) | 146 for (int i = 0; i < inner_pixels; i++) |
| 154 cyan_pixels[i] = cyan; | 147 cyan_pixels[i] = cyan; |
| 155 | 148 |
| 156 resource_provider()->SetPixels( | 149 resource_provider()->SetPixels( |
| 157 resource_yellow, | 150 resource_yellow, |
| 158 reinterpret_cast<uint8_t*>(yellow_pixels.get()), | 151 reinterpret_cast<uint8_t*>(yellow_pixels.get()), |
| 159 gfx::Rect(outer_size), | 152 gfx::Rect(outer_size), |
| 160 gfx::Rect(outer_size), | 153 gfx::Rect(outer_size), |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 190 gfx::RectF(inner_size), | 183 gfx::RectF(inner_size), |
| 191 inner_size, | 184 inner_size, |
| 192 false); | 185 false); |
| 193 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 186 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
| 194 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 187 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
| 195 | 188 |
| 196 RenderPassList list; | 189 RenderPassList list; |
| 197 list.push_back(root_render_pass.PassAs<RenderPass>()); | 190 list.push_back(root_render_pass.PassAs<RenderPass>()); |
| 198 renderer()->DrawFrame(&list); | 191 renderer()->DrawFrame(&list); |
| 199 | 192 |
| 200 scoped_ptr<SkColor[]> pixels(new SkColor[DeviceViewportSize().width() * | 193 scoped_ptr<SkPMColor[]> pixels(new SkPMColor[DeviceViewportSize().width() * |
| 201 DeviceViewportSize().height()]); | 194 DeviceViewportSize().height()]); |
| 202 renderer()->GetFramebufferPixels(pixels.get(), outer_rect); | 195 renderer()->GetFramebufferPixels(pixels.get(), outer_rect); |
| 203 | 196 |
| 204 EXPECT_EQ(SK_ColorYELLOW, pixels[0]); | 197 EXPECT_EQ(SkPreMultiplyColor(SK_ColorYELLOW), pixels[0]); |
| 205 EXPECT_EQ(SK_ColorYELLOW, pixels[outer_pixels - 1]); | 198 EXPECT_EQ(SkPreMultiplyColor(SK_ColorYELLOW), pixels[outer_pixels - 1]); |
| 206 EXPECT_EQ(SK_ColorCYAN, pixels[outer_size.width() + 1]); | 199 EXPECT_EQ(SkPreMultiplyColor(SK_ColorCYAN), pixels[outer_size.width() + 1]); |
| 207 EXPECT_EQ(SK_ColorCYAN, pixels[outer_pixels - outer_size.width() - 2]); | 200 EXPECT_EQ(SkPreMultiplyColor(SK_ColorCYAN), |
| 201 pixels[outer_pixels - outer_size.width() - 2]); | |
| 208 } | 202 } |
| 209 | 203 |
| 210 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { | 204 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
| 211 gfx::Rect viewport_rect(0, 0, 100, 100); | 205 gfx::Rect viewport_rect(0, 0, 100, 100); |
| 212 size_t viewport_pixels = viewport_rect.width() * viewport_rect.height(); | 206 size_t viewport_pixels = viewport_rect.width() * viewport_rect.height(); |
| 213 set_viewport_size(viewport_rect.size()); | 207 set_viewport_size(viewport_rect.size()); |
| 214 set_should_clear_root_render_pass(false); | 208 set_should_clear_root_render_pass(false); |
| 215 InitializeRenderer(); | 209 InitializeRenderer(); |
| 216 | 210 |
| 217 RenderPassList list; | 211 RenderPassList list; |
| 218 scoped_ptr<SkColor[]> pixels(new SkColor[viewport_pixels]); | 212 scoped_ptr<SkPMColor[]> pixels(new SkPMColor[viewport_pixels]); |
| 219 | 213 |
| 220 // Draw a fullscreen green quad in a first frame. | 214 // Draw a fullscreen green quad in a first frame. |
| 221 RenderPass::Id root_clear_pass_id(1, 0); | 215 RenderPass::Id root_clear_pass_id(1, 0); |
| 222 TestRenderPass* root_clear_pass = AddRenderPass( | 216 TestRenderPass* root_clear_pass = AddRenderPass( |
| 223 &list, root_clear_pass_id, viewport_rect, gfx::Transform()); | 217 &list, root_clear_pass_id, viewport_rect, gfx::Transform()); |
| 224 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); | 218 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); |
| 225 | 219 |
| 226 renderer()->DecideRenderPassAllocationsForFrame(list); | 220 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 227 renderer()->DrawFrame(&list); | 221 renderer()->DrawFrame(&list); |
| 228 renderer()->GetFramebufferPixels(pixels.get(), viewport_rect); | 222 renderer()->GetFramebufferPixels(pixels.get(), viewport_rect); |
| 229 | 223 |
| 230 EXPECT_EQ(SK_ColorGREEN, pixels[0]); | 224 EXPECT_EQ(SkPreMultiplyColor(SK_ColorGREEN), pixels[0]); |
| 231 EXPECT_EQ(SK_ColorGREEN, pixels[viewport_pixels - 1]); | 225 EXPECT_EQ(SkPreMultiplyColor(SK_ColorGREEN), pixels[viewport_pixels - 1]); |
| 232 | 226 |
| 233 list.clear(); | 227 list.clear(); |
| 234 | 228 |
| 235 // Draw a smaller magenta rect without filling the viewport in a separate | 229 // Draw a smaller magenta rect without filling the viewport in a separate |
| 236 // frame. | 230 // frame. |
| 237 gfx::Rect smaller_rect(20, 20, 60, 60); | 231 gfx::Rect smaller_rect(20, 20, 60, 60); |
| 238 | 232 |
| 239 RenderPass::Id root_smaller_pass_id(2, 0); | 233 RenderPass::Id root_smaller_pass_id(2, 0); |
| 240 TestRenderPass* root_smaller_pass = AddRenderPass( | 234 TestRenderPass* root_smaller_pass = AddRenderPass( |
| 241 &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); | 235 &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); |
| 242 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); | 236 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); |
| 243 | 237 |
| 244 renderer()->DecideRenderPassAllocationsForFrame(list); | 238 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 245 renderer()->DrawFrame(&list); | 239 renderer()->DrawFrame(&list); |
| 246 renderer()->GetFramebufferPixels(pixels.get(), viewport_rect); | 240 renderer()->GetFramebufferPixels(pixels.get(), viewport_rect); |
| 247 | 241 |
| 248 // If we didn't clear, the borders should still be green. | 242 // If we didn't clear, the borders should still be green. |
| 249 EXPECT_EQ(SK_ColorGREEN, pixels[0]); | 243 EXPECT_EQ(SkPreMultiplyColor(SK_ColorGREEN), pixels[0]); |
| 250 EXPECT_EQ(SK_ColorGREEN, pixels[viewport_pixels - 1]); | 244 EXPECT_EQ(SkPreMultiplyColor(SK_ColorGREEN), pixels[viewport_pixels - 1]); |
| 251 | 245 |
| 252 EXPECT_EQ( | 246 EXPECT_EQ( |
| 253 SK_ColorMAGENTA, | 247 SkPreMultiplyColor(SK_ColorMAGENTA), |
| 254 pixels[smaller_rect.y() * viewport_rect.width() + smaller_rect.x()]); | 248 pixels[smaller_rect.y() * viewport_rect.width() + smaller_rect.x()]); |
| 255 EXPECT_EQ(SK_ColorMAGENTA, | 249 EXPECT_EQ(SkPreMultiplyColor(SK_ColorMAGENTA), |
| 256 pixels[(smaller_rect.bottom() - 1) * viewport_rect.width() + | 250 pixels[(smaller_rect.bottom() - 1) * viewport_rect.width() + |
| 257 smaller_rect.right() - 1]); | 251 smaller_rect.right() - 1]); |
| 258 } | 252 } |
| 259 | 253 |
| 260 } // namespace | 254 } // namespace |
| 261 } // namespace cc | 255 } // namespace cc |
| OLD | NEW |