Add kRGBA_8888_SRGB GrColorType and remove GrSRGBEncoded.

Change-Id: Iad1c72eb81ffd9c006e39c96191fada990d9dbd6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/226224
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrBackendSurface.cpp b/src/gpu/GrBackendSurface.cpp
index 472cd49..8b3e2f1 100644
--- a/src/gpu/GrBackendSurface.cpp
+++ b/src/gpu/GrBackendSurface.cpp
@@ -45,7 +45,7 @@
             break;
 #endif
         case GrBackendApi::kMock:
-            fMock = that.fMock;
+            fMockColorType = that.fMockColorType;
             break;
         default:
             SK_ABORT("Unknown GrBackend");
@@ -154,29 +154,20 @@
 }
 #endif
 
-GrBackendFormat::GrBackendFormat(GrColorType colorType, GrSRGBEncoded srgbEncoded)
+GrBackendFormat::GrBackendFormat(GrColorType colorType)
         : fBackend(GrBackendApi::kMock)
         , fValid(true)
         , fTextureType(GrTextureType::k2D) {
-    fMock.fColorType = colorType;
-    fMock.fSRGBEncoded = srgbEncoded;
+    fMockColorType = colorType;
 }
 
 const GrColorType* GrBackendFormat::getMockColorType() const {
     if (this->isValid() && GrBackendApi::kMock == fBackend) {
-        return &fMock.fColorType;
+        return &fMockColorType;
     }
     return nullptr;
 }
 
-const GrSRGBEncoded* GrBackendFormat::getMockSRGBEncoded() const {
-    if (this->isValid() && GrBackendApi::kMock == fBackend) {
-        return &fMock.fSRGBEncoded;
-    }
-    return nullptr;
-}
-
-
 GrBackendFormat GrBackendFormat::makeTexture2D() const {
     GrBackendFormat copy = *this;
     if (const GrVkYcbcrConversionInfo* ycbcrInfo = this->getVkYcbcrConversionInfo()) {
@@ -217,8 +208,7 @@
 #endif
             break;
         case GrBackendApi::kMock:
-            return fMock.fColorType == that.fMock.fColorType &&
-                   fMock.fSRGBEncoded == that.fMock.fSRGBEncoded;
+            return fMockColorType == that.fMockColorType;
         default:
             SK_ABORT("Unknown GrBackend");
     }
diff --git a/src/gpu/GrCaps.cpp b/src/gpu/GrCaps.cpp
index 8871092..cd14b36 100644
--- a/src/gpu/GrCaps.cpp
+++ b/src/gpu/GrCaps.cpp
@@ -369,10 +369,6 @@
     return true;
 }
 
-GrBackendFormat GrCaps::getBackendFormatFromColorType(GrColorType ct) const {
-    return this->getBackendFormatFromColorType(ct, GrSRGBEncoded::kNo);
-}
-
 GrCaps::SupportedRead GrCaps::supportedReadPixelsColorType(GrPixelConfig config,
                                                            const GrBackendFormat&,
                                                            GrColorType dstColorType) const {
diff --git a/src/gpu/GrCaps.h b/src/gpu/GrCaps.h
index 314165b..2aa5cd4 100644
--- a/src/gpu/GrCaps.h
+++ b/src/gpu/GrCaps.h
@@ -388,9 +388,7 @@
     virtual GrPixelConfig getYUVAConfigFromBackendFormat(const GrBackendFormat& format) const = 0;
 
     /** These are used when creating a new texture internally. */
-    virtual GrBackendFormat getBackendFormatFromColorType(GrColorType ct,
-                                                          GrSRGBEncoded srgbEncoded) const = 0;
-    GrBackendFormat getBackendFormatFromColorType(GrColorType ct) const;
+    virtual GrBackendFormat getBackendFormatFromColorType(GrColorType ct) const = 0;
 
     virtual GrBackendFormat getBackendFormatFromCompressionType(SkImage::CompressionType) const = 0;
 
diff --git a/src/gpu/GrDataUtils.cpp b/src/gpu/GrDataUtils.cpp
index bbd6f3d..8e57d4c 100644
--- a/src/gpu/GrDataUtils.cpp
+++ b/src/gpu/GrDataUtils.cpp
@@ -369,9 +369,10 @@
 }
 
 static GrSwizzle get_load_and_get_swizzle(GrColorType ct, SkRasterPipeline::StockStage* load,
-                                          bool* isNormalized) {
+                                          bool* isNormalized, bool* isSRGB) {
     GrSwizzle swizzle("rgba");
     *isNormalized = true;
+    *isSRGB = false;
     switch (ct) {
         case GrColorType::kAlpha_8:          *load = SkRasterPipeline::load_a8;       break;
         case GrColorType::kBGR_565:          *load = SkRasterPipeline::load_565;      break;
@@ -384,6 +385,9 @@
         case GrColorType::kRG_1616:          *load = SkRasterPipeline::load_rg1616;   break;
         case GrColorType::kRGBA_16161616:    *load = SkRasterPipeline::load_16161616; break;
 
+        case GrColorType::kRGBA_8888_SRGB:   *load = SkRasterPipeline::load_8888;
+                                             *isSRGB = true;
+                                             break;
         case GrColorType::kRG_F16:           *load = SkRasterPipeline::load_rgf16;
                                              *isNormalized = false;
                                              break;
@@ -416,9 +420,10 @@
 }
 
 static GrSwizzle get_dst_swizzle_and_store(GrColorType ct, SkRasterPipeline::StockStage* store,
-                                           bool* isNormalized) {
+                                           bool* isNormalized, bool* isSRGB) {
     GrSwizzle swizzle("rgba");
     *isNormalized = true;
+    *isSRGB = false;
     switch (ct) {
         case GrColorType::kAlpha_8:          *store = SkRasterPipeline::store_a8;       break;
         case GrColorType::kBGR_565:          *store = SkRasterPipeline::store_565;      break;
@@ -430,6 +435,9 @@
         case GrColorType::kRG_1616:          *store = SkRasterPipeline::store_rg1616;   break;
         case GrColorType::kRGBA_16161616:    *store = SkRasterPipeline::store_16161616; break;
 
+        case GrColorType::kRGBA_8888_SRGB:   *store = SkRasterPipeline::store_8888;
+                                             *isSRGB = true;
+                                             break;
         case GrColorType::kRG_F16:           *store = SkRasterPipeline::store_rgf16;
                                              *isNormalized = false;
                                              break;
@@ -499,12 +507,16 @@
 
     SkRasterPipeline::StockStage load;
     bool srcIsNormalized;
-    auto loadSwizzle = get_load_and_get_swizzle(srcInfo.colorType(), &load, &srcIsNormalized);
+    bool srcIsSRGB;
+    auto loadSwizzle = get_load_and_get_swizzle(srcInfo.colorType(), &load, &srcIsNormalized,
+                                                &srcIsSRGB);
     loadSwizzle = GrSwizzle::Concat(loadSwizzle, swizzle);
 
     SkRasterPipeline::StockStage store;
     bool dstIsNormalized;
-    auto storeSwizzle = get_dst_swizzle_and_store(dstInfo.colorType(), &store, &dstIsNormalized);
+    bool dstIsSRGB;
+    auto storeSwizzle = get_dst_swizzle_and_store(dstInfo.colorType(), &store, &dstIsNormalized,
+                                                  &dstIsSRGB);
 
     bool premul   = srcInfo.alphaType() == kUnpremul_SkAlphaType &&
                     dstInfo.alphaType() == kPremul_SkAlphaType;
@@ -541,25 +553,40 @@
         srcCtx.pixels = static_cast<char*>(srcCtx.pixels) + srcRB * (height - 1);
         std::swap(cnt, height);
     }
+
+    bool hasConversion = alphaOrCSConversion || clampGamut;
+
+    if (srcIsSRGB && dstIsSRGB && !hasConversion) {
+        // No need to convert from srgb if we are just going to immediately convert it back.
+        srcIsSRGB = dstIsSRGB = false;
+    }
+
+    hasConversion = hasConversion || srcIsSRGB || dstIsSRGB;
+
     for (int i = 0; i < cnt; ++i) {
         SkRasterPipeline_<256> pipeline;
         pipeline.append(load, &srcCtx);
-
-        if (alphaOrCSConversion) {
+        if (hasConversion) {
             loadSwizzle.apply(&pipeline);
-            steps->apply(&pipeline, srcIsNormalized);
+            if (srcIsSRGB) {
+                pipeline.append(SkRasterPipeline::from_srgb);
+            }
+            if (alphaOrCSConversion) {
+                steps->apply(&pipeline, srcIsNormalized);
+            }
             if (clampGamut) {
                 append_clamp_gamut(&pipeline);
             }
+            // If we add support for storing to Gray we would add a luminance to alpha conversion
+            // here. We also wouldn't then need a to_srgb stage after since it would have not effect
+            // on the alpha channel. It would also mean we have an SRGB Gray color type which
+            // doesn't exist currently.
+            if (dstIsSRGB) {
+                pipeline.append(SkRasterPipeline::to_srgb);
+            }
             storeSwizzle.apply(&pipeline);
         } else {
-            if (clampGamut) {
-                loadSwizzle.apply(&pipeline);
-                append_clamp_gamut(&pipeline);
-                storeSwizzle.apply(&pipeline);
-            } else {
-                loadStoreSwizzle.apply(&pipeline);
-            }
+            loadStoreSwizzle.apply(&pipeline);
         }
         pipeline.append(store, &dstCtx);
         pipeline.run(0, 0, srcInfo.width(), height);
diff --git a/src/gpu/GrDrawOpAtlas.cpp b/src/gpu/GrDrawOpAtlas.cpp
index d28f527..2142647 100644
--- a/src/gpu/GrDrawOpAtlas.cpp
+++ b/src/gpu/GrDrawOpAtlas.cpp
@@ -523,7 +523,7 @@
     }
     desc.fWidth = fTextureWidth;
     desc.fHeight = fTextureHeight;
-    desc.fConfig = GrColorTypeToPixelConfig(fColorType, GrSRGBEncoded::kNo);
+    desc.fConfig = GrColorTypeToPixelConfig(fColorType);
 
     int numPlotsX = fTextureWidth/fPlotWidth;
     int numPlotsY = fTextureHeight/fPlotHeight;
diff --git a/src/gpu/GrRecordingContext.cpp b/src/gpu/GrRecordingContext.cpp
index f676f01..d720771 100644
--- a/src/gpu/GrRecordingContext.cpp
+++ b/src/gpu/GrRecordingContext.cpp
@@ -214,7 +214,7 @@
         return nullptr;
     }
 
-    auto format = this->caps()->getBackendFormatFromColorType(colorType, GrSRGBEncoded::kNo);
+    auto format = this->caps()->getBackendFormatFromColorType(colorType);
     if (!format.isValid()) {
         return nullptr;
     }
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 0709ca3..2226463 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -303,6 +303,7 @@
         case GrColorType::kABGR_4444:
             return 2;
         case GrColorType::kUnknown:
+        case GrColorType::kRGBA_8888_SRGB:
         case GrColorType::kRGBA_1010102:
         case GrColorType::kAlpha_F16:
         case GrColorType::kRGBA_F32:
diff --git a/src/gpu/ccpr/GrCCAtlas.cpp b/src/gpu/ccpr/GrCCAtlas.cpp
index bcf9bc1..aaaff6f 100644
--- a/src/gpu/ccpr/GrCCAtlas.cpp
+++ b/src/gpu/ccpr/GrCCAtlas.cpp
@@ -78,8 +78,7 @@
 
     GrColorType colorType = (CoverageType::kFP16_CoverageCount == fCoverageType)
             ? GrColorType::kAlpha_F16 : GrColorType::kAlpha_8;
-    const GrBackendFormat format =
-            caps.getBackendFormatFromColorType(colorType, GrSRGBEncoded::kNo);
+    const GrBackendFormat format = caps.getBackendFormatFromColorType(colorType);
     GrPixelConfig pixelConfig = (CoverageType::kFP16_CoverageCount == fCoverageType)
             ? kAlpha_half_GrPixelConfig : kAlpha_8_GrPixelConfig;
 
diff --git a/src/gpu/ccpr/GrCCClipPath.cpp b/src/gpu/ccpr/GrCCClipPath.cpp
index 574d744..579489e 100644
--- a/src/gpu/ccpr/GrCCClipPath.cpp
+++ b/src/gpu/ccpr/GrCCClipPath.cpp
@@ -16,8 +16,7 @@
                         int rtHeight, const GrCaps& caps) {
     SkASSERT(!this->isInitialized());
 
-    const GrBackendFormat format = caps.getBackendFormatFromColorType(GrColorType::kAlpha_F16,
-                                                                      GrSRGBEncoded::kNo);
+    const GrBackendFormat format = caps.getBackendFormatFromColorType(GrColorType::kAlpha_F16);
 
     fAtlasLazyProxy = GrProxyProvider::MakeFullyLazyProxy(
             [this](GrResourceProvider* resourceProvider)
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index e4bd6c6..6e60196 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -1889,10 +1889,10 @@
         }
 
         if (fSRGBSupport) {
-            // kRGBA_8888
+            // kRGBA_8888_SRGB
             {
                 uint32_t flags = ColorTypeInfo::kUploadData_Flag;
-                info.fColorTypeInfos.emplace_back(GrColorType::kRGBA_8888, flags);
+                info.fColorTypeInfos.emplace_back(GrColorType::kRGBA_8888_SRGB, flags);
             }
         }
     }
@@ -3525,6 +3525,8 @@
                 GrColorTypeHasAlpha(dstColorType)) {
                 // This can skip an unnecessary conversion.
                 return {swizzle, GrColorType::kRGB_888x};
+            } else if (kSRGBA_8888_GrPixelConfig == srcPixelConfig) {
+                return {swizzle, GrColorType::kRGBA_8888_SRGB};
             }
             return {swizzle, GrColorType::kRGBA_8888};
         case kFloat_FormatType:
@@ -3659,7 +3661,10 @@
         case GrColorType::kRGBA_8888:
             if (GR_GL_RGBA8 == format) {
                 return kRGBA_8888_GrPixelConfig;
-            } else if (GR_GL_SRGB8_ALPHA8 == format) {
+            }
+            break;
+        case GrColorType::kRGBA_8888_SRGB:
+            if (GR_GL_SRGB8_ALPHA8 == format) {
                 return kSRGBA_8888_GrPixelConfig;
             }
             break;
@@ -3831,9 +3836,8 @@
     return get_yuva_config(*glFormat);
 }
 
-GrBackendFormat GrGLCaps::getBackendFormatFromColorType(GrColorType ct,
-                                                        GrSRGBEncoded srgbEncoded) const {
-    GrPixelConfig config = GrColorTypeToPixelConfig(ct, srgbEncoded);
+GrBackendFormat GrGLCaps::getBackendFormatFromColorType(GrColorType ct) const {
+    GrPixelConfig config = GrColorTypeToPixelConfig(ct);
     if (config == kUnknown_GrPixelConfig) {
         return GrBackendFormat();
     }
@@ -3862,7 +3866,9 @@
         case GrColorType::kABGR_4444:
             return GR_GL_RGBA4 == format;
         case GrColorType::kRGBA_8888:
-            return GR_GL_RGBA8 == format || GR_GL_SRGB8_ALPHA8 == format;
+            return GR_GL_RGBA8 == format;
+        case GrColorType::kRGBA_8888_SRGB:
+            return GR_GL_SRGB8_ALPHA8 == format;
         case GrColorType::kRGB_888x:
             GR_STATIC_ASSERT(GrCompressionTypeClosestColorType(SkImage::kETC1_CompressionType) ==
                              GrColorType::kRGB_888x);
@@ -3965,7 +3971,7 @@
     if (GrColorType::kRGB_888x == bufferColorType) {
         return 0;
     }
-    auto config = GrColorTypeToPixelConfig(bufferColorType, GrSRGBEncoded::kNo);
+    auto config = GrColorTypeToPixelConfig(bufferColorType);
     // This switch is derived from a table titled "Pixel data type parameter values and the
     // corresponding GL data types" in the OpenGL spec (Table 8.2 in OpenGL 4.5).
     switch (fConfigTable[config].fFormats.fExternalType) {
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index 18fed86..6117293 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -422,8 +422,7 @@
 
     GrPixelConfig getYUVAConfigFromBackendFormat(const GrBackendFormat&) const override;
 
-    GrBackendFormat getBackendFormatFromColorType(GrColorType ct,
-                                                  GrSRGBEncoded srgbEncoded) const override;
+    GrBackendFormat getBackendFormatFromColorType(GrColorType ct) const override;
     GrBackendFormat getBackendFormatFromCompressionType(SkImage::CompressionType) const override;
 
     GrSwizzle getTextureSwizzle(const GrBackendFormat&, GrColorType) const override;
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 44b5228..f7730c6 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -845,8 +845,7 @@
     // When we're on ES2 and the dst is GL_SRGB_ALPHA by making the config be kSRGB_8888 we know
     // that our caps will choose GL_SRGB_ALPHA as the external format, too. On ES3 or regular GL our
     // caps knows to make the external format be GL_RGBA.
-    auto srgbEncoded = GrPixelConfigIsSRGBEncoded(surface->config());
-    auto srcAsConfig = GrColorTypeToPixelConfig(srcColorType, srgbEncoded);
+    auto srcAsConfig = GrColorTypeToPixelConfig(srcColorType);
 
     SkASSERT(!GrPixelConfigIsCompressed(glTex->config()));
     return this->uploadTexData(glTex->config(), glTex->width(), glTex->height(), glTex->target(),
@@ -950,7 +949,7 @@
     // External format and type come from the upload data.
     GrGLenum externalFormat;
     GrGLenum externalType;
-    auto bufferAsConfig = GrColorTypeToPixelConfig(bufferColorType, GrSRGBEncoded::kNo);
+    auto bufferAsConfig = GrColorTypeToPixelConfig(bufferColorType);
     if (!this->glCaps().getTexImageFormats(texConfig, bufferAsConfig, &internalFormat,
                                            &externalFormat, &externalType)) {
         return false;
@@ -2276,7 +2275,7 @@
     }
 
     // TODO: Avoid this conversion by making GrGLCaps work with color types.
-    auto dstAsConfig = GrColorTypeToPixelConfig(dstColorType, GrSRGBEncoded::kNo);
+    auto dstAsConfig = GrColorTypeToPixelConfig(dstColorType);
 
     if (!this->readPixelsSupported(surface, dstAsConfig)) {
         return false;
@@ -4045,7 +4044,7 @@
         return GrBackendRenderTarget();  // invalid
     }
     this->handleDirtyContext();
-    auto config = GrColorTypeToPixelConfig(colorType, GrSRGBEncoded::kNo);
+    auto config = GrColorTypeToPixelConfig(colorType);
     if (!this->glCaps().isConfigRenderable(config)) {
         return {};
     }
diff --git a/src/gpu/mock/GrMockCaps.h b/src/gpu/mock/GrMockCaps.h
index c58dc62..08ce87f 100644
--- a/src/gpu/mock/GrMockCaps.h
+++ b/src/gpu/mock/GrMockCaps.h
@@ -37,26 +37,21 @@
     }
 
     bool isFormatSRGB(const GrBackendFormat& format) const override {
-        if (!format.getMockSRGBEncoded()) {
+        if (!format.getMockColorType()) {
             return false;
         }
-
-        return GrSRGBEncoded::kYes == *format.getMockSRGBEncoded();
+        return *format.getMockColorType() == GrColorType::kRGBA_8888_SRGB;
     }
 
     bool isFormatTexturable(GrColorType, const GrBackendFormat& format) const override {
         if (!format.getMockColorType()) {
             return false;
         }
-
-        // We are ignoring the srgb encoding here
         return fOptions.fConfigOptions[(int)*format.getMockColorType()].fTexturable;
     }
 
     bool isConfigTexturable(GrPixelConfig config) const override {
         GrColorType ct = GrPixelConfigToColorType(config);
-
-        // We are ignoring the srgb encoding here
         return fOptions.fConfigOptions[(int)ct].fTexturable;
     }
 
@@ -87,15 +82,11 @@
         if (!format.getMockColorType()) {
             return 0;
         }
-
-        // We are ignoring the srgb encoding here
         return this->getRenderTargetSampleCount(requestCount, *format.getMockColorType());
     }
 
     int getRenderTargetSampleCount(int requestCount, GrPixelConfig config) const override {
         GrColorType ct = GrPixelConfigToColorType(config);
-
-        // We are ignoring the srgb encoding here
         return this->getRenderTargetSampleCount(requestCount, ct);
     }
 
@@ -115,15 +106,11 @@
         if (!format.getMockColorType()) {
             return 0;
         }
-
-        // We are ignoring the srgb encoding here
         return this->maxRenderTargetSampleCount(*format.getMockColorType());
     }
 
     int maxRenderTargetSampleCount(GrPixelConfig config) const override {
         GrColorType ct = GrPixelConfigToColorType(config);
-
-        // We are ignoring the srgb encoding here
         return this->maxRenderTargetSampleCount(ct);
     }
 
@@ -142,17 +129,15 @@
     }
 
     GrPixelConfig getYUVAConfigFromBackendFormat(const GrBackendFormat& format) const override {
-        if (!format.getMockColorType() || !format.getMockSRGBEncoded()) {
+        if (!format.getMockColorType()) {
             return kUnknown_GrPixelConfig;
         }
 
-        return GrColorTypeToPixelConfig(*format.getMockColorType(),
-                                        *format.getMockSRGBEncoded());
+        return GrColorTypeToPixelConfig(*format.getMockColorType());
     }
 
-    GrBackendFormat getBackendFormatFromColorType(GrColorType ct,
-                                                  GrSRGBEncoded srgbEncoded) const override {
-        return GrBackendFormat::MakeMock(ct, srgbEncoded);
+    GrBackendFormat getBackendFormatFromColorType(GrColorType ct) const override {
+        return GrBackendFormat::MakeMock(ct);
     }
 
     GrBackendFormat getBackendFormatFromCompressionType(SkImage::CompressionType) const override {
@@ -179,12 +164,11 @@
 
     GrPixelConfig onGetConfigFromBackendFormat(const GrBackendFormat& format,
                                                GrColorType) const override {
-        if (!format.getMockColorType() || !format.getMockSRGBEncoded()) {
+        if (!format.getMockColorType()) {
             return kUnknown_GrPixelConfig;
         }
 
-        return GrColorTypeToPixelConfig(*format.getMockColorType(),
-                                        *format.getMockSRGBEncoded());
+        return GrColorTypeToPixelConfig(*format.getMockColorType());
 
     }
 
diff --git a/src/gpu/mock/GrMockGpu.cpp b/src/gpu/mock/GrMockGpu.cpp
index ae4eeed..aa975cd 100644
--- a/src/gpu/mock/GrMockGpu.cpp
+++ b/src/gpu/mock/GrMockGpu.cpp
@@ -91,17 +91,16 @@
         return nullptr;
     }
 
-    GrSRGBEncoded srgbEncoding;
-    GrColorType ct = GrPixelConfigToColorTypeAndEncoding(desc.fConfig, &srgbEncoding);
+    GrColorType ct = GrPixelConfigToColorType(desc.fConfig);
     if (GrColorType::kUnknown == ct) {
         return nullptr;
     }
 
     GrMipMapsStatus mipMapsStatus = mipLevelCount > 1 ? GrMipMapsStatus::kValid
                                                       : GrMipMapsStatus::kNotAllocated;
-    GrMockTextureInfo texInfo(ct, srgbEncoding, NextInternalTextureID());
+    GrMockTextureInfo texInfo(ct, NextInternalTextureID());
     if (desc.fFlags & kRenderTarget_GrSurfaceFlag) {
-        GrMockRenderTargetInfo rtInfo(ct, srgbEncoding, NextInternalRenderTargetID());
+        GrMockRenderTargetInfo rtInfo(ct, NextInternalRenderTargetID());
         return sk_sp<GrTexture>(new GrMockTextureRenderTarget(this, budgeted, desc, mipMapsStatus,
                                                               texInfo, rtInfo));
     }
@@ -148,8 +147,7 @@
             tex.hasMipMaps() ? GrMipMapsStatus::kValid : GrMipMapsStatus::kNotAllocated;
 
     // The client gave us the texture ID but we supply the render target ID.
-    GrMockRenderTargetInfo rtInfo(texInfo.fColorType, texInfo.fSRGBEncoded,
-                                  NextInternalRenderTargetID());
+    GrMockRenderTargetInfo rtInfo(texInfo.fColorType, NextInternalRenderTargetID());
 
     return sk_sp<GrTexture>(
             new GrMockTextureRenderTarget(this, desc, mipMapsStatus, texInfo, rtInfo, cacheable));
@@ -182,8 +180,7 @@
     desc.fSampleCnt = sampleCnt;
 
     // The client gave us the texture ID but we supply the render target ID.
-    GrMockRenderTargetInfo rtInfo(texInfo.fColorType, texInfo.fSRGBEncoded,
-                                  NextInternalRenderTargetID());
+    GrMockRenderTargetInfo rtInfo(texInfo.fColorType, NextInternalRenderTargetID());
 
     return sk_sp<GrRenderTarget>(
             new GrMockRenderTarget(this, GrMockRenderTarget::kWrapped, desc, rtInfo));
@@ -211,19 +208,15 @@
                                                  const SkColor4f* /* color */,
                                                  GrProtected /* isProtected */) {
 
-    if (!format.getMockColorType() || !format.getMockSRGBEncoded()) {
+    if (!format.getMockColorType()) {
         return GrBackendTexture();  // invalid;
     }
 
-    GrPixelConfig config = GrColorTypeToPixelConfig(*format.getMockColorType(),
-                                                    *format.getMockSRGBEncoded());
-
-    if (!this->caps()->isConfigTexturable(config)) {
+    if (!this->caps()->isFormatTexturable(*format.getMockColorType(), format)) {
         return GrBackendTexture();  // invalid
     }
 
-    GrMockTextureInfo info(*format.getMockColorType(), *format.getMockSRGBEncoded(),
-                           NextExternalTextureID());
+    GrMockTextureInfo info(*format.getMockColorType(), NextExternalTextureID());
 
     fOutstandingTestingOnlyTextureIDs.add(info.fID);
     return GrBackendTexture(w, h, mipMapped, info);
@@ -252,7 +245,7 @@
 
 GrBackendRenderTarget GrMockGpu::createTestingOnlyBackendRenderTarget(int w, int h,
                                                                       GrColorType colorType) {
-    GrMockRenderTargetInfo info(colorType, GrSRGBEncoded::kNo, NextExternalRenderTargetID());
+    GrMockRenderTargetInfo info(colorType, NextExternalRenderTargetID());
     static constexpr int kSampleCnt = 1;
     static constexpr int kStencilBits = 8;
     return GrBackendRenderTarget(w, h, kSampleCnt, kStencilBits, info);
diff --git a/src/gpu/mock/GrMockTypes.cpp b/src/gpu/mock/GrMockTypes.cpp
index 89d880a..836fe8a 100644
--- a/src/gpu/mock/GrMockTypes.cpp
+++ b/src/gpu/mock/GrMockTypes.cpp
@@ -10,9 +10,9 @@
 #include "include/gpu/GrBackendSurface.h"
 
 GrBackendFormat GrMockRenderTargetInfo::getBackendFormat() const {
-    return GrBackendFormat::MakeMock(fColorType, fSRGBEncoded);
+    return GrBackendFormat::MakeMock(fColorType);
 }
 
 GrBackendFormat GrMockTextureInfo::getBackendFormat() const {
-    return GrBackendFormat::MakeMock(fColorType, fSRGBEncoded);
+    return GrBackendFormat::MakeMock(fColorType);
 }
diff --git a/src/gpu/mtl/GrMtlCaps.h b/src/gpu/mtl/GrMtlCaps.h
index 14bb0da..0acd33a 100644
--- a/src/gpu/mtl/GrMtlCaps.h
+++ b/src/gpu/mtl/GrMtlCaps.h
@@ -69,8 +69,7 @@
 
     GrPixelConfig getYUVAConfigFromBackendFormat(const GrBackendFormat&) const override;
 
-    GrBackendFormat getBackendFormatFromColorType(GrColorType ct,
-                                                  GrSRGBEncoded srgbEncoded) const override;
+    GrBackendFormat getBackendFormatFromColorType(GrColorType ct) const override;
     GrBackendFormat getBackendFormatFromCompressionType(SkImage::CompressionType) const override;
 
     GrSwizzle getTextureSwizzle(const GrBackendFormat&, GrColorType) const override;
diff --git a/src/gpu/mtl/GrMtlCaps.mm b/src/gpu/mtl/GrMtlCaps.mm
index e852ee9..019b993 100644
--- a/src/gpu/mtl/GrMtlCaps.mm
+++ b/src/gpu/mtl/GrMtlCaps.mm
@@ -526,7 +526,10 @@
         case GrColorType::kRGBA_8888:
             if (MTLPixelFormatRGBA8Unorm == format) {
                 return kRGBA_8888_GrPixelConfig;
-            } else if (MTLPixelFormatRGBA8Unorm_sRGB == format) {
+            }
+            break;
+        case GrColorType::kRGBA_8888_SRGB:
+            if (MTLPixelFormatRGBA8Unorm_sRGB == format) {
                 return kSRGBA_8888_GrPixelConfig;
             }
             break;
@@ -685,9 +688,8 @@
     return get_yuva_config(*mtlFormat);
 }
 
-GrBackendFormat GrMtlCaps::getBackendFormatFromColorType(GrColorType ct,
-                                                         GrSRGBEncoded srgbEncoded) const {
-    GrPixelConfig config = GrColorTypeToPixelConfig(ct, srgbEncoded);
+GrBackendFormat GrMtlCaps::getBackendFormatFromColorType(GrColorType ct) const {
+    GrPixelConfig config = GrColorTypeToPixelConfig(ct);
     if (config == kUnknown_GrPixelConfig) {
         return GrBackendFormat();
     }
@@ -732,7 +734,9 @@
             return MTLPixelFormatABGR4Unorm == format;
 #endif
         case GrColorType::kRGBA_8888:
-            return MTLPixelFormatRGBA8Unorm == format || MTLPixelFormatRGBA8Unorm_sRGB == format;
+            return MTLPixelFormatRGBA8Unorm == format;
+        case GrColorType::kRGBA_8888_SRGB:
+            return MTLPixelFormatRGBA8Unorm_sRGB == format;
         case GrColorType::kRGB_888x:
             GR_STATIC_ASSERT(GrCompressionTypeClosestColorType(SkImage::kETC1_CompressionType) ==
                              GrColorType::kRGB_888x);
diff --git a/src/gpu/mtl/GrMtlGpu.mm b/src/gpu/mtl/GrMtlGpu.mm
index fc72367..8761b95 100644
--- a/src/gpu/mtl/GrMtlGpu.mm
+++ b/src/gpu/mtl/GrMtlGpu.mm
@@ -200,10 +200,6 @@
     // first.
     SkASSERT(1 == mipLevelCount || mipLevelCount == (tex->texturePriv().maxMipMapLevel() + 1));
 
-    // If we're uploading compressed data then we should be using uploadCompressedTexData
-    SkASSERT(!GrPixelConfigIsCompressed(GrColorTypeToPixelConfig(dataColorType,
-                                                                 GrSRGBEncoded::kNo)));
-
     if (!check_max_blit_width(width)) {
         return false;
     }
@@ -309,10 +305,6 @@
 bool GrMtlGpu::clearTexture(GrMtlTexture* tex, GrColorType dataColorType) {
     SkASSERT(this->caps()->isConfigTexturable(tex->config()));
 
-    // If we're uploading compressed data then we should be using uploadCompressedTexData
-    SkASSERT(!GrPixelConfigIsCompressed(GrColorTypeToPixelConfig(dataColorType,
-                                                                 GrSRGBEncoded::kNo)));
-
     id<MTLTexture> mtlTexture = tex->mtlTexture();
     SkASSERT(mtlTexture);
     // Either upload only the first miplevel or all miplevels
@@ -830,7 +822,7 @@
         return GrBackendRenderTarget();
     }
 
-    GrPixelConfig config = GrColorTypeToPixelConfig(ct, GrSRGBEncoded::kNo);
+    GrPixelConfig config = GrColorTypeToPixelConfig(ct);
 
     MTLPixelFormat format;
     if (!GrPixelConfigToMTLFormat(config, &format)) {
diff --git a/src/gpu/text/GrAtlasManager.cpp b/src/gpu/text/GrAtlasManager.cpp
index f3696d7..94082ca 100644
--- a/src/gpu/text/GrAtlasManager.cpp
+++ b/src/gpu/text/GrAtlasManager.cpp
@@ -166,8 +166,7 @@
         SkISize atlasDimensions = fAtlasConfig.atlasDimensions(format);
         SkISize plotDimensions = fAtlasConfig.plotDimensions(format);
 
-        const GrBackendFormat format = fCaps->getBackendFormatFromColorType(grColorType,
-                                                                            GrSRGBEncoded::kNo);
+        const GrBackendFormat format = fCaps->getBackendFormatFromColorType(grColorType);
 
         fAtlases[index] = GrDrawOpAtlas::Make(
                 fProxyProvider, format, grColorType,
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index c60b918..16ae3cb 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -974,7 +974,10 @@
         case GrColorType::kRGBA_8888:
             if (VK_FORMAT_R8G8B8A8_UNORM == format) {
                 return kRGBA_8888_GrPixelConfig;
-            } else if (VK_FORMAT_R8G8B8A8_SRGB == format) {
+            }
+            break;
+        case GrColorType::kRGBA_8888_SRGB:
+            if (VK_FORMAT_R8G8B8A8_SRGB == format) {
                 return kSRGBA_8888_GrPixelConfig;
             }
             break;
@@ -1123,9 +1126,8 @@
     return get_yuva_config(*vkFormat);
 }
 
-GrBackendFormat GrVkCaps::getBackendFormatFromColorType(GrColorType ct,
-                                                        GrSRGBEncoded srgbEncoded) const {
-    GrPixelConfig config = GrColorTypeToPixelConfig(ct, srgbEncoded);
+GrBackendFormat GrVkCaps::getBackendFormatFromColorType(GrColorType ct) const {
+    GrPixelConfig config = GrColorTypeToPixelConfig(ct);
     if (config == kUnknown_GrPixelConfig) {
         return GrBackendFormat();
     }
@@ -1159,7 +1161,9 @@
             return VK_FORMAT_B4G4R4A4_UNORM_PACK16 == vkFormat ||
                    VK_FORMAT_R4G4B4A4_UNORM_PACK16 == vkFormat;
         case GrColorType::kRGBA_8888:
-            return VK_FORMAT_R8G8B8A8_UNORM == vkFormat || VK_FORMAT_R8G8B8A8_SRGB == vkFormat;
+            return VK_FORMAT_R8G8B8A8_UNORM == vkFormat;
+        case GrColorType::kRGBA_8888_SRGB:
+            return VK_FORMAT_R8G8B8A8_SRGB == vkFormat;
         case GrColorType::kRGB_888x:
             GR_STATIC_ASSERT(GrCompressionTypeClosestColorType(SkImage::kETC1_CompressionType) ==
                              GrColorType::kRGB_888x);
diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h
index dafe0a9..911c80f 100644
--- a/src/gpu/vk/GrVkCaps.h
+++ b/src/gpu/vk/GrVkCaps.h
@@ -166,8 +166,7 @@
 
     GrPixelConfig getYUVAConfigFromBackendFormat(const GrBackendFormat&) const override;
 
-    GrBackendFormat getBackendFormatFromColorType(GrColorType ct,
-                                                  GrSRGBEncoded srgbEncoded) const override;
+    GrBackendFormat getBackendFormatFromColorType(GrColorType ct) const override;
     GrBackendFormat getBackendFormatFromCompressionType(SkImage::CompressionType) const override;
 
     GrSwizzle getTextureSwizzle(const GrBackendFormat&, GrColorType) const override;
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 2771dae..276e02a 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -641,10 +641,6 @@
     SkASSERT(data);
     SkASSERT(tex->isLinearTiled());
 
-    // If we're uploading compressed data then we should be using uploadCompressedTexData
-    SkASSERT(!GrPixelConfigIsCompressed(GrColorTypeToPixelConfig(dataColorType,
-                                                                 GrSRGBEncoded::kNo)));
-
     SkDEBUGCODE(
         SkIRect subRect = SkIRect::MakeXYWH(left, top, width, height);
         SkIRect bounds = SkIRect::MakeWH(tex->width(), tex->height());
@@ -700,10 +696,6 @@
     // first.
     SkASSERT(1 == mipLevelCount || mipLevelCount == (tex->texturePriv().maxMipMapLevel() + 1));
 
-    // If we're uploading compressed data then we should be using uploadCompressedTexData
-    SkASSERT(!GrPixelConfigIsCompressed(GrColorTypeToPixelConfig(dataColorType,
-                                                                 GrSRGBEncoded::kNo)));
-
     if (width == 0 || height == 0) {
         return false;
     }
@@ -1987,7 +1979,7 @@
         return GrBackendRenderTarget();
     }
 
-    auto config = GrColorTypeToPixelConfig(ct, GrSRGBEncoded::kNo);
+    auto config = GrColorTypeToPixelConfig(ct);
     if (kUnknown_GrPixelConfig == config) {
         return {};
     }
diff --git a/src/image/SkImage_GpuBase.cpp b/src/image/SkImage_GpuBase.cpp
index e032921..c543446 100644
--- a/src/image/SkImage_GpuBase.cpp
+++ b/src/image/SkImage_GpuBase.cpp
@@ -54,8 +54,18 @@
     if (!backendFormat.isValid()) {
         return false;
     }
-    *config = ctx->priv().caps()->getConfigFromBackendFormat(backendFormat,
-                                                             SkColorTypeToGrColorType(ct));
+
+    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;
 }
 
diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp
index 860e487..0bf78cf 100644
--- a/src/image/SkSurface_Gpu.cpp
+++ b/src/image/SkSurface_Gpu.cpp
@@ -438,6 +438,21 @@
     return true;
 }
 
+static GrColorType get_grcolortype_from_skcolortype_and_format(const GrCaps* caps,
+                                                               SkColorType skCT,
+                                                               const GrBackendFormat& format) {
+    GrColorType grCT = SkColorTypeToGrColorType(skCT);
+    // Until we support SRGB in the SkColorType we have to do this manual check here to make sure
+    // we use the correct GrColorType.
+    if (caps->isFormatSRGB(format)) {
+        if (grCT != GrColorType::kRGBA_8888) {
+            return GrColorType::kUnknown;
+        }
+        grCT = GrColorType::kRGBA_8888_SRGB;
+    }
+    return grCT;
+}
+
 sk_sp<SkSurface> SkSurface::MakeFromBackendTexture(GrContext* context,
                                                    const SkSurfaceCharacterization& c,
                                                    const GrBackendTexture& backendTexture,
@@ -456,7 +471,11 @@
         return nullptr;
     }
 
-    GrColorType grCT = SkColorTypeToGrColorType(c.colorType());
+    GrColorType grCT = get_grcolortype_from_skcolortype_and_format(
+            context->priv().caps(), c.colorType(), backendTexture.getBackendFormat());
+    if (grCT == GrColorType::kUnknown) {
+        return nullptr;
+    }
 
     GrBackendTexture texCopy = backendTexture;
     if (!validate_backend_texture(context, texCopy, &texCopy.fConfig,
@@ -543,7 +562,13 @@
         return nullptr;
     }
     sampleCnt = SkTMax(1, sampleCnt);
-    GrColorType grColorType = SkColorTypeToGrColorType(colorType);
+
+    GrColorType grColorType = get_grcolortype_from_skcolortype_and_format(
+            context->priv().caps(), colorType, tex.getBackendFormat());
+    if (grColorType == GrColorType::kUnknown) {
+        return nullptr;
+    }
+
     GrBackendTexture texCopy = tex;
     if (!validate_backend_texture(context, texCopy, &texCopy.fConfig, sampleCnt, grColorType,
                                   true)) {
@@ -630,17 +655,7 @@
 }
 
 bool validate_backend_render_target(GrContext* ctx, const GrBackendRenderTarget& rt,
-                                    GrPixelConfig* config, SkColorType skCT,
-                                    sk_sp<SkColorSpace> cs) {
-    GrColorType grCT = SkColorTypeToGrColorType(skCT);
-    if (GrColorType::kUnknown == grCT) {
-        return false;
-    }
-
-    // TODO: Create a SkImageColorInfo struct for color, alpha, and color space so we don't need to
-    // create a fake image info here.
-    SkImageInfo info = SkImageInfo::Make(1, 1, skCT, kPremul_SkAlphaType, cs);
-
+                                    GrPixelConfig* config, GrColorType grCT) {
     *config = ctx->priv().caps()->validateBackendRenderTarget(rt, grCT);
     if (*config == kUnknown_GrPixelConfig) {
         return false;
@@ -669,8 +684,14 @@
         return nullptr;
     }
 
+    GrColorType grColorType = get_grcolortype_from_skcolortype_and_format(
+            context->priv().caps(), colorType, rt.getBackendFormat());
+    if (grColorType == GrColorType::kUnknown) {
+        return nullptr;
+    }
+
     GrBackendRenderTarget rtCopy = rt;
-    if (!validate_backend_render_target(context, rtCopy, &rtCopy.fConfig, colorType, colorSpace)) {
+    if (!validate_backend_render_target(context, rtCopy, &rtCopy.fConfig, grColorType)) {
         return nullptr;
     }
     if (!SkSurface_Gpu::Valid(context->priv().caps(), rtCopy.getBackendFormat())) {
@@ -682,8 +703,7 @@
     }
 
     sk_sp<GrRenderTargetContext> rtc(context->priv().makeBackendRenderTargetRenderTargetContext(
-            rtCopy, origin, SkColorTypeToGrColorType(colorType), std::move(colorSpace), props,
-            relProc, releaseContext));
+            rtCopy, origin, grColorType, std::move(colorSpace), props, relProc, releaseContext));
     if (!rtc) {
         return nullptr;
     }
@@ -710,7 +730,11 @@
     }
 
     sampleCnt = SkTMax(1, sampleCnt);
-    GrColorType grColorType = SkColorTypeToGrColorType(colorType);
+    GrColorType grColorType = get_grcolortype_from_skcolortype_and_format(
+            context->priv().caps(), colorType, tex.getBackendFormat());
+    if (grColorType == GrColorType::kUnknown) {
+        return nullptr;
+    }
     GrBackendTexture texCopy = tex;
     if (!validate_backend_texture(context, texCopy, &texCopy.fConfig,
                                   sampleCnt, grColorType, false)) {