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/gl_renderer.h" | 5 #include "cc/gl_renderer.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
9 #include "cc/draw_quad.h" | 9 #include "cc/draw_quad.h" |
10 #include "cc/prioritized_resource_manager.h" | 10 #include "cc/prioritized_resource_manager.h" |
(...skipping 25 matching lines...) Expand all Loading... | |
36 } | 36 } |
37 virtual void didLoseOutputSurface() OVERRIDE { } | 37 virtual void didLoseOutputSurface() OVERRIDE { } |
38 virtual void onSwapBuffersComplete() OVERRIDE { } | 38 virtual void onSwapBuffersComplete() OVERRIDE { } |
39 virtual void setFullRootLayerDamage() OVERRIDE { } | 39 virtual void setFullRootLayerDamage() OVERRIDE { } |
40 virtual void setManagedMemoryPolicy(const ManagedMemoryPolicy&) OVERRIDE {} | 40 virtual void setManagedMemoryPolicy(const ManagedMemoryPolicy&) OVERRIDE {} |
41 virtual void enforceManagedMemoryPolicy( | 41 virtual void enforceManagedMemoryPolicy( |
42 const ManagedMemoryPolicy&) OVERRIDE {} | 42 const ManagedMemoryPolicy&) OVERRIDE {} |
43 virtual bool hasImplThread() const OVERRIDE { return false; } | 43 virtual bool hasImplThread() const OVERRIDE { return false; } |
44 }; | 44 }; |
45 | 45 |
46 | |
47 class GLRendererPixelTest : public testing::Test { | 46 class GLRendererPixelTest : public testing::Test { |
48 protected: | 47 protected: |
49 GLRendererPixelTest() {} | 48 GLRendererPixelTest() {} |
50 | 49 |
51 virtual void SetUp() { | 50 virtual void SetUp() { |
52 gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL); | 51 gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL); |
53 output_surface_ = PixelTestOutputSurface::create(); | 52 output_surface_ = PixelTestOutputSurface::create(); |
54 resource_provider_ = ResourceProvider::create(output_surface_.get()); | 53 resource_provider_ = ResourceProvider::create(output_surface_.get()); |
55 renderer_ = GLRenderer::create(&fake_client_, resource_provider_.get()); | 54 renderer_ = GLRenderer::create(&fake_client_, resource_provider_.get()); |
56 } | 55 } |
57 | 56 |
57 bool PixelsMatchReference(FilePath ref_file, gfx::Rect viewport_rect) { | |
58 SkBitmap bitmap; | |
59 bitmap.setConfig(SkBitmap::kARGB_8888_Config, | |
60 viewport_rect.width(), viewport_rect.height()); | |
61 bitmap.allocPixels(); | |
62 unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels()); | |
63 renderer_->getFramebufferPixels(pixels, viewport_rect); | |
64 | |
65 FilePath test_data_dir; | |
66 if (!PathService::Get(cc::test::DIR_TEST_DATA, &test_data_dir)) | |
67 return false; | |
68 | |
69 return test::IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file)); | |
70 } | |
71 | |
58 scoped_ptr<OutputSurface> output_surface_; | 72 scoped_ptr<OutputSurface> output_surface_; |
59 FakeRendererClient fake_client_; | 73 FakeRendererClient fake_client_; |
60 scoped_ptr<ResourceProvider> resource_provider_; | 74 scoped_ptr<ResourceProvider> resource_provider_; |
61 scoped_ptr<GLRenderer> renderer_; | 75 scoped_ptr<GLRenderer> renderer_; |
62 }; | 76 }; |
63 | 77 |
64 #if !defined(OS_ANDROID) | 78 scoped_ptr<RenderPass> CreateTestRenderPass(RenderPass::Id id, gfx::Rect rect) { |
65 TEST_F(GLRendererPixelTest, simpleGreenRect) { | 79 scoped_ptr<RenderPass> pass = RenderPass::Create(); |
66 gfx::Rect rect(0, 0, 200, 200); | |
67 | |
68 RenderPass::Id id(1, 1); | |
69 const gfx::Rect output_rect = rect; | 80 const gfx::Rect output_rect = rect; |
70 const gfx::RectF damage_rect = rect; | 81 const gfx::RectF damage_rect = rect; |
71 const gfx::Transform transform_to_root_target; | 82 const gfx::Transform transform_to_root_target; |
72 scoped_ptr<RenderPass> pass = RenderPass::Create(); | |
73 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); | 83 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); |
84 return pass.Pass(); | |
85 } | |
74 | 86 |
75 const gfx::Transform content_to_target_transform; | 87 scoped_ptr<SharedQuadState> CreateTestSharedQuadState( |
88 gfx::Transform content_to_target_transform, gfx::Rect rect) { | |
76 const gfx::Rect visible_content_rect = rect; | 89 const gfx::Rect visible_content_rect = rect; |
77 const gfx::Rect clipped_rect_in_target = rect; | 90 const gfx::Rect clipped_rect_in_target = rect; |
78 const gfx::Rect clip_rect = rect; | 91 const gfx::Rect clip_rect = rect; |
79 const bool is_clipped = false; | 92 const bool is_clipped = false; |
80 const float opacity = 1.0f; | 93 const float opacity = 1.0f; |
81 scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create(); | 94 scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create(); |
82 shared_state->SetAll(content_to_target_transform, | 95 shared_state->SetAll(content_to_target_transform, |
83 visible_content_rect, | 96 visible_content_rect, |
84 clipped_rect_in_target, | 97 clipped_rect_in_target, |
85 clip_rect, | 98 clip_rect, |
86 is_clipped, | 99 is_clipped, |
87 opacity); | 100 opacity); |
101 return shared_state.Pass(); | |
102 } | |
103 | |
104 scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad( | |
105 SharedQuadState* shared_state, gfx::Rect rect, RenderPass::Id pass_id) { | |
106 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create(); | |
107 quad->SetNew(shared_state, | |
108 rect, | |
109 pass_id, | |
110 false, // is_replica | |
111 0, // mask_resource_id | |
112 rect, // contents_changed_since_last_frame | |
113 gfx::RectF()); // mask_uv_rect | |
114 | |
115 return quad.PassAs<DrawQuad>(); | |
116 } | |
117 | |
118 | |
119 #if !defined(OS_ANDROID) | |
Nico
2013/11/09 06:51:54
Is there a tracking bug for enabling this on andro
| |
120 TEST_F(GLRendererPixelTest, simpleGreenRect) { | |
121 gfx::Rect rect(0, 0, 200, 200); | |
122 | |
123 RenderPass::Id id(1, 1); | |
124 scoped_ptr<RenderPass> pass = CreateTestRenderPass(id, rect); | |
125 | |
126 gfx::Transform content_to_target_transform; | |
127 scoped_ptr<SharedQuadState> shared_state = | |
128 CreateTestSharedQuadState(content_to_target_transform, rect); | |
88 | 129 |
89 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | 130 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); |
90 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN); | 131 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN); |
91 | 132 |
92 pass->quad_list.append(color_quad.PassAs<DrawQuad>()); | 133 pass->quad_list.append(color_quad.PassAs<DrawQuad>()); |
93 | 134 |
94 RenderPassList pass_list; | 135 RenderPassList pass_list; |
95 pass_list.push_back(pass.get()); | 136 pass_list.push_back(pass.get()); |
96 RenderPassIdHashMap pass_map; | 137 RenderPassIdHashMap pass_map; |
97 pass_map.add(id, pass.PassAs<RenderPass>()); | 138 pass_map.add(id, pass.PassAs<RenderPass>()); |
98 | 139 |
99 renderer_->drawFrame(pass_list, pass_map); | 140 renderer_->drawFrame(pass_list, pass_map); |
100 | 141 |
101 SkBitmap bitmap; | 142 EXPECT_TRUE(PixelsMatchReference(FilePath(FILE_PATH_LITERAL("green.png")), |
102 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 200, 200); | 143 rect)); |
103 bitmap.allocPixels(); | 144 } |
104 unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels()); | |
105 renderer_->getFramebufferPixels(pixels, gfx::Rect(0, 0, 200, 200)); | |
106 | 145 |
107 FilePath test_data_dir; | 146 TEST_F(GLRendererPixelTest, RenderPassChangesSize) { |
108 ASSERT_TRUE(PathService::Get(cc::test::DIR_TEST_DATA, &test_data_dir)); | 147 gfx::Rect viewport_rect(200, 200); |
109 // test::WritePNGFile(bitmap, test_data_dir.AppendASCII("green.png")); | 148 |
110 EXPECT_TRUE(test::IsSameAsPNGFile(bitmap, | 149 RenderPass::Id root_pass_id(1, 1); |
111 test_data_dir.AppendASCII("green.png"))); | 150 scoped_ptr<RenderPass> root_pass = |
151 CreateTestRenderPass(root_pass_id, viewport_rect); | |
152 | |
153 RenderPass::Id child_pass_id(2, 2); | |
154 gfx::Rect pass_rect(200, 200); | |
155 scoped_ptr<RenderPass> child_pass = | |
156 CreateTestRenderPass(child_pass_id, pass_rect); | |
157 | |
158 gfx::Transform content_to_target_transform; | |
159 scoped_ptr<SharedQuadState> shared_state = | |
160 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | |
161 | |
162 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | |
163 blue->SetNew(shared_state.get(), gfx::Rect(0, 0, 100, 200), SK_ColorBLUE); | |
164 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); | |
165 yellow->SetNew(shared_state.get(), gfx::Rect(100, 0, 100, 200), SK_ColorYELLOW ); | |
166 | |
167 child_pass->quad_list.append(blue.PassAs<DrawQuad>()); | |
168 child_pass->quad_list.append(yellow.PassAs<DrawQuad>()); | |
169 | |
170 scoped_ptr<SharedQuadState> pass_shared_state = | |
171 CreateTestSharedQuadState(gfx::Transform(), pass_rect); | |
172 root_pass->quad_list.append( | |
173 CreateTestRenderPassDrawQuad(pass_shared_state.get(), | |
174 pass_rect, | |
175 child_pass_id)); | |
176 | |
177 RenderPassList pass_list; | |
178 pass_list.push_back(child_pass.get()); | |
179 pass_list.push_back(root_pass.get()); | |
180 | |
181 RenderPassIdHashMap pass_map; | |
182 pass_map.add(child_pass_id, child_pass.Pass()); | |
183 pass_map.add(root_pass_id, root_pass.Pass()); | |
184 | |
185 renderer_->setEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); | |
186 renderer_->decideRenderPassAllocationsForFrame(pass_list); | |
187 renderer_->drawFrame(pass_list, pass_map); | |
188 | |
189 EXPECT_TRUE(PixelsMatchReference( | |
190 FilePath(FILE_PATH_LITERAL("blue_yellow.png")), viewport_rect)); | |
112 } | 191 } |
113 #endif | 192 #endif |
114 | 193 |
115 } // namespace | 194 } // namespace |
116 } // namespace cc | 195 } // namespace cc |
OLD | NEW |