aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar krajcevski <krajcevski@google.com>2014-07-29 11:44:26 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-07-29 11:44:26 -0700
commit25a67bcb7ac70d3077e91126c4b8924a53557a38 (patch)
tree47c7cbe0e21e8987e7207fac92db4fcf345bca67 /src/gpu
parenta8f8da0500d9a9a561eb8847292c14d874a31092 (diff)
Add query for block dimensions of a given format
R=robertphillips@google.com Author: krajcevski@google.com Review URL: https://codereview.chromium.org/422023006
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrSWMaskHelper.cpp41
-rw-r--r--src/gpu/GrSWMaskHelper.h5
2 files changed, 36 insertions, 10 deletions
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,