Chromium Code Reviews| Index: content/common/gpu/client/gl_helper_unittests.cc |
| diff --git a/content/common/gpu/client/gl_helper_unittests.cc b/content/common/gpu/client/gl_helper_unittests.cc |
| index 5abeabd260096ffc88cf4bdd0bf1b1ce1ec672d1..9ea54441d3d6f95237d9141af518a4f8631cd1c1 100644 |
| --- a/content/common/gpu/client/gl_helper_unittests.cc |
| +++ b/content/common/gpu/client/gl_helper_unittests.cc |
| @@ -841,6 +841,121 @@ class GLHelperTest : public testing::Test { |
| } |
| } |
| + bool ColorComponentsClose(SkColor component1, SkColor component2) { |
| + int c1 = static_cast<int>(component1); |
| + int c2 = static_cast<int>(component2); |
| + return std::abs(c1 - c2) <= 40; |
| + } |
| + |
| + bool ColorsClose(SkColor color1, SkColor color2) { |
| + // Be tolerant of floating point rounding and lossy color space conversions. |
| + return ColorComponentsClose(SkColorGetR(color1), SkColorGetR(color2)) && |
| + ColorComponentsClose(SkColorGetG(color1), SkColorGetG(color2)) && |
| + ColorComponentsClose(SkColorGetB(color1), SkColorGetB(color2)) && |
| + ColorComponentsClose(SkColorGetA(color1), SkColorGetA(color2)); |
| + } |
| + |
| + bool IsEqual(const SkBitmap& bmp1, const SkBitmap& bmp2) { |
| + if (bmp1.isNull() && bmp2.isNull()) |
| + return true; |
| + if (bmp1.width() != bmp2.width() || |
| + bmp1.height() != bmp2.height() || |
| + bmp1.config() != SkBitmap::kARGB_8888_Config || |
| + bmp2.config() != SkBitmap::kARGB_8888_Config) { |
| + LOG(ERROR) << "Bitmap geometry check failure"; |
| + return false; |
| + } |
| + SkAutoLockPixels lock1(bmp1); |
| + SkAutoLockPixels lock2(bmp2); |
| + if (!bmp1.getPixels() || !bmp2.getPixels()){ |
| + LOG(ERROR) << "Bitmap is not having pixels"; |
| + return false; |
| + } |
| + for (int y = 0; y < bmp1.height(); ++y) { |
| + for (int x = 0; x < bmp1.width(); ++x) { |
| + if (!ColorsClose(bmp1.getColor(x,y), bmp2.getColor(x,y))) |
| + LOG(ERROR) << "Bitmaps color comparision failure"; |
| + return false; |
| + } |
| + } |
| + return true; |
| + } |
| + |
| + //Async readback test. Create a test pattern, create texture |
| + //with test pattern , bind it to fbo and async read the fbo. |
| + //compare inital input with async read output. |
| + void TestAsyncReadback(const gfx::Size& src_size, |
| + const gfx::Rect& src_subrect, |
| + const gfx::Size& dst_size, |
| + SkBitmap::Config bitmap_config) { |
| + DCHECK((bitmap_config == SkBitmap::kRGB_565_Config)|| |
|
piman
2014/01/10 22:38:33
nit: space before ||
sivag
2014/01/15 15:24:13
Done.
|
| + (bitmap_config == SkBitmap::kARGB_8888_Config)); |
|
piman
2014/01/10 22:38:33
nit: indent (1 more space)
sivag
2014/01/15 15:24:13
Done.
|
| + bool rgb565_format = (bitmap_config == SkBitmap::kRGB_565_Config) ? |
| + true : |
| + false; |
| + if(rgb565_format && !helper_->CanUseRgb565Readback()) |
|
piman
2014/01/10 22:38:33
nit: space between if and (
sivag
2014/01/15 15:24:13
Done.
|
| + { |
|
piman
2014/01/10 22:38:33
nit: on previous line
sivag
2014/01/15 15:24:13
Done.
|
| + LOG(ERROR) << "RGB565 Format Not supported on this platform"; |
| + return; |
| + } |
| + WebGLId src_texture = context_->createTexture(); |
| + SkBitmap input_pixels; |
| + input_pixels.setConfig(bitmap_config, src_size.width() , |
| + src_size.height()); |
| + input_pixels.allocPixels(); |
| + SkAutoLockPixels lock1(input_pixels); |
| + // Clear with Red Color |
| + input_pixels.eraseColor(SK_ColorRED); |
| + context_->bindTexture(GL_TEXTURE_2D, src_texture); |
| + |
| + GLenum format = (bitmap_config == SkBitmap::kRGB_565_Config) ? |
| + GL_RGB : GL_RGBA; |
| + GLenum type = (bitmap_config == SkBitmap::kRGB_565_Config) ? |
| + GL_UNSIGNED_SHORT_5_6_5 : GL_UNSIGNED_BYTE; |
| + |
| + context_->texImage2D(GL_TEXTURE_2D, |
| + 0, |
| + format, |
| + src_size.width(), |
| + src_size.height(), |
| + 0, |
| + format, |
| + type, |
| + input_pixels.getPixels()); |
| + |
| + scoped_ptr<SkBitmap> bitmap(new SkBitmap); |
| + bitmap->setConfig(bitmap_config, |
| + dst_size.width(), |
| + dst_size.height(), |
| + 0, kOpaque_SkAlphaType); |
| + if (!bitmap->allocPixels()) |
| + return; |
| + // Clear with White Color |
| + input_pixels.eraseColor(SK_ColorWHITE); |
| + SkAutoLockPixels lock2(*bitmap); |
| + uint8* pixels = static_cast<uint8*>(bitmap->getPixels()); |
| + |
| + /*base::RunLoop run_loop; |
| + WebGLId framebuffer = context_->createFramebuffer(); |
| + context_->bindFramebuffer(GL_FRAMEBUFFER, framebuffer); |
| + context_->bindTexture(GL_TEXTURE_2D, src_texture); |
| + context_->framebufferTexture2D(GL_FRAMEBUFFER, |
| + GL_COLOR_ATTACHMENT0, |
| + GL_TEXTURE_2D, |
| + src_texture, |
| + 0);*/ |
| + // Sync read back doesnt have 565 support. |
| + helper_->ReadbackTextureSync(src_texture, gfx::Rect(src_size), pixels); |
| + // Need to Implement Async Read here? |
| + //run_loop.Run(); |
| + // Both the bitmaps should be same. |
| + bool result = IsEqual(input_pixels, *bitmap); |
| + if(!result){ |
| + LOG(ERROR) << "Bitmap comparision failure"; |
| + } |
| + context_->deleteTexture(src_texture); |
| + } |
| + |
| // YUV readback test. Create a test pattern, convert to YUV |
| // with reference implementation and compare to what gl_helper |
| // returns. |
| @@ -1391,6 +1506,18 @@ TEST_F(GLHelperTest, CheckOptimizations) { |
| CheckOptimizationsTest(); |
| } |
| +TEST_F(GLHelperTest, AsyncReadBackTest) { |
| + |
| + TestAsyncReadback(gfx::Size(100,100), |
| + gfx::Rect(100,100), |
| + gfx::Size(100,100), |
| + SkBitmap::kARGB_8888_Config); |
| + // Async readback 565? |
| + if (HasFailure()) { |
| + return; |
| + } |
| +} |
| + |
| } // namespace |
| // These tests needs to run against a proper GL environment, so we |