Index: src/gpu/GrSWMaskHelper.cpp |
diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp |
index 937b34380ba464951ff9e59870c145326be033b9..95c7273285caf8e1199ff77770f1420b7f963c8c 100644 |
--- a/src/gpu/GrSWMaskHelper.cpp |
+++ b/src/gpu/GrSWMaskHelper.cpp |
@@ -19,12 +19,10 @@ |
#include "batches/GrRectBatchFactory.h" |
-namespace { |
- |
/* |
* Convert a boolean operation into a transfer mode code |
*/ |
-SkXfermode::Mode op_to_mode(SkRegion::Op op) { |
+static SkXfermode::Mode op_to_mode(SkRegion::Op op) { |
static const SkXfermode::Mode modeMap[] = { |
SkXfermode::kDstOut_Mode, // kDifference_Op |
@@ -38,76 +36,13 @@ SkXfermode::Mode op_to_mode(SkRegion::Op op) { |
return modeMap[op]; |
} |
-static inline GrPixelConfig fmt_to_config(SkTextureCompressor::Format fmt) { |
- |
- GrPixelConfig config; |
- switch (fmt) { |
- case SkTextureCompressor::kLATC_Format: |
- config = kLATC_GrPixelConfig; |
- break; |
- |
- case SkTextureCompressor::kR11_EAC_Format: |
- config = kR11_EAC_GrPixelConfig; |
- break; |
- |
- case SkTextureCompressor::kASTC_12x12_Format: |
- config = kASTC_12x12_GrPixelConfig; |
- break; |
- |
- case SkTextureCompressor::kETC1_Format: |
- config = kETC1_GrPixelConfig; |
- break; |
- |
- default: |
- SkDEBUGFAIL("No GrPixelConfig for compression format!"); |
- // Best guess |
- config = kAlpha_8_GrPixelConfig; |
- break; |
- } |
- |
- return config; |
-} |
- |
-static bool choose_compressed_fmt(const GrCaps* caps, |
- SkTextureCompressor::Format *fmt) { |
- if (nullptr == fmt) { |
- return false; |
- } |
- |
- // We can't use scratch textures without the ability to update |
- // compressed textures... |
- if (!(caps->compressedTexSubImageSupport())) { |
- return false; |
- } |
- |
- // Figure out what our preferred texture type is. If ASTC is available, that always |
- // gives the biggest win. Otherwise, in terms of compression speed and accuracy, |
- // LATC has a slight edge over R11 EAC. |
- if (caps->isConfigTexturable(kASTC_12x12_GrPixelConfig)) { |
- *fmt = SkTextureCompressor::kASTC_12x12_Format; |
- return true; |
- } else if (caps->isConfigTexturable(kLATC_GrPixelConfig)) { |
- *fmt = SkTextureCompressor::kLATC_Format; |
- return true; |
- } else if (caps->isConfigTexturable(kR11_EAC_GrPixelConfig)) { |
- *fmt = SkTextureCompressor::kR11_EAC_Format; |
- return true; |
- } |
- |
- return false; |
-} |
- |
-} |
- |
/** |
* Draw a single rect element of the clip stack into the accumulation bitmap |
*/ |
-void GrSWMaskHelper::draw(const SkRect& rect, SkRegion::Op op, |
- bool antiAlias, uint8_t alpha) { |
+void GrSWMaskHelper::drawRect(const SkRect& rect, SkRegion::Op op, |
+ bool antiAlias, uint8_t alpha) { |
SkPaint paint; |
- SkASSERT(kNone_CompressionMode == fCompressionMode); |
- |
paint.setXfermode(SkXfermode::Make(op_to_mode(op))); |
paint.setAntiAlias(antiAlias); |
paint.setColor(SkColorSetARGB(alpha, alpha, alpha, alpha)); |
@@ -118,35 +53,24 @@ void GrSWMaskHelper::draw(const SkRect& rect, SkRegion::Op op, |
/** |
* Draw a single path element of the clip stack into the accumulation bitmap |
*/ |
-void GrSWMaskHelper::draw(const SkPath& path, const GrStyle& style, SkRegion::Op op, |
- bool antiAlias, uint8_t alpha) { |
+void GrSWMaskHelper::drawPath(const SkPath& path, const GrStyle& style, SkRegion::Op op, |
+ bool antiAlias, uint8_t alpha) { |
SkPaint paint; |
paint.setPathEffect(sk_ref_sp(style.pathEffect())); |
style.strokeRec().applyToPaint(&paint); |
paint.setAntiAlias(antiAlias); |
- SkTBlitterAllocator allocator; |
- SkBlitter* blitter = nullptr; |
- if (kBlitter_CompressionMode == fCompressionMode) { |
- SkASSERT(fCompressedBuffer.get()); |
- blitter = SkTextureCompressor::CreateBlitterForFormat( |
- fPixels.width(), fPixels.height(), fCompressedBuffer.get(), &allocator, |
- fCompressedFormat); |
- } |
- |
if (SkRegion::kReplace_Op == op && 0xFF == alpha) { |
SkASSERT(0xFF == paint.getAlpha()); |
- fDraw.drawPathCoverage(path, paint, blitter); |
+ fDraw.drawPathCoverage(path, paint); |
} else { |
paint.setXfermodeMode(op_to_mode(op)); |
paint.setColor(SkColorSetARGB(alpha, alpha, alpha, alpha)); |
- fDraw.drawPath(path, paint, blitter); |
+ fDraw.drawPath(path, paint); |
} |
} |
-bool GrSWMaskHelper::init(const SkIRect& resultBounds, |
- const SkMatrix* matrix, |
- bool allowCompression) { |
+bool GrSWMaskHelper::init(const SkIRect& resultBounds, const SkMatrix* matrix) { |
if (matrix) { |
fMatrix = *matrix; |
} else { |
@@ -154,54 +78,16 @@ bool GrSWMaskHelper::init(const SkIRect& resultBounds, |
} |
// Now translate so the bound's UL corner is at the origin |
- fMatrix.postTranslate(-resultBounds.fLeft * SK_Scalar1, |
- -resultBounds.fTop * SK_Scalar1); |
- SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), |
- resultBounds.height()); |
- |
- if (allowCompression && |
- fContext->caps()->drawPathMasksToCompressedTexturesSupport() && |
- choose_compressed_fmt(fContext->caps(), &fCompressedFormat)) { |
- fCompressionMode = kCompress_CompressionMode; |
- } |
+ fMatrix.postTranslate(-SkIntToScalar(resultBounds.fLeft), -SkIntToScalar(resultBounds.fTop)); |
+ SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height()); |
- // Make sure that the width is a multiple of the desired block dimensions |
- // to allow for specialized SIMD instructions that compress multiple blocks at a time. |
- int cmpWidth = bounds.fRight; |
- int cmpHeight = bounds.fBottom; |
- if (kCompress_CompressionMode == fCompressionMode) { |
- int dimX, dimY; |
- SkTextureCompressor::GetBlockDimensions(fCompressedFormat, &dimX, &dimY); |
- cmpWidth = dimX * ((cmpWidth + (dimX - 1)) / dimX); |
- cmpHeight = dimY * ((cmpHeight + (dimY - 1)) / dimY); |
- |
- // Can we create a blitter? |
- if (SkTextureCompressor::ExistsBlitterForFormat(fCompressedFormat)) { |
- int cmpSz = SkTextureCompressor::GetCompressedDataSize( |
- fCompressedFormat, cmpWidth, cmpHeight); |
- |
- SkASSERT(cmpSz > 0); |
- SkASSERT(nullptr == fCompressedBuffer.get()); |
- fCompressedBuffer.reset(cmpSz); |
- fCompressionMode = kBlitter_CompressionMode; |
- } |
+ const SkImageInfo bmImageInfo = SkImageInfo::MakeA8(bounds.width(), bounds.height()); |
+ if (!fPixels.tryAlloc(bmImageInfo)) { |
+ return false; |
} |
+ fPixels.erase(0); |
sk_bzero(&fDraw, sizeof(fDraw)); |
- |
- // If we don't have a custom blitter, then we either need a bitmap to compress |
- // from or a bitmap that we're going to use as a texture. In any case, we should |
- // allocate the pixels for a bitmap |
- const SkImageInfo bmImageInfo = SkImageInfo::MakeA8(cmpWidth, cmpHeight); |
- if (kBlitter_CompressionMode != fCompressionMode) { |
- if (!fPixels.tryAlloc(bmImageInfo)) { |
- return false; |
- } |
- fPixels.erase(0); |
- } else { |
- // Otherwise, we just need to remember how big the buffer is... |
- fPixels.reset(bmImageInfo); |
- } |
fDraw.fDst = fPixels; |
fRasterClip.setRect(bounds); |
fDraw.fRC = &fRasterClip; |
@@ -218,67 +104,20 @@ GrTexture* GrSWMaskHelper::createTexture() { |
desc.fHeight = fPixels.height(); |
desc.fConfig = kAlpha_8_GrPixelConfig; |
- if (kNone_CompressionMode != fCompressionMode) { |
- |
-#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); |
- SkASSERT(fContext->caps()->isConfigTexturable(desc.fConfig)); |
- } |
- |
return fContext->textureProvider()->createApproxTexture(desc); |
} |
-void GrSWMaskHelper::sendTextureData(GrTexture *texture, const GrSurfaceDesc& desc, |
- const void *data, size_t rowbytes) { |
- // Since we're uploading to it, and it's compressed, 'texture' shouldn't |
- // have a render target. |
- SkASSERT(nullptr == texture->asRenderTarget()); |
- |
- texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, data, rowbytes); |
-} |
- |
-void GrSWMaskHelper::compressTextureData(GrTexture *texture, const GrSurfaceDesc& desc) { |
- |
- SkASSERT(GrPixelConfigIsCompressed(desc.fConfig)); |
- SkASSERT(fmt_to_config(fCompressedFormat) == desc.fConfig); |
- |
- SkAutoDataUnref cmpData(SkTextureCompressor::CompressBitmapToFormat(fPixels, |
- fCompressedFormat)); |
- SkASSERT(cmpData); |
- |
- this->sendTextureData(texture, desc, cmpData->data(), 0); |
-} |
- |
/** |
* Move the result of the software mask generation back to the gpu |
*/ |
void GrSWMaskHelper::toTexture(GrTexture *texture) { |
- GrSurfaceDesc desc; |
- desc.fWidth = fPixels.width(); |
- desc.fHeight = fPixels.height(); |
- desc.fConfig = texture->config(); |
- |
- // First see if we should compress this texture before uploading. |
- switch (fCompressionMode) { |
- case kNone_CompressionMode: |
- this->sendTextureData(texture, desc, fPixels.addr(), fPixels.rowBytes()); |
- break; |
- |
- case kCompress_CompressionMode: |
- this->compressTextureData(texture, desc); |
- break; |
- |
- case kBlitter_CompressionMode: |
- SkASSERT(fCompressedBuffer.get()); |
- this->sendTextureData(texture, desc, fCompressedBuffer.get(), 0); |
- break; |
- } |
+ // Since we're uploading to it, and it's compressed, 'texture' shouldn't |
+ // have a render target. |
+ SkASSERT(!texture->asRenderTarget()); |
+ |
+ texture->writePixels(0, 0, fPixels.width(), fPixels.height(), texture->config(), |
+ fPixels.addr(), fPixels.rowBytes()); |
+ |
} |
/** |
@@ -307,7 +146,7 @@ GrTexture* GrSWMaskHelper::DrawPathMaskToTexture(GrContext* context, |
return nullptr; |
} |
- helper.draw(path, style, SkRegion::kReplace_Op, antiAlias, 0xFF); |
+ helper.drawPath(path, style, SkRegion::kReplace_Op, antiAlias, 0xFF); |
GrTexture* texture(helper.createTexture()); |
if (!texture) { |