Remove some uses of GrBytesPerPixel
GrPixelConfig needs to go away. Towards that end, switch the Vk and GL backends over to using their native formats.
Change-Id: I92c80eb27e5d639097a40745429721208fe26836
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213428
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrDrawOpAtlas.cpp b/src/gpu/GrDrawOpAtlas.cpp
index df55380..d28f527 100644
--- a/src/gpu/GrDrawOpAtlas.cpp
+++ b/src/gpu/GrDrawOpAtlas.cpp
@@ -35,11 +35,11 @@
std::unique_ptr<GrDrawOpAtlas> GrDrawOpAtlas::Make(GrProxyProvider* proxyProvider,
const GrBackendFormat& format,
- GrPixelConfig config, int width,
+ GrColorType colorType, int width,
int height, int plotWidth, int plotHeight,
AllowMultitexturing allowMultitexturing,
GrDrawOpAtlas::EvictionFunc func, void* data) {
- std::unique_ptr<GrDrawOpAtlas> atlas(new GrDrawOpAtlas(proxyProvider, format, config, width,
+ std::unique_ptr<GrDrawOpAtlas> atlas(new GrDrawOpAtlas(proxyProvider, format, colorType, width,
height, plotWidth, plotHeight,
allowMultitexturing));
if (!atlas->getProxies()[0]) {
@@ -56,7 +56,7 @@
////////////////////////////////////////////////////////////////////////////////
GrDrawOpAtlas::Plot::Plot(int pageIndex, int plotIndex, uint64_t genID, int offX, int offY,
- int width, int height, GrPixelConfig config)
+ int width, int height, GrColorType colorType)
: fLastUpload(GrDeferredUploadToken::AlreadyFlushedToken())
, fLastUse(GrDeferredUploadToken::AlreadyFlushedToken())
, fFlushesSinceLastUse(0)
@@ -71,8 +71,8 @@
, fY(offY)
, fRects(nullptr)
, fOffset(SkIPoint16::Make(fX * fWidth, fY * fHeight))
- , fConfig(config)
- , fBytesPerPixel(GrBytesPerPixel(config))
+ , fColorType(colorType)
+ , fBytesPerPixel(GrColorTypeBytesPerPixel(colorType))
#ifdef SK_DEBUG
, fDirty(false)
#endif
@@ -150,10 +150,9 @@
// Set up dataPtr
dataPtr += rowBytes * fDirtyRect.fTop;
dataPtr += fBytesPerPixel * fDirtyRect.fLeft;
- // TODO: Make GrDrawOpAtlas store a GrColorType rather than GrPixelConfig.
- auto colorType = GrPixelConfigToColorType(fConfig);
+
writePixels(proxy, fOffset.fX + fDirtyRect.fLeft, fOffset.fY + fDirtyRect.fTop,
- fDirtyRect.width(), fDirtyRect.height(), colorType, dataPtr, rowBytes);
+ fDirtyRect.width(), fDirtyRect.height(), fColorType, dataPtr, rowBytes);
fDirtyRect.setEmpty();
SkDEBUGCODE(fDirty = false;)
}
@@ -180,10 +179,10 @@
///////////////////////////////////////////////////////////////////////////////
GrDrawOpAtlas::GrDrawOpAtlas(GrProxyProvider* proxyProvider, const GrBackendFormat& format,
- GrPixelConfig config, int width, int height,
+ GrColorType colorType, int width, int height,
int plotWidth, int plotHeight, AllowMultitexturing allowMultitexturing)
: fFormat(format)
- , fPixelConfig(config)
+ , fColorType(colorType)
, fTextureWidth(width)
, fTextureHeight(height)
, fPlotWidth(plotWidth)
@@ -524,7 +523,7 @@
}
desc.fWidth = fTextureWidth;
desc.fHeight = fTextureHeight;
- desc.fConfig = fPixelConfig;
+ desc.fConfig = GrColorTypeToPixelConfig(fColorType, GrSRGBEncoded::kNo);
int numPlotsX = fTextureWidth/fPlotWidth;
int numPlotsY = fTextureHeight/fPlotHeight;
@@ -546,7 +545,7 @@
for (int x = numPlotsX - 1, c = 0; x >= 0; --x, ++c) {
uint32_t plotIndex = r * numPlotsX + c;
currPlot->reset(new Plot(i, plotIndex, 1, x, y, fPlotWidth, fPlotHeight,
- fPixelConfig));
+ fColorType));
// build LRU list
fPages[i].fPlotList.addToHead(currPlot->get());
diff --git a/src/gpu/GrDrawOpAtlas.h b/src/gpu/GrDrawOpAtlas.h
index 2f15f41..bb3a0a3 100644
--- a/src/gpu/GrDrawOpAtlas.h
+++ b/src/gpu/GrDrawOpAtlas.h
@@ -77,7 +77,7 @@
/**
* Returns a GrDrawOpAtlas. This function can be called anywhere, but the returned atlas
* should only be used inside of GrMeshDrawOp::onPrepareDraws.
- * @param GrPixelConfig The pixel config which this atlas will store
+ * @param GrColorType The colorType which this atlas will store
* @param width width in pixels of the atlas
* @param height height in pixels of the atlas
* @param numPlotsX The number of plots the atlas should be broken up into in the X
@@ -93,7 +93,7 @@
*/
static std::unique_ptr<GrDrawOpAtlas> Make(GrProxyProvider*,
const GrBackendFormat& format,
- GrPixelConfig,
+ GrColorType,
int width, int height,
int plotWidth, int plotHeight,
AllowMultitexturing allowMultitexturing,
@@ -246,7 +246,7 @@
void setMaxPages_TestingOnly(uint32_t maxPages);
private:
- GrDrawOpAtlas(GrProxyProvider*, const GrBackendFormat& format, GrPixelConfig, int width,
+ GrDrawOpAtlas(GrProxyProvider*, const GrBackendFormat& format, GrColorType, int width,
int height, int plotWidth, int plotHeight,
AllowMultitexturing allowMultitexturing);
@@ -296,8 +296,8 @@
void incFlushesSinceLastUsed() { fFlushesSinceLastUse++; }
private:
- Plot(int pageIndex, int plotIndex, uint64_t genID, int offX, int offY, int width, int height,
- GrPixelConfig config);
+ Plot(int pageIndex, int plotIndex, uint64_t genID, int offX, int offY,
+ int width, int height, GrColorType colorType);
~Plot() override;
@@ -306,7 +306,8 @@
* the atlas
*/
Plot* clone() const {
- return new Plot(fPageIndex, fPlotIndex, fGenID + 1, fX, fY, fWidth, fHeight, fConfig);
+ return new Plot(fPageIndex, fPlotIndex, fGenID + 1, fX, fY, fWidth, fHeight,
+ fColorType);
}
static GrDrawOpAtlas::AtlasID CreateId(uint32_t pageIdx, uint32_t plotIdx,
@@ -336,7 +337,7 @@
const int fY;
GrRectanizer* fRects;
const SkIPoint16 fOffset; // the offset of the plot in the backing texture
- const GrPixelConfig fConfig;
+ const GrColorType fColorType;
const size_t fBytesPerPixel;
SkIRect fDirtyRect;
SkDEBUGCODE(bool fDirty);
@@ -385,7 +386,7 @@
}
GrBackendFormat fFormat;
- GrPixelConfig fPixelConfig;
+ GrColorType fColorType;
int fTextureWidth;
int fTextureHeight;
int fPlotWidth;
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 577ab0a..5798f72 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1573,6 +1573,43 @@
return params;
}
+size_t GLBytesPerPixel(GrGLenum glFormat) {
+ switch (glFormat) {
+ case GR_GL_LUMINANCE8:
+ case GR_GL_ALPHA8:
+ case GR_GL_R8:
+ return 1;
+
+ case GR_GL_RGB565:
+ case GR_GL_RGBA4:
+ case GR_GL_RG8:
+ case GR_GL_R16F:
+ return 2;
+
+ case GR_GL_RGB8:
+ return 3;
+
+ case GR_GL_RGBA8:
+ case GR_GL_SRGB8_ALPHA8:
+ case GR_GL_BGRA8:
+ case GR_GL_RGB10_A2:
+ return 4;
+
+ case GR_GL_RGBA16F:
+ case GR_GL_RG32F:
+ return 8;
+
+ case GR_GL_RGBA32F:
+ return 16;
+
+ case GR_GL_COMPRESSED_RGB8_ETC2:
+ return 0;
+ }
+
+ SK_ABORT("Invalid GL format");
+ return 0;
+}
+
sk_sp<GrTexture> GrGLGpu::onCreateTexture(const GrSurfaceDesc& desc,
SkBudgeted budgeted,
const GrMipLevel texels[],
@@ -1583,6 +1620,8 @@
return return_null_texture();
}
+ GrGLenum glFormat = this->glCaps().configSizedInternalFormat(desc.fConfig);
+
bool performClear = (desc.fFlags & kPerformInitialClear_GrSurfaceFlag) &&
!GrPixelConfigIsCompressed(desc.fConfig);
@@ -1590,7 +1629,7 @@
std::unique_ptr<uint8_t[]> zeros;
if (performClear && !this->glCaps().clearTextureSupport() &&
!this->glCaps().canConfigBeFBOColorAttachment(desc.fConfig)) {
- size_t rowSize = GrBytesPerPixel(desc.fConfig) * desc.fWidth;
+ size_t rowSize = GLBytesPerPixel(glFormat) * desc.fWidth;
size_t size = rowSize * desc.fHeight;
zeros.reset(new uint8_t[size]);
memset(zeros.get(), 0, size);
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index 72dbe01..642f6d2 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -877,7 +877,7 @@
kAlpha_8_SkColorType);
fAtlas = GrDrawOpAtlas::Make(args.fContext->priv().proxyProvider(),
format,
- kAlpha_8_GrPixelConfig,
+ GrColorType::kAlpha_8,
ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_HEIGHT,
PLOT_WIDTH, PLOT_HEIGHT,
GrDrawOpAtlas::AllowMultitexturing::kYes,
@@ -966,7 +966,7 @@
const GrBackendFormat format =
context->priv().caps()->getBackendFormatFromColorType(kAlpha_8_SkColorType);
gTestStruct.fAtlas = GrDrawOpAtlas::Make(context->priv().proxyProvider(),
- format, kAlpha_8_GrPixelConfig,
+ format, GrColorType::kAlpha_8,
ATLAS_TEXTURE_WIDTH, ATLAS_TEXTURE_HEIGHT,
PLOT_WIDTH, PLOT_HEIGHT,
GrDrawOpAtlas::AllowMultitexturing::kYes,
diff --git a/src/gpu/text/GrAtlasManager.cpp b/src/gpu/text/GrAtlasManager.cpp
index abd0b20..d736478 100644
--- a/src/gpu/text/GrAtlasManager.cpp
+++ b/src/gpu/text/GrAtlasManager.cpp
@@ -21,35 +21,20 @@
GrAtlasManager::~GrAtlasManager() = default;
-static GrPixelConfig mask_format_to_pixel_config(GrMaskFormat format) {
+static GrColorType mask_format_to_gr_color_type(GrMaskFormat format) {
switch (format) {
case kA8_GrMaskFormat:
- return kAlpha_8_GrPixelConfig;
+ return GrColorType::kAlpha_8;
case kA565_GrMaskFormat:
- return kRGB_565_GrPixelConfig;
+ return GrColorType::kRGB_565;
case kARGB_GrMaskFormat:
- return kRGBA_8888_GrPixelConfig;
+ return GrColorType::kRGBA_8888;
default:
SkDEBUGFAIL("unsupported GrMaskFormat");
- return kAlpha_8_GrPixelConfig;
+ return GrColorType::kAlpha_8;
}
}
-static SkColorType mask_format_to_color_type(GrMaskFormat format) {
- switch (format) {
- case kA8_GrMaskFormat:
- return kAlpha_8_SkColorType;
- case kA565_GrMaskFormat:
- return kRGB_565_SkColorType;
- case kARGB_GrMaskFormat:
- return kRGBA_8888_SkColorType;
- default:
- SkDEBUGFAIL("unsupported GrMaskFormat");
- return kAlpha_8_SkColorType;
- }
-
-}
-
void GrAtlasManager::freeAll() {
for (int i = 0; i < kMaskFormatCount; ++i) {
fAtlases[i] = nullptr;
@@ -175,17 +160,18 @@
bool GrAtlasManager::initAtlas(GrMaskFormat format) {
int index = MaskFormatToAtlasIndex(format);
if (fAtlases[index] == nullptr) {
- GrPixelConfig config = mask_format_to_pixel_config(format);
- SkColorType colorType = mask_format_to_color_type(format);
+ GrColorType grColorType = mask_format_to_gr_color_type(format);
SkISize atlasDimensions = fAtlasConfig.atlasDimensions(format);
SkISize plotDimensions = fAtlasConfig.plotDimensions(format);
- const GrBackendFormat format = fCaps->getBackendFormatFromColorType(colorType);
+ const GrBackendFormat format = fCaps->getBackendFormatFromGrColorType(grColorType,
+ GrSRGBEncoded::kNo);
fAtlases[index] = GrDrawOpAtlas::Make(
- fProxyProvider, format, config, atlasDimensions.width(), atlasDimensions.height(),
- plotDimensions.width(), plotDimensions.height(), fAllowMultitexturing,
- &GrStrikeCache::HandleEviction, fGlyphCache);
+ fProxyProvider, format, grColorType,
+ atlasDimensions.width(), atlasDimensions.height(),
+ plotDimensions.width(), plotDimensions.height(),
+ fAllowMultitexturing, &GrStrikeCache::HandleEviction, fGlyphCache);
if (!fAtlases[index]) {
return false;
}
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 1e04813..1bfba3f 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -1445,6 +1445,45 @@
return true;
}
+size_t VkBytesPerPixel(VkFormat vkFormat) {
+ switch (vkFormat) {
+ case VK_FORMAT_R8_UNORM:
+ return 1;
+
+ case VK_FORMAT_R5G6B5_UNORM_PACK16:
+ case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
+ case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
+ case VK_FORMAT_R8G8_UNORM:
+ case VK_FORMAT_R16_SFLOAT:
+ return 2;
+
+ case VK_FORMAT_R8G8B8_UNORM:
+ return 3;
+
+ case VK_FORMAT_R8G8B8A8_UNORM:
+ case VK_FORMAT_R8G8B8A8_SRGB:
+ case VK_FORMAT_B8G8R8A8_UNORM:
+ case VK_FORMAT_B8G8R8A8_SRGB:
+ case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
+ return 4;
+
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ case VK_FORMAT_R32G32_SFLOAT:
+ return 8;
+
+ case VK_FORMAT_R32G32B32A32_SFLOAT:
+ return 16;
+
+ case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
+ default:
+ SK_ABORT("Invalid Vk format");
+ return 0;
+ }
+
+ SK_ABORT("Invalid Vk format");
+ return 0;
+}
+
#if GR_TEST_UTILS
bool GrVkGpu::createTestingOnlyVkImage(GrPixelConfig config, int w, int h, bool texturable,
bool renderable, GrMipMapped mipMapped, const void* srcData,
@@ -1454,8 +1493,8 @@
SkASSERT(GrMipMapped::kNo == mipMapped);
SkASSERT(!srcData);
}
- VkFormat pixelFormat;
- if (!GrPixelConfigToVkFormat(config, &pixelFormat)) {
+ VkFormat vkFormat;
+ if (!GrPixelConfigToVkFormat(config, &vkFormat)) {
return false;
}
@@ -1503,7 +1542,7 @@
nullptr, // pNext
0, // VkImageCreateFlags
VK_IMAGE_TYPE_2D, // VkImageType
- pixelFormat, // VkFormat
+ vkFormat, // VkFormat
{(uint32_t)w, (uint32_t)h, 1}, // VkExtent3D
mipLevels, // mipLevels
1, // arrayLayers
@@ -1555,7 +1594,7 @@
err = VK_CALL(BeginCommandBuffer(cmdBuffer, &cmdBufferBeginInfo));
SkASSERT(!err);
- size_t bpp = GrBytesPerPixel(config);
+ size_t bpp = VkBytesPerPixel(vkFormat);
SkASSERT(w && h);
const size_t trimRowBytes = w * bpp;
@@ -1769,7 +1808,7 @@
info->fAlloc = alloc;
info->fImageTiling = VK_IMAGE_TILING_OPTIMAL;
info->fImageLayout = initialLayout;
- info->fFormat = pixelFormat;
+ info->fFormat = vkFormat;
info->fLevelCount = mipLevels;
return true;