diff options
Diffstat (limited to 'libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp')
-rw-r--r-- | libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp index a18d26471a29..89697d7445c6 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLReadback.cpp @@ -63,8 +63,6 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4 CopyResult copyResult = CopyResult::UnknownError; sk_sp<SkImage> image(SkImage::MakeFromAdoptedTexture(grContext.get(), textureDescription)); if (image) { - SkAutoLockPixels alp(*bitmap); - // convert to Skia data structures const SkRect bufferRect = SkRect::MakeIWH(imgWidth, imgHeight); SkRect skiaSrcRect = srcRect.toSkRect(); @@ -88,23 +86,17 @@ CopyResult SkiaOpenGLReadback::copyImageInto(EGLImageKHR eglImage, const Matrix4 textureMatrix.mapRect(&skiaSrcRect); if (skiaSrcRect.intersect(bufferRect)) { - SkPoint srcOrigin = SkPoint::Make(skiaSrcRect.fLeft, skiaSrcRect.fTop); - - // if we need to scale the result we must render to an offscreen buffer - if (bitmap->width() != skiaSrcRect.width() - || bitmap->height() != skiaSrcRect.height()) { - sk_sp<SkSurface> scaledSurface = SkSurface::MakeRenderTarget( - grContext.get(), SkBudgeted::kYes, bitmap->info()); - SkPaint paint; - paint.setBlendMode(SkBlendMode::kSrc); - scaledSurface->getCanvas()->drawImageRect(image, skiaSrcRect, - SkRect::MakeWH(bitmap->width(), bitmap->height()), &paint); - image = scaledSurface->makeImageSnapshot(); - srcOrigin.set(0,0); - } - - if (image->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), - srcOrigin.fX, srcOrigin.fY)) { + // we render in an offscreen buffer to scale and to avoid an issue b/62262733 + // with reading incorrect data from EGLImage backed SkImage (likely a driver bug) + sk_sp<SkSurface> scaledSurface = SkSurface::MakeRenderTarget( + grContext.get(), SkBudgeted::kYes, bitmap->info()); + SkPaint paint; + paint.setBlendMode(SkBlendMode::kSrc); + scaledSurface->getCanvas()->drawImageRect(image, skiaSrcRect, + SkRect::MakeWH(bitmap->width(), bitmap->height()), &paint); + image = scaledSurface->makeImageSnapshot(); + + if (image->readPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes(), 0, 0)) { copyResult = CopyResult::Success; } } |