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

Side by Side Diff: cc/gl_renderer_pixeltest.cc

Issue 12518026: cc: Add layer-based pixel tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months 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 | Annotate | Revision Log
« no previous file with comments | « cc/cc_tests.gyp ('k') | cc/layer_tree_host_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/gl_renderer.h" 5 #include "cc/gl_renderer.h"
6 6
7 #include "base/file_util.h"
8 #include "base/path_service.h"
9 #include "cc/compositor_frame_metadata.h"
10 #include "cc/draw_quad.h" 7 #include "cc/draw_quad.h"
11 #include "cc/prioritized_resource_manager.h" 8 #include "cc/test/pixel_test.h"
12 #include "cc/resource_provider.h"
13 #include "cc/test/paths.h"
14 #include "cc/test/pixel_test_utils.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "ui/gfx/codec/png_codec.h"
17 #include "ui/gl/gl_implementation.h"
18 #include "webkit/gpu/context_provider_in_process.h"
19 #include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
20 9
21 namespace cc { 10 namespace cc {
22 namespace { 11 namespace {
23 12
24 const int kDeviceViewportWidth = 200; 13 class GLRendererPixelTest : public PixelTest {};
25 const int kDeviceViewportHeight = 200;
26
27 class FakeRendererClient : public RendererClient {
28 public:
29 FakeRendererClient()
30 {
31 }
32
33 // RendererClient methods.
34 virtual gfx::Size DeviceViewportSize() const OVERRIDE {
35 return gfx::Size(kDeviceViewportWidth, kDeviceViewportHeight);
36 }
37 virtual const LayerTreeSettings& Settings() const OVERRIDE {
38 static LayerTreeSettings fake_settings;
39 return fake_settings;
40 }
41 virtual void DidLoseOutputSurface() OVERRIDE { }
42 virtual void OnSwapBuffersComplete() OVERRIDE { }
43 virtual void SetFullRootLayerDamage() OVERRIDE { }
44 virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy&) OVERRIDE {}
45 virtual void EnforceManagedMemoryPolicy(
46 const ManagedMemoryPolicy&) OVERRIDE {}
47 virtual bool HasImplThread() const OVERRIDE { return false; }
48 virtual bool ShouldClearRootRenderPass() const OVERRIDE { return true; }
49 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const
50 OVERRIDE { return CompositorFrameMetadata(); }
51 };
52
53 class GLRendererPixelTest : public testing::Test {
54 protected:
55 GLRendererPixelTest() {}
56
57 virtual void SetUp() {
58 gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL);
59 scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl>
60 context3d(
61 new webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl);
62 context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL);
63 output_surface_.reset(new OutputSurface(
64 context3d.PassAs<WebKit::WebGraphicsContext3D>()));
65 resource_provider_ = ResourceProvider::Create(output_surface_.get());
66 renderer_ = GLRenderer::Create(&fake_client_,
67 output_surface_.get(),
68 resource_provider_.get());
69
70 scoped_refptr<cc::ContextProvider> offscreen_contexts =
71 new webkit::gpu::ContextProviderInProcess(
72 webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER);
73 ASSERT_TRUE(offscreen_contexts->InitializeOnMainThread());
74 resource_provider_->SetOffscreenContextProvider(offscreen_contexts);
75 }
76
77 bool PixelsMatchReference(base::FilePath ref_file) {
78 gfx::Rect viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight);
79
80 SkBitmap bitmap;
81 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
82 viewport_rect.width(), viewport_rect.height());
83 bitmap.allocPixels();
84 unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels());
85 renderer_->GetFramebufferPixels(pixels, viewport_rect);
86
87 base::FilePath test_data_dir;
88 if (!PathService::Get(cc::DIR_TEST_DATA, &test_data_dir))
89 return false;
90
91 // To rebaseline:
92 //return WritePNGFile(bitmap, test_data_dir.Append(ref_file));
93
94 return IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file));
95 }
96
97 scoped_ptr<OutputSurface> output_surface_;
98 FakeRendererClient fake_client_;
99 scoped_ptr<ResourceProvider> resource_provider_;
100 scoped_ptr<GLRenderer> renderer_;
101 };
102 14
103 scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id, 15 scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id,
104 gfx::Rect rect) { 16 gfx::Rect rect) {
105 scoped_ptr<RenderPass> pass = RenderPass::Create(); 17 scoped_ptr<RenderPass> pass = RenderPass::Create();
106 const gfx::Rect output_rect = rect; 18 const gfx::Rect output_rect = rect;
107 const gfx::RectF damage_rect = rect; 19 const gfx::RectF damage_rect = rect;
108 const gfx::Transform transform_to_root_target; 20 const gfx::Transform transform_to_root_target;
109 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); 21 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target);
110 return pass.Pass(); 22 return pass.Pass();
111 } 23 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 WebKit::WebFilterOperations(), // foreground filters 63 WebKit::WebFilterOperations(), // foreground filters
152 skia::RefPtr<SkImageFilter>(), // foreground filter 64 skia::RefPtr<SkImageFilter>(), // foreground filter
153 WebKit::WebFilterOperations()); // background filters 65 WebKit::WebFilterOperations()); // background filters
154 66
155 return quad.PassAs<DrawQuad>(); 67 return quad.PassAs<DrawQuad>();
156 } 68 }
157 69
158 70
159 #if !defined(OS_ANDROID) 71 #if !defined(OS_ANDROID)
160 TEST_F(GLRendererPixelTest, simpleGreenRect) { 72 TEST_F(GLRendererPixelTest, simpleGreenRect) {
161 gfx::Rect rect(kDeviceViewportWidth, kDeviceViewportHeight); 73 gfx::Rect rect(device_viewport_size_);
162 74
163 RenderPass::Id id(1, 1); 75 RenderPass::Id id(1, 1);
164 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 76 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
165 77
166 gfx::Transform content_to_target_transform; 78 gfx::Transform content_to_target_transform;
167 scoped_ptr<SharedQuadState> shared_state = 79 scoped_ptr<SharedQuadState> shared_state =
168 CreateTestSharedQuadState(content_to_target_transform, rect); 80 CreateTestSharedQuadState(content_to_target_transform, rect);
169 81
170 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); 82 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
171 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN); 83 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN);
172 84
173 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); 85 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
174 86
175 RenderPassList pass_list; 87 RenderPassList pass_list;
176 pass_list.push_back(pass.Pass()); 88 pass_list.push_back(pass.Pass());
177 89
178 renderer_->DrawFrame(pass_list); 90 renderer_->DrawFrame(pass_list);
179 91
180 EXPECT_TRUE(PixelsMatchReference( 92 EXPECT_TRUE(PixelsMatchReference(
181 base::FilePath(FILE_PATH_LITERAL("green.png")))); 93 base::FilePath(FILE_PATH_LITERAL("green.png"))));
182 } 94 }
183 95
184 TEST_F(GLRendererPixelTest, RenderPassChangesSize) { 96 TEST_F(GLRendererPixelTest, RenderPassChangesSize) {
185 gfx::Rect viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight); 97 gfx::Rect viewport_rect(device_viewport_size_);
186 98
187 RenderPass::Id root_pass_id(1, 1); 99 RenderPass::Id root_pass_id(1, 1);
188 scoped_ptr<RenderPass> root_pass = 100 scoped_ptr<RenderPass> root_pass =
189 CreateTestRootRenderPass(root_pass_id, viewport_rect); 101 CreateTestRootRenderPass(root_pass_id, viewport_rect);
190 102
191 RenderPass::Id child_pass_id(2, 2); 103 RenderPass::Id child_pass_id(2, 2);
192 gfx::Rect pass_rect(kDeviceViewportWidth, kDeviceViewportHeight); 104 gfx::Rect pass_rect(device_viewport_size_);
193 gfx::Transform transform_to_root; 105 gfx::Transform transform_to_root;
194 scoped_ptr<RenderPass> child_pass = 106 scoped_ptr<RenderPass> child_pass =
195 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); 107 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
196 108
197 gfx::Transform content_to_target_transform; 109 gfx::Transform content_to_target_transform;
198 scoped_ptr<SharedQuadState> shared_state = 110 scoped_ptr<SharedQuadState> shared_state =
199 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); 111 CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
200 112
201 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); 113 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
202 blue->SetNew(shared_state.get(), 114 blue->SetNew(shared_state.get(),
203 gfx::Rect(0, 115 gfx::Rect(0,
204 0, 116 0,
205 kDeviceViewportWidth / 2, 117 device_viewport_size_.width() / 2,
206 kDeviceViewportHeight), 118 device_viewport_size_.height()),
207 SK_ColorBLUE); 119 SK_ColorBLUE);
208 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); 120 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
209 yellow->SetNew(shared_state.get(), 121 yellow->SetNew(shared_state.get(),
210 gfx::Rect(kDeviceViewportWidth / 2, 122 gfx::Rect(device_viewport_size_.width() / 2,
211 0, 123 0,
212 kDeviceViewportWidth / 2, 124 device_viewport_size_.width() / 2,
213 kDeviceViewportHeight), 125 device_viewport_size_.height()),
214 SK_ColorYELLOW); 126 SK_ColorYELLOW);
215 127
216 child_pass->quad_list.push_back(blue.PassAs<DrawQuad>()); 128 child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
217 child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>()); 129 child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
218 130
219 scoped_ptr<SharedQuadState> pass_shared_state = 131 scoped_ptr<SharedQuadState> pass_shared_state =
220 CreateTestSharedQuadState(gfx::Transform(), pass_rect); 132 CreateTestSharedQuadState(gfx::Transform(), pass_rect);
221 root_pass->quad_list.push_back( 133 root_pass->quad_list.push_back(
222 CreateTestRenderPassDrawQuad(pass_shared_state.get(), 134 CreateTestRenderPassDrawQuad(pass_shared_state.get(),
223 pass_rect, 135 pass_rect,
224 child_pass_id)); 136 child_pass_id));
225 137
226 RenderPassList pass_list; 138 RenderPassList pass_list;
227 pass_list.push_back(child_pass.Pass()); 139 pass_list.push_back(child_pass.Pass());
228 pass_list.push_back(root_pass.Pass()); 140 pass_list.push_back(root_pass.Pass());
229 141
230 renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); 142 renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75));
231 renderer_->DecideRenderPassAllocationsForFrame(pass_list); 143 renderer_->DecideRenderPassAllocationsForFrame(pass_list);
232 renderer_->DrawFrame(pass_list); 144 renderer_->DrawFrame(pass_list);
233 145
234 EXPECT_TRUE(PixelsMatchReference( 146 EXPECT_TRUE(PixelsMatchReference(
235 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")))); 147 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png"))));
236 } 148 }
237 149
238 class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { 150 class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest {
239 protected: 151 protected:
240 void DrawFrame() { 152 void DrawFrame() {
241 gfx::Rect device_viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight); 153 gfx::Rect device_viewport_rect(device_viewport_size_);
242 154
243 RenderPass::Id root_id(1, 1); 155 RenderPass::Id root_id(1, 1);
244 scoped_ptr<RenderPass> root_pass = 156 scoped_ptr<RenderPass> root_pass =
245 CreateTestRootRenderPass(root_id, device_viewport_rect); 157 CreateTestRootRenderPass(root_id, device_viewport_rect);
246 root_pass->has_transparent_background = false; 158 root_pass->has_transparent_background = false;
247 159
248 gfx::Transform identity_content_to_target_transform; 160 gfx::Transform identity_content_to_target_transform;
249 161
250 RenderPass::Id filter_pass_id(2, 1); 162 RenderPass::Id filter_pass_id(2, 1);
251 gfx::Transform transform_to_root; 163 gfx::Transform transform_to_root;
(...skipping 29 matching lines...) Expand all
281 0, // mask_resource_id 193 0, // mask_resource_id
282 filter_pass_content_rect_, // contents_changed_since_last_frame 194 filter_pass_content_rect_, // contents_changed_since_last_frame
283 gfx::RectF(), // mask_uv_rect 195 gfx::RectF(), // mask_uv_rect
284 WebKit::WebFilterOperations(), // filters 196 WebKit::WebFilterOperations(), // filters
285 skia::RefPtr<SkImageFilter>(), // filter 197 skia::RefPtr<SkImageFilter>(), // filter
286 background_filters_); 198 background_filters_);
287 root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>()); 199 root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>());
288 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); 200 root_pass->shared_quad_state_list.push_back(shared_state.Pass());
289 } 201 }
290 202
291 const int kColumnWidth = kDeviceViewportWidth / 3; 203 const int kColumnWidth = device_viewport_rect.width() / 3;
292 204
293 gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20); 205 gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20);
294 for (int i = 0; left_rect.y() < kDeviceViewportHeight; ++i) { 206 for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) {
295 scoped_ptr<SharedQuadState> shared_state = 207 scoped_ptr<SharedQuadState> shared_state =
296 CreateTestSharedQuadState(identity_content_to_target_transform, 208 CreateTestSharedQuadState(identity_content_to_target_transform,
297 left_rect); 209 left_rect);
298 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); 210 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
299 color_quad->SetNew(shared_state.get(), left_rect, SK_ColorGREEN); 211 color_quad->SetNew(shared_state.get(), left_rect, SK_ColorGREEN);
300 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); 212 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
301 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); 213 root_pass->shared_quad_state_list.push_back(shared_state.Pass());
302 left_rect += gfx::Vector2d(0, left_rect.height() + 1); 214 left_rect += gfx::Vector2d(0, left_rect.height() + 1);
303 } 215 }
304 216
305 gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20); 217 gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20);
306 for (int i = 0; middle_rect.y() < kDeviceViewportHeight; ++i) { 218 for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) {
307 scoped_ptr<SharedQuadState> shared_state = 219 scoped_ptr<SharedQuadState> shared_state =
308 CreateTestSharedQuadState(identity_content_to_target_transform, 220 CreateTestSharedQuadState(identity_content_to_target_transform,
309 middle_rect); 221 middle_rect);
310 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); 222 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
311 color_quad->SetNew(shared_state.get(), middle_rect, SK_ColorRED); 223 color_quad->SetNew(shared_state.get(), middle_rect, SK_ColorRED);
312 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); 224 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
313 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); 225 root_pass->shared_quad_state_list.push_back(shared_state.Pass());
314 middle_rect += gfx::Vector2d(0, middle_rect.height() + 1); 226 middle_rect += gfx::Vector2d(0, middle_rect.height() + 1);
315 } 227 }
316 228
317 gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20); 229 gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20);
318 for (int i = 0; right_rect.y() < kDeviceViewportHeight; ++i) { 230 for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) {
319 scoped_ptr<SharedQuadState> shared_state = 231 scoped_ptr<SharedQuadState> shared_state =
320 CreateTestSharedQuadState(identity_content_to_target_transform, 232 CreateTestSharedQuadState(identity_content_to_target_transform,
321 right_rect); 233 right_rect);
322 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); 234 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
323 color_quad->SetNew(shared_state.get(), right_rect, SK_ColorBLUE); 235 color_quad->SetNew(shared_state.get(), right_rect, SK_ColorBLUE);
324 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); 236 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
325 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); 237 root_pass->shared_quad_state_list.push_back(shared_state.Pass());
326 right_rect += gfx::Vector2d(0, right_rect.height() + 1); 238 right_rect += gfx::Vector2d(0, right_rect.height() + 1);
327 } 239 }
328 240
(...skipping 18 matching lines...) Expand all
347 259
348 WebKit::WebFilterOperations background_filters_; 260 WebKit::WebFilterOperations background_filters_;
349 gfx::Transform filter_pass_to_target_transform_; 261 gfx::Transform filter_pass_to_target_transform_;
350 gfx::Rect filter_pass_content_rect_; 262 gfx::Rect filter_pass_content_rect_;
351 }; 263 };
352 264
353 TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) { 265 TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) {
354 background_filters_.append( 266 background_filters_.append(
355 WebKit::WebFilterOperation::createInvertFilter(1.f)); 267 WebKit::WebFilterOperation::createInvertFilter(1.f));
356 268
357 filter_pass_content_rect_ = 269 filter_pass_content_rect_ = gfx::Rect(device_viewport_size_);
358 gfx::Rect(kDeviceViewportWidth, kDeviceViewportHeight);
359 filter_pass_content_rect_.Inset(12, 14, 16, 18); 270 filter_pass_content_rect_.Inset(12, 14, 16, 18);
360 271
361 DrawFrame(); 272 DrawFrame();
362 EXPECT_TRUE(PixelsMatchReference( 273 EXPECT_TRUE(PixelsMatchReference(
363 base::FilePath(FILE_PATH_LITERAL("background_filter.png")))); 274 base::FilePath(FILE_PATH_LITERAL("background_filter.png"))));
364 } 275 }
365 #endif 276 #endif
366 277
367 } // namespace 278 } // namespace
368 } // namespace cc 279 } // namespace cc
OLDNEW
« no previous file with comments | « cc/cc_tests.gyp ('k') | cc/layer_tree_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698