Add fallback path for drawing unsupported bitmap configs Cherry-pick of https://skia-review.googlesource.com/c/skia/+/154180 to android/next-release. Second of two changes to support fallback for uploading F16 bitmaps. Just converts to RGBA_8888 before uploading. No-Tree-Checks: true No-Try: true No-Presubmit: true Bug: skia:8375 Change-Id: I7e323da51debb4950c17049ed3b4822a202cba73 Reviewed-On: https://skia-review.googlesource.com/154180 Reviewed-By: Robert Phillips <robertphillips@google.com> Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-on: https://skia-review.googlesource.com/154622
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp index 4ca0511..b0df9be 100644 --- a/src/gpu/GrProxyProvider.cpp +++ b/src/gpu/GrProxyProvider.cpp
@@ -17,6 +17,7 @@ #include "GrTextureProxyCacheAccess.h" #include "GrTextureRenderTargetProxy.h" #include "../private/GrSingleOwner.h" +#include "SkAutoPixmapStorage.h" #include "SkBitmap.h" #include "SkGr.h" #include "SkImage.h" @@ -211,13 +212,24 @@ return nullptr; } - GrPixelConfig config = SkImageInfo2GrPixelConfig(as_IB(srcImage)->onImageInfo(), - *this->caps()); + SkImageInfo info = as_IB(srcImage)->onImageInfo(); + GrPixelConfig config = SkImageInfo2GrPixelConfig(info, *this->caps()); if (kUnknown_GrPixelConfig == config) { return nullptr; } + if (!this->caps()->isConfigTexturable(config)) { + SkBitmap copy8888; + if (!copy8888.tryAllocPixels(info.makeColorType(kRGBA_8888_SkColorType)) || + !srcImage->readPixels(copy8888.pixmap(), 0, 0)) { + return nullptr; + } + copy8888.setImmutable(); + srcImage = SkMakeImageFromRasterBitmap(copy8888, kNever_SkCopyPixelsMode); + config = kRGBA_8888_GrPixelConfig; + } + if (SkToBool(flags & kRenderTarget_GrSurfaceFlag)) { sampleCnt = this->caps()->getRenderTargetSampleCount(sampleCnt, config); if (!sampleCnt) { @@ -307,13 +319,25 @@ 1, SkBudgeted::kYes, SkBackingFit::kExact); } - sk_sp<SkMipMap> mipmaps(SkMipMap::Build(bitmap, mipColorMode, nullptr)); + GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(bitmap.info(), *this->caps()); + if (!this->caps()->isConfigTexturable(desc.fConfig)) { + SkBitmap copy8888; + if (!copy8888.tryAllocPixels(bitmap.info().makeColorType(kRGBA_8888_SkColorType)) || + !bitmap.readPixels(copy8888.pixmap())) { + return nullptr; + } + copy8888.setImmutable(); + baseLevel = SkMakeImageFromRasterBitmap(copy8888, kNever_SkCopyPixelsMode); + desc.fConfig = kRGBA_8888_GrPixelConfig; + } + + SkPixmap pixmap; + SkAssertResult(baseLevel->peekPixels(&pixmap)); + sk_sp<SkMipMap> mipmaps(SkMipMap::Build(pixmap, mipColorMode, nullptr)); if (!mipmaps) { return nullptr; } - GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(bitmap.info(), *this->caps()); - sk_sp<GrTextureProxy> proxy = this->createLazyProxy( [desc, baseLevel, mipmaps, mipColorMode] (GrResourceProvider* resourceProvider) {