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