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) {