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 |