From 25a67bcb7ac70d3077e91126c4b8924a53557a38 Mon Sep 17 00:00:00 2001 From: krajcevski Date: Tue, 29 Jul 2014 11:44:26 -0700 Subject: Add query for block dimensions of a given format R=robertphillips@google.com Author: krajcevski@google.com Review URL: https://codereview.chromium.org/422023006 --- src/gpu/GrSWMaskHelper.cpp | 41 +++++++++++++++++++++++++++++++---------- src/gpu/GrSWMaskHelper.h | 5 +++++ 2 files changed, 36 insertions(+), 10 deletions(-) (limited to 'src/gpu') diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp index 547a05e79b..ba62858cb7 100644 --- a/src/gpu/GrSWMaskHelper.cpp +++ b/src/gpu/GrSWMaskHelper.cpp @@ -13,7 +13,6 @@ #include "SkData.h" #include "SkStrokeRec.h" -#include "SkTextureCompressor.h" // TODO: try to remove this #include #include "GrContext.h" @@ -37,6 +36,20 @@ SkXfermode::Mode op_to_mode(SkRegion::Op op) { return modeMap[op]; } +static inline GrPixelConfig fmt_to_config(SkTextureCompressor::Format fmt) { + static const GrPixelConfig configMap[] = { + kLATC_GrPixelConfig, // kLATC_Format, + kR11_EAC_GrPixelConfig, // kR11_EAC_Format, + kASTC_12x12_GrPixelConfig // kASTC_12x12_Format, + }; + GR_STATIC_ASSERT(0 == SkTextureCompressor::kLATC_Format); + GR_STATIC_ASSERT(1 == SkTextureCompressor::kR11_EAC_Format); + GR_STATIC_ASSERT(2 == SkTextureCompressor::kASTC_12x12_Format); + GR_STATIC_ASSERT(SK_ARRAY_COUNT(configMap) == SkTextureCompressor::kFormatCnt); + + return configMap[fmt]; +} + } /** @@ -102,11 +115,16 @@ bool GrSWMaskHelper::init(const SkIRect& resultBounds, -resultBounds.fTop * SK_Scalar1); SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height()); + #if GR_COMPRESS_ALPHA_MASK + fCompressedFormat = SkTextureCompressor::kR11_EAC_Format; + // Make sure that the width is a multiple of 16 so that we can use // specialized SIMD instructions that compress 4 blocks at a time. - const int cmpWidth = (bounds.fRight + 15) & ~15; - const int cmpHeight = (bounds.fBottom + 3) & ~3; + int dimX, dimY; + SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY); + const int cmpWidth = dimX * ((bounds.fRight + (dimX - 1)) / dimX); + const int cmpHeight = dimY * ((bounds.fRight + (dimY - 1)) / dimY); #else const int cmpWidth = bounds.fRight; const int cmpHeight = bounds.fBottom; @@ -135,21 +153,24 @@ bool GrSWMaskHelper::getTexture(GrAutoScratchTexture* texture) { GrTextureDesc desc; desc.fWidth = fBM.width(); desc.fHeight = fBM.height(); - desc.fConfig = kAlpha_8_GrPixelConfig; #if GR_COMPRESS_ALPHA_MASK - static const int kCompressedBlockSize = 4; - static const GrPixelConfig kCompressedConfig = kR11_EAC_GrPixelConfig; - if (desc.fWidth % kCompressedBlockSize == 0 && - desc.fHeight % kCompressedBlockSize == 0) { - desc.fConfig = kCompressedConfig; - } +#ifdef SK_DEBUG + int dimX, dimY; + SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY); + SkASSERT((desc.fWidth % dimX) == 0); + SkASSERT((desc.fHeight % dimY) == 0); +#endif + + desc.fConfig = fmt_to_config(fCompressedFormat); // If this config isn't supported then we should fall back to A8 if (!(fContext->getGpu()->caps()->isConfigTexturable(desc.fConfig))) { desc.fConfig = kAlpha_8_GrPixelConfig; } +#else + desc.fConfig = kAlpha_8_GrPixelConfig; #endif texture->set(fContext, desc); diff --git a/src/gpu/GrSWMaskHelper.h b/src/gpu/GrSWMaskHelper.h index 340b1a3829..ad1d432ea6 100644 --- a/src/gpu/GrSWMaskHelper.h +++ b/src/gpu/GrSWMaskHelper.h @@ -15,6 +15,7 @@ #include "SkMatrix.h" #include "SkRasterClip.h" #include "SkRegion.h" +#include "SkTextureCompressor.h" #include "SkTypes.h" class GrAutoScratchTexture; @@ -101,6 +102,10 @@ private: SkDraw fDraw; SkRasterClip fRasterClip; +#if GR_COMPRESS_ALPHA_MASK + SkTextureCompressor::Format fCompressedFormat; +#endif + // Actually sends the texture data to the GPU. This is called from // toTexture with the data filled in depending on the texture config. void sendTextureData(GrTexture *texture, const GrTextureDesc& desc, -- cgit v1.2.3