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/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 |