| 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) {
|
|
|