| Index: src/gpu/SkGpuDevice.cpp
|
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
|
| index 36e0342f78b2a522e1c1c47af8e1772f3a5b7b1f..76a3eccaa4d59f01540c21425a6f5bd952a5fa39 100644
|
| --- a/src/gpu/SkGpuDevice.cpp
|
| +++ b/src/gpu/SkGpuDevice.cpp
|
| @@ -246,6 +246,7 @@ SkGpuDevice::~SkGpuDevice() {
|
| delete fDrawProcs;
|
| }
|
|
|
| + SkASSERT(!fRenderTarget->fromRawPixels2());
|
| fRenderTarget->unref();
|
| fContext->unref();
|
| }
|
| @@ -281,7 +282,8 @@ bool SkGpuDevice::onWritePixels(const SkImageInfo& info, const void* pixels, siz
|
| if (kUnpremul_SkAlphaType == info.alphaType()) {
|
| flags = GrContext::kUnpremul_PixelOpsFlag;
|
| }
|
| - fRenderTarget->writePixels(x, y, info.width(), info.height(), config, pixels, rowBytes, flags);
|
| +
|
| + fRenderTarget->writePixels(fDrawContext, x, y, info.width(), info.height(), config, pixels, rowBytes, flags);
|
|
|
| // need to bump our genID for compatibility with clients that "know" we have a bitmap
|
| fLegacyBitmap.notifyPixelsChanged();
|
| @@ -360,6 +362,9 @@ void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
|
| if (fRenderTarget->wasDestroyed()) {
|
| return;
|
| }
|
| + SkASSERT(fRenderTarget->width() == newRT->width());
|
| + SkASSERT(fRenderTarget->height() == newRT->height());
|
| +
|
| this->context()->copySurface(newRT, fRenderTarget);
|
| }
|
|
|
| @@ -386,7 +391,7 @@ void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) {
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPaint", fContext);
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -435,7 +440,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| if (paint.getPathEffect() && 2 == count && SkCanvas::kLines_PointMode == mode) {
|
| GrStrokeInfo strokeInfo(paint, SkPaint::kStroke_Style);
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| SkPath path;
|
| @@ -455,7 +460,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| }
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -517,7 +522,7 @@ void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect,
|
| }
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -533,7 +538,7 @@ void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect,
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -603,7 +608,7 @@ void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -655,7 +660,7 @@ void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval,
|
| }
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1006,9 +1011,12 @@ static void draw_aa_bitmap(GrDrawContext* drawContext, GrContext* context,
|
| // Create and insert texture effect
|
| SkAutoTUnref<const GrFragmentProcessor> fp;
|
| if (doBicubic) {
|
| - fp.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), tm));
|
| + fp.reset(GrBicubicEffect::Create(texture,
|
| + SkMatrix::I(),
|
| + tm, renderTarget));
|
| } else {
|
| - fp.reset(GrSimpleTextureEffect::Create(texture, SkMatrix::I(), params));
|
| + fp.reset(GrSimpleTextureEffect::Create(texture,
|
| + SkMatrix::I(), params, kLocal_GrCoordSet, renderTarget));
|
| }
|
|
|
| if (kAlpha_8_SkColorType == bitmapPtr->colorType()) {
|
| @@ -1017,7 +1025,7 @@ static void draw_aa_bitmap(GrDrawContext* drawContext, GrContext* context,
|
| fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp));
|
| }
|
|
|
| - if (!SkPaintToGrPaintReplaceShader(context, paint, fp, &grPaint)) {
|
| + if (!SkPaintToGrPaintReplaceShader(context, paint, fp, &grPaint, renderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1362,20 +1370,24 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap,
|
| }
|
| textureDomain.setLTRB(left, top, right, bottom);
|
| if (bicubic) {
|
| - fp.reset(GrBicubicEffect::Create(texture, texMatrix, textureDomain));
|
| +
|
| + fp.reset(GrBicubicEffect::Create(texture,
|
| + SkMatrix::I(), textureDomain, fRenderTarget));
|
| } else {
|
| fp.reset(GrTextureDomainEffect::Create(texture,
|
| texMatrix,
|
| textureDomain,
|
| GrTextureDomain::kClamp_Mode,
|
| - params.filterMode()));
|
| + params.filterMode(), kLocal_GrCoordSet, fRenderTarget));
|
| }
|
| } else if (bicubic) {
|
| SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode());
|
| SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTileModeY() };
|
| - fp.reset(GrBicubicEffect::Create(texture, texMatrix, tileModes));
|
| + fp.reset(GrBicubicEffect::Create(texture, SkMatrix::I(),
|
| + tileModes, fRenderTarget));
|
| } else {
|
| - fp.reset(GrSimpleTextureEffect::Create(texture, texMatrix, params));
|
| + fp.reset(GrSimpleTextureEffect::Create(texture,
|
| + SkMatrix::I(), params, kLocal_GrCoordSet, fRenderTarget));
|
| }
|
|
|
| SkAutoTUnref<const GrFragmentProcessor> shaderFP;
|
| @@ -1385,7 +1397,7 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap,
|
| shaderFP.reset(shader->asFragmentProcessor(this->context(),
|
| viewMatrix,
|
| nullptr,
|
| - paint.getFilterQuality()));
|
| + paint.getFilterQuality(), fRenderTarget));
|
| if (!shaderFP) {
|
| return;
|
| }
|
| @@ -1398,7 +1410,7 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap,
|
| fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp));
|
| }
|
|
|
| - if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) {
|
| + if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1418,9 +1430,9 @@ bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture,
|
| SkBitmap* result, SkIPoint* offset) {
|
| SkASSERT(filter);
|
|
|
| - SkImageFilter::DeviceProxy proxy(this);
|
| -
|
| if (filter->canFilterImageGPU()) {
|
| + SkImageFilter::DeviceProxy proxy(this);
|
| +
|
| return filter->filterImageGPU(&proxy, wrap_texture(texture, width, height),
|
| ctx, result, offset);
|
| } else {
|
| @@ -1479,13 +1491,14 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
|
|
|
| GrPaint grPaint;
|
| SkAutoTUnref<const GrFragmentProcessor> fp(
|
| - GrSimpleTextureEffect::Create(texture, SkMatrix::I()));
|
| + GrSimpleTextureEffect::Create(texture, SkMatrix::I(),
|
| + kLocal_GrCoordSet, fRenderTarget));
|
| if (alphaOnly) {
|
| fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp));
|
| } else {
|
| fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp));
|
| }
|
| - if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) {
|
| + if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1569,9 +1582,9 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
| // drawDevice is defined to be in device coords.
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| - GrRenderTarget* devRT = dev->accessRenderTarget();
|
| - GrTexture* devTex;
|
| - if (nullptr == (devTex = devRT->asTexture())) {
|
| + GrRenderTarget* srcDevRT = dev->accessRenderTarget();
|
| + GrTexture* srcDevTex;
|
| + if (nullptr == (srcDevTex = srcDevRT->asTexture())) {
|
| return;
|
| }
|
|
|
| @@ -1587,14 +1600,15 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
| SkIPoint offset = SkIPoint::Make(0, 0);
|
| SkMatrix matrix(*draw.fMatrix);
|
| matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y));
|
| - SkIRect clipBounds = SkIRect::MakeWH(devTex->width(), devTex->height());
|
| + SkIRect clipBounds = SkIRect::MakeWH(srcDevTex->width(), srcDevTex->height());
|
| // This cache is transient, and is freed (along with all its contained
|
| // textures) when it goes out of scope.
|
| SkAutoTUnref<SkImageFilter::Cache> cache(getImageFilterCache());
|
| SkImageFilter::Context ctx(matrix, clipBounds, cache, SkImageFilter::kApprox_SizeConstraint);
|
| - if (this->filterTexture(fContext, devTex, device->width(), device->height(),
|
| + if (this->filterTexture(fContext, srcDevTex, device->width(), device->height(),
|
| filter, ctx, &filteredBitmap, &offset)) {
|
| - devTex = filteredBitmap.getTexture();
|
| + srcDevTex = filteredBitmap.getTexture();
|
| + srcDevRT = srcDevTex->asRenderTarget();
|
| w = filteredBitmap.width();
|
| h = filteredBitmap.height();
|
| x += offset.fX;
|
| @@ -1606,15 +1620,16 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
|
|
| GrPaint grPaint;
|
| SkAutoTUnref<const GrFragmentProcessor> fp(
|
| - GrSimpleTextureEffect::Create(devTex, SkMatrix::I()));
|
| - if (GrPixelConfigIsAlphaOnly(devTex->config())) {
|
| + GrSimpleTextureEffect::Create(srcDevTex, SkMatrix::I(),
|
| + kLocal_GrCoordSet, fRenderTarget));
|
| + if (GrPixelConfigIsAlphaOnly(srcDevTex->config())) {
|
| // Can this happen?
|
| fp.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp));
|
| - } else {
|
| + } else {
|
| fp.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp));
|
| }
|
|
|
| - if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint)) {
|
| + if (!SkPaintToGrPaintReplaceShader(this->context(), paint, fp, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1625,12 +1640,17 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
|
|
| // The device being drawn may not fill up its texture (e.g. saveLayer uses approximate
|
| // scratch texture).
|
| - SkRect srcRect = SkRect::MakeWH(SK_Scalar1 * w / devTex->width(),
|
| - SK_Scalar1 * h / devTex->height());
|
| + SkRect srcRect = SkRect::MakeWH(SK_Scalar1 * w / srcDevTex->width(),
|
| + SK_Scalar1 * h / srcDevTex->height());
|
|
|
| fDrawContext->fillRectToRect(fClip, grPaint, SkMatrix::I(), dstRect, srcRect);
|
| }
|
|
|
| +void SkGpuDevice::discard37() {
|
| + fDrawContext->discard();
|
| + // TODO: we need to close off the DrawTarget & create a new one
|
| +}
|
| +
|
| bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) {
|
| return filter->canFilterImageGPU();
|
| }
|
| @@ -1724,6 +1744,7 @@ void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const
|
| return;
|
| }
|
| }
|
| +
|
| this->drawBitmapRect(draw, bm, src, dst, paint, constraint);
|
| }
|
|
|
| @@ -1756,7 +1777,7 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
|
|
| GrPaint grPaint;
|
| // we ignore the shader if texs is null.
|
| - if (!SkPaintToGrPaintNoShader(this->context(), copy, &grPaint)) {
|
| + if (!SkPaintToGrPaintNoShader(this->context(), copy, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1789,6 +1810,7 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| lineIndices[i + 5] = state.f0;
|
| i += 6;
|
| }
|
| +
|
| fDrawContext->drawVertices(fClip,
|
| grPaint,
|
| *draw.fMatrix,
|
| @@ -1828,12 +1850,12 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| colorMode = SkXfermode::kModulate_Mode;
|
| }
|
| if (!SkPaintToGrPaintWithXfermode(this->context(), paint, *draw.fMatrix, colorMode,
|
| - false, &grPaint)) {
|
| + false, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| } else {
|
| // We have a shader, but no colors to blend it against.
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| }
|
| @@ -1841,12 +1863,12 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| if (colors) {
|
| // We have colors, but either have no shader or no texture coords (which implies that
|
| // we should ignore the shader).
|
| - if (!SkPaintToGrPaintWithPrimitiveColor(this->context(), paint, &grPaint)) {
|
| + if (!SkPaintToGrPaintWithPrimitiveColor(this->context(), paint, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| } else {
|
| // No colors and no shaders. Just draw with the paint color.
|
| - if (!SkPaintToGrPaintNoShader(this->context(), paint, &grPaint)) {
|
| + if (!SkPaintToGrPaintNoShader(this->context(), paint, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| }
|
| @@ -1881,13 +1903,14 @@ void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRS
|
| p.setShader(atlas->newShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode))->unref();
|
|
|
| GrPaint grPaint;
|
| +
|
| if (colors) {
|
| if (!SkPaintToGrPaintWithXfermode(this->context(), p, *draw.fMatrix, mode, true,
|
| - &grPaint)) {
|
| + &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| } else {
|
| - if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), p, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
| }
|
| @@ -1905,7 +1928,7 @@ void SkGpuDevice::drawText(const SkDraw& draw, const void* text,
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawText", fContext);
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1922,7 +1945,7 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| GrPaint grPaint;
|
| - if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) {
|
| + if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint, fRenderTarget)) {
|
| return;
|
| }
|
|
|
| @@ -1935,6 +1958,10 @@ void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteL
|
|
|
| void SkGpuDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkScalar x, SkScalar y,
|
| const SkPaint& paint, SkDrawFilter* drawFilter) {
|
| + if (fContext->abandoned()) {
|
| + return;
|
| + }
|
| +
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawTextBlob", fContext);
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| @@ -1952,6 +1979,7 @@ bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const {
|
|
|
| void SkGpuDevice::flush() {
|
| DO_DEFERRED_CLEAR();
|
| +
|
| fRenderTarget->prepareForExternalIO();
|
| }
|
|
|
| @@ -1996,6 +2024,8 @@ SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps
|
| &props);
|
| }
|
|
|
| +#define SK_IGNORE_GPU_LAYER_HOISTING 1
|
| +
|
| bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture* mainPicture,
|
| const SkMatrix* matrix, const SkPaint* paint) {
|
| #ifndef SK_IGNORE_GPU_LAYER_HOISTING
|
|
|