Remove use of colorTypes from SkYUVSizeInfo
Bug: skia:7903
Change-Id: I7301d943b679a4670511b6cf60c594baf615834a
Reviewed-on: https://skia-review.googlesource.com/c/164261
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/gm/wacky_yuv_formats.cpp b/gm/wacky_yuv_formats.cpp
index fe8a8d3..22cd120 100644
--- a/gm/wacky_yuv_formats.cpp
+++ b/gm/wacky_yuv_formats.cpp
@@ -576,13 +576,11 @@
int i = 0;
for ( ; i < fNumBitmaps; ++i) {
- size->fColorTypes[i] = fYUVBitmaps[i].colorType();
size->fSizes[i].fWidth = fYUVBitmaps[i].width();
size->fSizes[i].fHeight = fYUVBitmaps[i].height();
size->fWidthBytes[i] = fYUVBitmaps[i].rowBytes();
}
for ( ; i < SkYUVSizeInfo::kMaxCount; ++i) {
- size->fColorTypes[i] = kUnknown_SkColorType;
size->fSizes[i].fWidth = 0;
size->fSizes[i].fHeight = 0;
size->fWidthBytes[i] = 0;
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
index 7f81399..40d2d08 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -365,11 +365,9 @@
bool result = this->onQueryYUV8(sizeInfo, colorSpace);
if (result) {
for (int i = 0; i <= 2; ++i) {
- SkASSERT(kAlpha_8_SkColorType == sizeInfo->fColorTypes[i]);
SkASSERT(sizeInfo->fSizes[i].fWidth > 0 && sizeInfo->fSizes[i].fHeight > 0 &&
sizeInfo->fWidthBytes[i] > 0);
}
- SkASSERT(kUnknown_SkColorType == sizeInfo->fColorTypes[3]);
SkASSERT(!sizeInfo->fSizes[3].fWidth &&
!sizeInfo->fSizes[3].fHeight &&
!sizeInfo->fWidthBytes[3]);
@@ -391,7 +389,6 @@
if (!planes || !planes[0] || !planes[1] || !planes[2]) {
return kInvalidInput;
}
- SkASSERT(kUnknown_SkColorType == sizeInfo.fColorTypes[3]);
SkASSERT(!planes[3]); // TODO: is this a fair assumption?
if (!this->rewindIfNeeded()) {
diff --git a/include/core/SkYUVSizeInfo.h b/include/core/SkYUVSizeInfo.h
index a882e2d..ddfb0c8 100644
--- a/include/core/SkYUVSizeInfo.h
+++ b/include/core/SkYUVSizeInfo.h
@@ -15,7 +15,6 @@
struct SkYUVSizeInfo {
static constexpr auto kMaxCount = 4;
- SkColorType fColorTypes[kMaxCount];
SkISize fSizes[kMaxCount];
/**
@@ -34,17 +33,8 @@
bool operator==(const SkYUVSizeInfo& that) const {
for (int i = 0; i < kMaxCount; ++i) {
- if (fColorTypes[i] != that.fColorTypes[i]) {
- return false;
- }
-
- if (kUnknown_SkColorType == fColorTypes[i]) {
- SkASSERT(!fSizes[i].fWidth && !fSizes[i].fHeight && !fWidthBytes[i]);
- SkASSERT(!that.fSizes[i].fWidth && !that.fSizes[i].fHeight && !that.fWidthBytes[i]);
- continue;
- }
-
- SkASSERT(fSizes[i].fWidth && fSizes[i].fHeight && fWidthBytes[i]);
+ SkASSERT((!fSizes[i].isEmpty() && fWidthBytes[i]) ||
+ (fSizes[i].isEmpty() && !fWidthBytes[i]));
if (fSizes[i] != that.fSizes[i] || fWidthBytes[i] != that.fWidthBytes[i]) {
return false;
}
@@ -57,9 +47,8 @@
size_t totalBytes = 0;
for (int i = 0; i < kMaxCount; ++i) {
- SkASSERT(kUnknown_SkColorType != fColorTypes[i] ||
- (!fSizes[i].fWidth && !fSizes[i].fHeight && !fWidthBytes[i]));
-
+ SkASSERT((!fSizes[i].isEmpty() && fWidthBytes[i]) ||
+ (fSizes[i].isEmpty() && !fWidthBytes[i]));
totalBytes += fWidthBytes[i] * fSizes[i].height();
}
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
index f5c23a2..c883b3e 100644
--- a/src/codec/SkJpegCodec.cpp
+++ b/src/codec/SkJpegCodec.cpp
@@ -832,13 +832,11 @@
jpeg_component_info * comp_info = dinfo->comp_info;
for (auto i : { SkYUVAIndex::kY_Index, SkYUVAIndex::kU_Index, SkYUVAIndex::kV_Index }) {
- sizeInfo->fColorTypes[i] = kAlpha_8_SkColorType;
sizeInfo->fSizes[i].set(comp_info[i].downsampled_width, comp_info[i].downsampled_height);
sizeInfo->fWidthBytes[i] = comp_info[i].width_in_blocks * DCTSIZE;
}
// JPEG never has an alpha channel
- sizeInfo->fColorTypes[SkYUVAIndex::kA_Index] = kUnknown_SkColorType;
sizeInfo->fSizes[SkYUVAIndex::kA_Index].fHeight =
sizeInfo->fSizes[SkYUVAIndex::kA_Index].fWidth =
sizeInfo->fWidthBytes[SkYUVAIndex::kA_Index] = 0;
@@ -857,9 +855,6 @@
// This will check is_yuv_supported(), so we don't need to here.
bool supportsYUV = this->onQueryYUV8(&defaultInfo, nullptr);
if (!supportsYUV ||
- kAlpha_8_SkColorType != sizeInfo.fColorTypes[0] ||
- kAlpha_8_SkColorType != sizeInfo.fColorTypes[1] ||
- kAlpha_8_SkColorType != sizeInfo.fColorTypes[2] ||
sizeInfo.fSizes[0] != defaultInfo.fSizes[0] ||
sizeInfo.fSizes[1] != defaultInfo.fSizes[1] ||
sizeInfo.fSizes[2] != defaultInfo.fSizes[2] ||
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index c437494..2c59c9a 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -52,10 +52,6 @@
switch (numPlanes) {
case 1:
// Assume 3 interleaved planes
- sizeInfo->fColorTypes[0] = kRGBA_8888_SkColorType;
- sizeInfo->fColorTypes[1] = kUnknown_SkColorType;
- sizeInfo->fColorTypes[2] = kUnknown_SkColorType;
- sizeInfo->fColorTypes[3] = kUnknown_SkColorType;
yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 0;
@@ -67,10 +63,6 @@
break;
case 2:
// Assume 1 Y plane and interleaved UV planes (NV12)
- sizeInfo->fColorTypes[0] = kAlpha_8_SkColorType;
- sizeInfo->fColorTypes[1] = kRGBA_8888_SkColorType;
- sizeInfo->fColorTypes[2] = kUnknown_SkColorType;
- sizeInfo->fColorTypes[3] = kUnknown_SkColorType;
yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
@@ -83,10 +75,6 @@
case 3:
default:
// Assume 3 separate non-interleaved planes
- sizeInfo->fColorTypes[0] = kAlpha_8_SkColorType;
- sizeInfo->fColorTypes[1] = kAlpha_8_SkColorType;
- sizeInfo->fColorTypes[2] = kAlpha_8_SkColorType;
- sizeInfo->fColorTypes[3] = kUnknown_SkColorType;
yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
diff --git a/src/gpu/GrCaps.h b/src/gpu/GrCaps.h
index 918ac14..3047148 100644
--- a/src/gpu/GrCaps.h
+++ b/src/gpu/GrCaps.h
@@ -287,6 +287,14 @@
virtual bool getConfigFromBackendFormat(const GrBackendFormat& format, SkColorType ct,
GrPixelConfig*) const = 0;
+ /**
+ * Special method only for YUVA images. Returns true if the format can be used for a
+ * YUVA plane, and the passed in GrPixelConfig will be set to a config that matches
+ * the backend format.
+ */
+ virtual bool getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+ GrPixelConfig*) const = 0;
+
#ifdef GR_TEST_UTILS
/**
* Creates a GrBackendFormat which matches the backend texture. If the backend texture is
diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp
index beccd7d..c85d294 100644
--- a/src/gpu/GrYUVProvider.cpp
+++ b/src/gpu/GrYUVProvider.cpp
@@ -36,8 +36,7 @@
for (int i = 1; i < SkYUVSizeInfo::kMaxCount; ++i) {
if (!yuvInfo.fSizeInfo.fWidthBytes[i]) {
- SkASSERT(kUnknown_SkColorType == yuvInfo.fSizeInfo.fColorTypes[i] &&
- !yuvInfo.fSizeInfo.fWidthBytes[i] &&
+ SkASSERT(!yuvInfo.fSizeInfo.fWidthBytes[i] &&
!yuvInfo.fSizeInfo.fSizes[i].fHeight);
planes[i] = nullptr;
continue;
@@ -55,7 +54,7 @@
// Allocate the memory for YUVA
size_t totalSize(0);
for (int i = 0; i < SkYUVSizeInfo::kMaxCount; i++) {
- SkASSERT(kUnknown_SkColorType != yuvInfo.fSizeInfo.fColorTypes[i] ||
+ SkASSERT((yuvInfo.fSizeInfo.fWidthBytes[i] && yuvInfo.fSizeInfo.fSizes[i].fHeight) ||
(!yuvInfo.fSizeInfo.fWidthBytes[i] && !yuvInfo.fSizeInfo.fSizes[i].fHeight));
totalSize += yuvInfo.fSizeInfo.fWidthBytes[i] * yuvInfo.fSizeInfo.fSizes[i].fHeight;
@@ -67,8 +66,7 @@
for (int i = 1; i < SkYUVSizeInfo::kMaxCount; ++i) {
if (!yuvInfo.fSizeInfo.fWidthBytes[i]) {
- SkASSERT(kUnknown_SkColorType == yuvInfo.fSizeInfo.fColorTypes[i] &&
- !yuvInfo.fSizeInfo.fWidthBytes[i] &&
+ SkASSERT(!yuvInfo.fSizeInfo.fWidthBytes[i] &&
!yuvInfo.fSizeInfo.fSizes[i].fHeight);
planes[i] = nullptr;
continue;
@@ -119,10 +117,8 @@
sk_sp<GrTextureProxy> yuvTextureProxies[SkYUVSizeInfo::kMaxCount];
for (int i = 0; i < SkYUVSizeInfo::kMaxCount; ++i) {
- if (kUnknown_SkColorType == yuvSizeInfo.fColorTypes[i]) {
- SkASSERT(!yuvSizeInfo.fSizes[i].fWidth ||
- !yuvSizeInfo.fSizes[i].fHeight ||
- !yuvSizeInfo.fWidthBytes[i]);
+ if (yuvSizeInfo.fSizes[i].isEmpty()) {
+ SkASSERT(!yuvSizeInfo.fWidthBytes[i]);
continue;
}
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index 03df575..c16dc40 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -2927,6 +2927,37 @@
return validate_sized_format(*glFormat, ct, config, fStandard);
}
+bool GrGLCaps::getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+ GrPixelConfig* config) const {
+ const GrGLenum* glFormat = format.getGLFormat();
+ if (!glFormat) {
+ return false;
+ }
+
+ switch (*glFormat) {
+ case GR_GL_ALPHA8:
+ *config = kAlpha_8_as_Alpha_GrPixelConfig;
+ break;
+ case GR_GL_R8:
+ *config = kAlpha_8_as_Red_GrPixelConfig;
+ break;
+ case GR_GL_RGBA8:
+ *config = kRGBA_8888_GrPixelConfig;
+ break;
+ case GR_GL_RGB8:
+ *config = kRGB_888_GrPixelConfig;
+ break;
+ case GR_GL_BGRA8:
+ *config = kBGRA_8888_GrPixelConfig;
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+
#ifdef GR_TEST_UTILS
GrBackendFormat GrGLCaps::onCreateFormatFromBackendTexture(
const GrBackendTexture& backendTex) const {
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index 45acc75..f8b8134 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -436,6 +436,8 @@
bool getConfigFromBackendFormat(const GrBackendFormat&, SkColorType,
GrPixelConfig*) const override;
+ bool getYUVAConfigFromBackendFormat(const GrBackendFormat&,
+ GrPixelConfig*) const override;
#if GR_TEST_UTILS
GrGLStandard standard() const { return fStandard; }
diff --git a/src/gpu/mock/GrMockCaps.h b/src/gpu/mock/GrMockCaps.h
index 278dea3..2e6e8d9 100644
--- a/src/gpu/mock/GrMockCaps.h
+++ b/src/gpu/mock/GrMockCaps.h
@@ -104,6 +104,16 @@
return true;
}
+ bool getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+ GrPixelConfig* config) const override {
+ const GrPixelConfig* mockFormat = format.getMockFormat();
+ if (!mockFormat) {
+ return false;
+ }
+ *config = *mockFormat;
+ return true;
+ }
+
private:
#ifdef GR_TEST_UTILS
GrBackendFormat onCreateFormatFromBackendTexture(
diff --git a/src/gpu/mtl/GrMtlCaps.h b/src/gpu/mtl/GrMtlCaps.h
index e72ea83..6de830d 100644
--- a/src/gpu/mtl/GrMtlCaps.h
+++ b/src/gpu/mtl/GrMtlCaps.h
@@ -80,6 +80,11 @@
return false;
}
+ bool getYUVAConfigFromBackendFormat(const GrBackendFormat&,
+ GrPixelConfig*) const override {
+ return false;
+ }
+
bool performPartialClearsAsDraws() const override {
return true;
}
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 2f38d39..54693d9 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -782,6 +782,33 @@
return validate_image_info(*vkFormat, ct, config);
}
+bool GrVkCaps::getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+ GrPixelConfig* config) const {
+ const VkFormat* vkFormat = format.getVkFormat();
+ if (!vkFormat) {
+ return false;
+ }
+
+ switch (*vkFormat) {
+ case VK_FORMAT_R8_UNORM:
+ *config = kAlpha_8_as_Red_GrPixelConfig;
+ break;
+ case VK_FORMAT_R8G8B8A8_UNORM:
+ *config = kRGBA_8888_GrPixelConfig;
+ break;
+ case VK_FORMAT_R8G8B8_UNORM:
+ *config = kRGB_888_GrPixelConfig;
+ break;
+ case VK_FORMAT_B8G8R8A8_UNORM:
+ *config = kBGRA_8888_GrPixelConfig;
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
#ifdef GR_TEST_UTILS
GrBackendFormat GrVkCaps::onCreateFormatFromBackendTexture(
const GrBackendTexture& backendTex) const {
diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h
index fb269dc..19cdc1d 100644
--- a/src/gpu/vk/GrVkCaps.h
+++ b/src/gpu/vk/GrVkCaps.h
@@ -160,6 +160,8 @@
bool getConfigFromBackendFormat(const GrBackendFormat&, SkColorType,
GrPixelConfig*) const override;
+ bool getYUVAConfigFromBackendFormat(const GrBackendFormat&,
+ GrPixelConfig*) const override;
private:
enum VkVendor {
diff --git a/src/image/SkImage_GpuYUVA.cpp b/src/image/SkImage_GpuYUVA.cpp
index f246508..019131c 100644
--- a/src/image/SkImage_GpuYUVA.cpp
+++ b/src/image/SkImage_GpuYUVA.cpp
@@ -235,15 +235,13 @@
// verify sizeInfo with expected texture count
for (int i = 0; i < numTextures; ++i) {
- if (kUnknown_SkColorType == yuvaSizeInfo.fColorTypes[i] ||
- yuvaSizeInfo.fSizes[i].isEmpty() ||
+ if (yuvaSizeInfo.fSizes[i].isEmpty() ||
!yuvaSizeInfo.fWidthBytes[i]) {
return nullptr;
}
}
for (int i = numTextures; i < SkYUVSizeInfo::kMaxCount; ++i) {
- if (kUnknown_SkColorType != yuvaSizeInfo.fColorTypes[i] ||
- !yuvaSizeInfo.fSizes[i].isEmpty() ||
+ if (!yuvaSizeInfo.fSizes[i].isEmpty() ||
yuvaSizeInfo.fWidthBytes[i]) {
return nullptr;
}
@@ -258,9 +256,8 @@
GrPixelConfig fConfig;
SkPromiseImageHelper fPromiseHelper;
} params;
- bool res = context->contextPriv().caps()->getConfigFromBackendFormat(
+ bool res = context->contextPriv().caps()->getYUVAConfigFromBackendFormat(
yuvaFormats[texIdx],
- yuvaSizeInfo.fColorTypes[texIdx],
¶ms.fConfig);
if (!res) {
return nullptr;
diff --git a/tests/YUVCacheTest.cpp b/tests/YUVCacheTest.cpp
index 0410fdb..f4d9292 100644
--- a/tests/YUVCacheTest.cpp
+++ b/tests/YUVCacheTest.cpp
@@ -33,7 +33,6 @@
SkYUVPlanesCache::Info yuvInfo;
for (int i = 0; i < SkYUVSizeInfo::kMaxCount; i++) {
- yuvInfo.fSizeInfo.fColorTypes[i] = kAlpha_8_SkColorType;
yuvInfo.fSizeInfo.fSizes[i].fWidth = 20 * (i + 1);
yuvInfo.fSizeInfo.fSizes[i].fHeight = 10 * (i + 1);
yuvInfo.fSizeInfo.fWidthBytes[i] = 80 * (i + 1);
diff --git a/tools/DDLPromiseImageHelper.cpp b/tools/DDLPromiseImageHelper.cpp
index f582cee..accdebd 100644
--- a/tools/DDLPromiseImageHelper.cpp
+++ b/tools/DDLPromiseImageHelper.cpp
@@ -154,12 +154,10 @@
contexts[i] = curImage.refCallbackContext(i).release();
sizeInfo.fSizes[i].set(curImage.yuvPixmap(i).width(), curImage.yuvPixmap(i).height());
- sizeInfo.fColorTypes[i] = curImage.yuvPixmap(i).colorType();
sizeInfo.fWidthBytes[i] = curImage.yuvPixmap(i).rowBytes();
}
for (int i = textureCount; i < SkYUVSizeInfo::kMaxCount; ++i) {
sizeInfo.fSizes[i] = SkISize::MakeEmpty();
- sizeInfo.fColorTypes[i] = kUnknown_SkColorType;
sizeInfo.fWidthBytes[i] = 0;
}
@@ -231,17 +229,34 @@
if (yuvData) {
newImageInfo.setYUVData(std::move(yuvData), yuvaIndices, yuvColorSpace);
+ // determine colortypes from index data
+ // for testing we only ever use A8 or RGBA8888
+ SkColorType colorTypes[SkYUVSizeInfo::kMaxCount] = {
+ kUnknown_SkColorType, kUnknown_SkColorType,
+ kUnknown_SkColorType, kUnknown_SkColorType
+ };
+ for (int yuvIndex = 0; yuvIndex < SkYUVAIndex::kIndexCount; ++yuvIndex) {
+ int texIdx = yuvaIndices[yuvIndex].fIndex;
+ if (texIdx < 0) {
+ SkASSERT(SkYUVAIndex::kA_Index == yuvIndex);
+ continue;
+ }
+ if (kUnknown_SkColorType == colorTypes[texIdx]) {
+ colorTypes[texIdx] = kAlpha_8_SkColorType;
+ } else {
+ colorTypes[texIdx] = kRGBA_8888_SkColorType;
+ }
+ }
+
for (int i = 0; i < SkYUVSizeInfo::kMaxCount; ++i) {
- if (kUnknown_SkColorType == yuvaSizeInfo.fColorTypes[i]) {
- SkASSERT(!yuvaSizeInfo.fSizes[i].fWidth &&
- !yuvaSizeInfo.fSizes[i].fHeight &&
- !yuvaSizeInfo.fWidthBytes[i]);
+ if (yuvaSizeInfo.fSizes[i].isEmpty()) {
+ SkASSERT(!yuvaSizeInfo.fWidthBytes[i] && kUnknown_SkColorType == colorTypes[i]);
continue;
}
SkImageInfo planeII = SkImageInfo::Make(yuvaSizeInfo.fSizes[i].fWidth,
yuvaSizeInfo.fSizes[i].fHeight,
- yuvaSizeInfo.fColorTypes[i],
+ colorTypes[i],
kUnpremul_SkAlphaType);
newImageInfo.addYUVPlane(i, planeII, planes[i], yuvaSizeInfo.fWidthBytes[i]);
}