Make rest of GrGpu::wrapBackend* methods take a GrColorType (take 2)
This CL is intended to further wean Ganesh off of using the GrBackendTexture's pixel config
TBR=bsalomon@google.com
Bug: skia:6718
Change-Id: Iedaa7811f9c4aac552f219c702627bc476325317
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/228338
Reviewed-by: Robert Phillips <robertphillips@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/image/SkImage_GpuBase.cpp b/src/image/SkImage_GpuBase.cpp
index 830c7eb..e2f70ae 100644
--- a/src/image/SkImage_GpuBase.cpp
+++ b/src/image/SkImage_GpuBase.cpp
@@ -39,7 +39,8 @@
#endif
bool SkImage_GpuBase::ValidateBackendTexture(GrContext* ctx, const GrBackendTexture& tex,
- GrPixelConfig* config, SkColorType ct, SkAlphaType at,
+ GrPixelConfig* config, GrColorType grCT,
+ SkColorType ct, SkAlphaType at,
sk_sp<SkColorSpace> cs) {
if (!tex.isValid()) {
return false;
@@ -55,16 +56,6 @@
return false;
}
- GrColorType grCT = SkColorTypeToGrColorType(ct);
- // Until we support SRGB in the SkColorType we have to do this manual check here to make sure
- // we use the correct GrColorType.
- if (ctx->priv().caps()->isFormatSRGB(backendFormat)) {
- if (grCT != GrColorType::kRGBA_8888) {
- return false;
- }
- grCT = GrColorType::kRGBA_8888_SRGB;
- }
-
*config = ctx->priv().caps()->getConfigFromBackendFormat(backendFormat, grCT);
return *config != kUnknown_GrPixelConfig;
}
@@ -247,6 +238,7 @@
GrSurfaceOrigin imageOrigin,
sk_sp<GrTextureProxy> tempTextureProxies[4]) {
GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
+ const GrCaps* caps = ctx->priv().caps();
// We need to make a copy of the input backend textures because we need to preserve the result
// of validate_backend_texture.
@@ -258,39 +250,48 @@
return false;
}
yuvaTexturesCopy[textureIndex].fConfig =
- ctx->priv().caps()->getYUVAConfigFromBackendFormat(backendFormat);
+ caps->getYUVAConfigFromBackendFormat(backendFormat);
if (yuvaTexturesCopy[textureIndex].fConfig == kUnknown_GrPixelConfig) {
return false;
}
+ GrColorType grColorType = caps->getYUVAColorTypeFromBackendFormat(backendFormat);
+ if (GrColorType::kUnknown == grColorType) {
+ return false;
+ }
+
SkASSERT(yuvaTexturesCopy[textureIndex].isValid());
tempTextureProxies[textureIndex] = proxyProvider->wrapBackendTexture(
- yuvaTexturesCopy[textureIndex], imageOrigin, kBorrow_GrWrapOwnership,
+ yuvaTexturesCopy[textureIndex], grColorType, imageOrigin, kBorrow_GrWrapOwnership,
GrWrapCacheable::kNo, kRead_GrIOType);
if (!tempTextureProxies[textureIndex]) {
return false;
}
// Check that each texture contains the channel data for the corresponding YUVA index
- GrPixelConfig config = yuvaTexturesCopy[textureIndex].fConfig;
+ auto componentFlags = GrColorTypeComponentFlags(grColorType);
for (int yuvaIndex = 0; yuvaIndex < SkYUVAIndex::kIndexCount; ++yuvaIndex) {
if (yuvaIndices[yuvaIndex].fIndex == textureIndex) {
switch (yuvaIndices[yuvaIndex].fChannel) {
case SkColorChannel::kR:
- if (kAlpha_8_as_Alpha_GrPixelConfig == config) {
+ // TODO: Chrome needs to be patched before this can be
+ // enforced.
+// if (!(kRed_SkColorTypeComponentFlag & componentFlags)) {
+// return false;
+// }
+ break;
+ case SkColorChannel::kG:
+ if (!(kGreen_SkColorTypeComponentFlag & componentFlags)) {
return false;
}
break;
- case SkColorChannel::kG:
case SkColorChannel::kB:
- if (kAlpha_8_as_Alpha_GrPixelConfig == config ||
- kAlpha_8_as_Red_GrPixelConfig == config) {
+ if (!(kBlue_SkColorTypeComponentFlag & componentFlags)) {
return false;
}
break;
case SkColorChannel::kA:
- default:
- if (kRGB_888_GrPixelConfig == config) {
+ if (!(kAlpha_SkColorTypeComponentFlag & componentFlags)) {
return false;
}
break;
@@ -327,7 +328,7 @@
}
sk_sp<GrTextureProxy> SkImage_GpuBase::MakePromiseImageLazyProxy(
- GrContext* context, int width, int height, GrSurfaceOrigin origin, GrPixelConfig config,
+ GrContext* context, int width, int height, GrSurfaceOrigin origin, GrColorType colorType,
GrBackendFormat backendFormat, GrMipMapped mipMapped,
PromiseImageTextureFulfillProc fulfillProc,
PromiseImageTextureReleaseProc releaseProc,
@@ -337,7 +338,7 @@
SkASSERT(context);
SkASSERT(width > 0 && height > 0);
SkASSERT(doneProc);
- SkASSERT(config != kUnknown_GrPixelConfig);
+ SkASSERT(colorType != GrColorType::kUnknown);
if (!fulfillProc || !releaseProc) {
doneProc(textureContext);
@@ -372,11 +373,11 @@
PromiseImageTextureReleaseProc releaseProc,
PromiseImageTextureDoneProc doneProc,
PromiseImageTextureContext context,
- GrPixelConfig config,
+ GrColorType colorType,
PromiseImageApiVersion version)
: fFulfillProc(fulfillProc)
, fReleaseProc(releaseProc)
- , fConfig(config)
+ , fColorType(colorType)
, fVersion(version) {
fDoneCallback = sk_make_sp<GrRefCntedCallback>(doneProc, context);
}
@@ -409,7 +410,7 @@
// Fulfill once. So return our cached result.
if (fTexture) {
return {sk_ref_sp(fTexture), kKeySyncMode};
- } else if (fConfig == kUnknown_GrPixelConfig) {
+ } else if (fColorType == GrColorType::kUnknown) {
// We've already called fulfill and it failed. Our contract says that we should only
// call each callback once.
return {};
@@ -422,22 +423,30 @@
auto releaseCallback = sk_make_sp<GrRefCntedCallback>(fReleaseProc, textureContext);
if (!promiseTexture) {
// This records that we have failed.
- fConfig = kUnknown_GrPixelConfig;
+ fColorType = GrColorType::kUnknown;
return {};
}
auto backendTexture = promiseTexture->backendTexture();
- backendTexture.fConfig = fConfig;
if (!backendTexture.isValid()) {
return {};
}
+ // TODO: delete this block
+ {
+ GrPixelConfig config = resourceProvider->caps()->getConfigFromBackendFormat(
+ backendTexture.getBackendFormat(),
+ fColorType);
+ SkASSERT(kUnknown_GrPixelConfig != config);
+ backendTexture.fConfig = config;
+ }
+
sk_sp<GrTexture> tex;
static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
GrUniqueKey key;
GrUniqueKey::Builder builder(&key, kDomain, 2, "promise");
builder[0] = promiseTexture->uniqueID();
- builder[1] = fConfig;
+ builder[1] = (uint32_t) fColorType;
builder.finish();
// A texture with this key may already exist from a different instance of this lazy
// callback. This could happen if the client fulfills a promise image with a texture
@@ -447,8 +456,8 @@
SkASSERT(tex);
} else {
if ((tex = resourceProvider->wrapBackendTexture(
- backendTexture, kBorrow_GrWrapOwnership, GrWrapCacheable::kYes,
- kRead_GrIOType))) {
+ backendTexture, fColorType, kBorrow_GrWrapOwnership,
+ GrWrapCacheable::kYes, kRead_GrIOType))) {
tex->resourcePriv().setUniqueKey(key);
} else {
return {};
@@ -477,12 +486,16 @@
sk_sp<GrRefCntedCallback> fDoneCallback;
GrTexture* fTexture = nullptr;
uint32_t fTextureContextID = SK_InvalidUniqueID;
- GrPixelConfig fConfig;
+ GrColorType fColorType;
PromiseImageApiVersion fVersion;
- } callback(fulfillProc, releaseProc, doneProc, textureContext, config, version);
+ } callback(fulfillProc, releaseProc, doneProc, textureContext, colorType, version);
GrProxyProvider* proxyProvider = context->priv().proxyProvider();
+ GrPixelConfig config = context->priv().caps()->getConfigFromBackendFormat(
+ backendFormat,
+ colorType);
+
GrSurfaceDesc desc;
desc.fWidth = width;
desc.fHeight = height;