| Index: src/gpu/SkGpuDevice.cpp
|
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
|
| index ea998b86b04f6e29fe5735e06b23b1e391bf4ecd..94ded8de98b631d6c2c61cef3c390f8825b606d3 100644
|
| --- a/src/gpu/SkGpuDevice.cpp
|
| +++ b/src/gpu/SkGpuDevice.cpp
|
| @@ -8,6 +8,7 @@
|
| #include "SkGpuDevice.h"
|
|
|
| #include "GrContext.h"
|
| +#include "GrDrawContext.h"
|
| #include "GrGpu.h"
|
| #include "GrGpuResourcePriv.h"
|
| #include "GrLayerHoister.h"
|
| @@ -168,6 +169,7 @@ SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, int width, int height,
|
| bool useDFT = fSurfaceProps.isUseDistanceFieldFonts();
|
| fTextContext = fContext->createTextContext(fRenderTarget, this, this->getLeakyProperties(),
|
| useDFT);
|
| + fDrawContext.reset(SkRef(fContext->drawContext()));
|
| }
|
|
|
| GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::Budgeted budgeted,
|
| @@ -226,7 +228,7 @@ SkGpuDevice::~SkGpuDevice() {
|
| delete fDrawProcs;
|
| }
|
|
|
| - delete fTextContext;
|
| + SkDELETE(fTextContext);
|
|
|
| fRenderTarget->unref();
|
| fContext->unref();
|
| @@ -310,7 +312,7 @@ void SkGpuDevice::clearAll() {
|
| GrColor color = 0;
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::clearAll", fContext);
|
| SkIRect rect = SkIRect::MakeWH(this->width(), this->height());
|
| - fContext->clear(&rect, color, true, fRenderTarget);
|
| + fDrawContext->clear(fRenderTarget, &rect, color, true);
|
| fNeedClear = false;
|
| }
|
|
|
| @@ -344,6 +346,8 @@ void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
|
| SkASSERT(fRenderTarget->surfacePriv().info() == fLegacyBitmap.info());
|
| SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (fRenderTarget->surfacePriv().info(), fRenderTarget));
|
| fLegacyBitmap.setPixelRef(pr)->unref();
|
| +
|
| + fDrawContext.reset(SkRef(fRenderTarget->getContext()->drawContext()));
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -357,7 +361,7 @@ void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) {
|
| return;
|
| }
|
|
|
| - fContext->drawPaint(fRenderTarget, fClip, grPaint, *draw.fMatrix);
|
| + fDrawContext->drawPaint(fRenderTarget, fClip, grPaint, *draw.fMatrix);
|
| }
|
|
|
| // must be in SkCanvas::PointMode order
|
| @@ -388,7 +392,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| path.setIsVolatile(true);
|
| path.moveTo(pts[0]);
|
| path.lineTo(pts[1]);
|
| - fContext->drawPath(fRenderTarget, fClip, grPaint, *draw.fMatrix, path, strokeInfo);
|
| + fDrawContext->drawPath(fRenderTarget, fClip, grPaint, *draw.fMatrix, path, strokeInfo);
|
| return;
|
| }
|
|
|
| @@ -404,17 +408,17 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| return;
|
| }
|
|
|
| - fContext->drawVertices(fRenderTarget,
|
| - fClip,
|
| - grPaint,
|
| - *draw.fMatrix,
|
| - gPointMode2PrimtiveType[mode],
|
| - SkToS32(count),
|
| - (SkPoint*)pts,
|
| - NULL,
|
| - NULL,
|
| - NULL,
|
| - 0);
|
| + fDrawContext->drawVertices(fRenderTarget,
|
| + fClip,
|
| + grPaint,
|
| + *draw.fMatrix,
|
| + gPointMode2PrimtiveType[mode],
|
| + SkToS32(count),
|
| + (SkPoint*)pts,
|
| + NULL,
|
| + NULL,
|
| + NULL,
|
| + 0);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -478,7 +482,7 @@ void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect,
|
| return;
|
| }
|
|
|
| - fContext->drawRect(fRenderTarget, fClip, grPaint, *draw.fMatrix, rect, &strokeInfo);
|
| + fDrawContext->drawRect(fRenderTarget, fClip, grPaint, *draw.fMatrix, rect, &strokeInfo);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -548,7 +552,7 @@ void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect,
|
| return;
|
| }
|
|
|
| - fContext->drawRRect(fRenderTarget, fClip, grPaint, *draw.fMatrix, rect, strokeInfo);
|
| + fDrawContext->drawRRect(fRenderTarget, fClip, grPaint, *draw.fMatrix, rect, strokeInfo);
|
| }
|
|
|
| void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| @@ -566,7 +570,7 @@ void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| }
|
|
|
| if (NULL == paint.getMaskFilter() && NULL == paint.getPathEffect()) {
|
| - fContext->drawDRRect(fRenderTarget, fClip, grPaint, *draw.fMatrix, outer, inner);
|
| + fDrawContext->drawDRRect(fRenderTarget, fClip, grPaint, *draw.fMatrix, outer, inner);
|
| return;
|
| }
|
| }
|
| @@ -615,7 +619,7 @@ void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval,
|
| return;
|
| }
|
|
|
| - fContext->drawOval(fRenderTarget, fClip, grPaint, *draw.fMatrix, oval, strokeInfo);
|
| + fDrawContext->drawOval(fRenderTarget, fClip, grPaint, *draw.fMatrix, oval, strokeInfo);
|
| }
|
|
|
| #include "SkMaskFilter.h"
|
| @@ -628,7 +632,7 @@ namespace {
|
| // Draw a mask using the supplied paint. Since the coverage/geometry
|
| // is already burnt into the mask this boils down to a rect draw.
|
| // Return true if the mask was successfully drawn.
|
| -bool draw_mask(GrContext* context,
|
| +bool draw_mask(GrDrawContext* drawContext,
|
| GrRenderTarget* rt,
|
| const GrClip& clip,
|
| const SkMatrix& viewMatrix,
|
| @@ -646,7 +650,7 @@ bool draw_mask(GrContext* context,
|
| if (!viewMatrix.invert(&inverse)) {
|
| return false;
|
| }
|
| - context->drawNonAARectWithLocalMatrix(rt, clip, *grp, SkMatrix::I(), maskRect, inverse);
|
| + drawContext->drawNonAARectWithLocalMatrix(rt, clip, *grp, SkMatrix::I(), maskRect, inverse);
|
| return true;
|
| }
|
|
|
| @@ -654,7 +658,8 @@ static bool clip_bounds_quick_reject(const SkIRect& clipBounds, const SkIRect& r
|
| return clipBounds.isEmpty() || rect.isEmpty() || !SkIRect::Intersects(clipBounds, rect);
|
| }
|
|
|
| -bool draw_with_mask_filter(GrContext* context,
|
| +bool draw_with_mask_filter(GrDrawContext* drawContext,
|
| + GrTextureProvider* textureProvider,
|
| GrRenderTarget* rt,
|
| const GrClip& clipData,
|
| const SkMatrix& viewMatrix,
|
| @@ -688,7 +693,7 @@ bool draw_with_mask_filter(GrContext* context,
|
| desc.fHeight = dstM.fBounds.height();
|
| desc.fConfig = kAlpha_8_GrPixelConfig;
|
|
|
| - SkAutoTUnref<GrTexture> texture(context->textureProvider()->refScratchTexture(
|
| + SkAutoTUnref<GrTexture> texture(textureProvider->refScratchTexture(
|
| desc, GrTextureProvider::kApprox_ScratchTexMatch));
|
| if (!texture) {
|
| return false;
|
| @@ -698,12 +703,11 @@ bool draw_with_mask_filter(GrContext* context,
|
|
|
| SkRect maskRect = SkRect::Make(dstM.fBounds);
|
|
|
| - return draw_mask(context, rt, clipData, viewMatrix, maskRect, grp, texture);
|
| + return draw_mask(drawContext, rt, clipData, viewMatrix, maskRect, grp, texture);
|
| }
|
|
|
| // Create a mask of 'devPath' and place the result in 'mask'.
|
| GrTexture* create_mask_GPU(GrContext* context,
|
| - GrRenderTarget* rt,
|
| const SkRect& maskRect,
|
| const SkPath& devPath,
|
| const GrStrokeInfo& strokeInfo,
|
| @@ -731,7 +735,12 @@ GrTexture* create_mask_GPU(GrContext* context,
|
|
|
| SkRect clipRect = SkRect::MakeWH(maskRect.width(), maskRect.height());
|
|
|
| - context->clear(NULL, 0x0, true, mask->asRenderTarget());
|
| + GrDrawContext* drawContext = context->drawContext();
|
| + if (!drawContext) {
|
| + return NULL;
|
| + }
|
| +
|
| + drawContext->clear(mask->asRenderTarget(), NULL, 0x0, true);
|
|
|
| GrPaint tempPaint;
|
| tempPaint.setAntiAlias(doAA);
|
| @@ -743,7 +752,7 @@ GrTexture* create_mask_GPU(GrContext* context,
|
| // Draw the mask into maskTexture with the path's top-left at the origin using tempPaint.
|
| SkMatrix translate;
|
| translate.setTranslate(-maskRect.fLeft, -maskRect.fTop);
|
| - context->drawPath(mask->asRenderTarget(), clip, tempPaint, translate, devPath, strokeInfo);
|
| + drawContext->drawPath(mask->asRenderTarget(), clip, tempPaint, translate, devPath, strokeInfo);
|
| return mask;
|
| }
|
|
|
| @@ -871,7 +880,6 @@ void SkGpuDevice::internalDrawPath(const SkPath& origSrcPath, const SkPaint& pai
|
|
|
|
|
| SkAutoTUnref<GrTexture> mask(create_mask_GPU(fContext,
|
| - fRenderTarget,
|
| maskRect,
|
| *devPathPtr,
|
| strokeInfo,
|
| @@ -883,7 +891,7 @@ void SkGpuDevice::internalDrawPath(const SkPath& origSrcPath, const SkPaint& pai
|
| if (paint.getMaskFilter()->filterMaskGPU(mask, viewMatrix, maskRect, &filtered, true)) {
|
| // filterMaskGPU gives us ownership of a ref to the result
|
| SkAutoTUnref<GrTexture> atu(filtered);
|
| - if (draw_mask(fContext,
|
| + if (draw_mask(fDrawContext,
|
| fRenderTarget,
|
| fClip,
|
| viewMatrix,
|
| @@ -901,12 +909,13 @@ void SkGpuDevice::internalDrawPath(const SkPath& origSrcPath, const SkPaint& pai
|
| // GPU path fails
|
| SkPaint::Style style = strokeInfo.isHairlineStyle() ? SkPaint::kStroke_Style :
|
| SkPaint::kFill_Style;
|
| - draw_with_mask_filter(fContext, fRenderTarget, fClip, viewMatrix, *devPathPtr,
|
| + draw_with_mask_filter(fDrawContext, fContext->textureProvider(), fRenderTarget,
|
| + fClip, viewMatrix, *devPathPtr,
|
| paint.getMaskFilter(), clipBounds, &grPaint, style);
|
| return;
|
| }
|
|
|
| - fContext->drawPath(fRenderTarget, fClip, grPaint, viewMatrix, *pathPtr, strokeInfo);
|
| + fDrawContext->drawPath(fRenderTarget, fClip, grPaint, viewMatrix, *pathPtr, strokeInfo);
|
| }
|
|
|
| static const int kBmpSmallTileSize = 1 << 10;
|
| @@ -1493,8 +1502,8 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap,
|
| return;
|
| }
|
|
|
| - fContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, viewMatrix, dstRect,
|
| - paintRect);
|
| + fDrawContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, viewMatrix, dstRect,
|
| + paintRect);
|
| }
|
|
|
| bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture,
|
| @@ -1569,18 +1578,18 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
|
| return;
|
| }
|
|
|
| - fContext->drawNonAARectToRect(fRenderTarget,
|
| - fClip,
|
| - grPaint,
|
| - SkMatrix::I(),
|
| - SkRect::MakeXYWH(SkIntToScalar(left),
|
| - SkIntToScalar(top),
|
| - SkIntToScalar(w),
|
| - SkIntToScalar(h)),
|
| - SkRect::MakeXYWH(0,
|
| - 0,
|
| - SK_Scalar1 * w / texture->width(),
|
| - SK_Scalar1 * h / texture->height()));
|
| + fDrawContext->drawNonAARectToRect(fRenderTarget,
|
| + fClip,
|
| + grPaint,
|
| + SkMatrix::I(),
|
| + SkRect::MakeXYWH(SkIntToScalar(left),
|
| + SkIntToScalar(top),
|
| + SkIntToScalar(w),
|
| + SkIntToScalar(h)),
|
| + SkRect::MakeXYWH(0,
|
| + 0,
|
| + SK_Scalar1 * w / texture->width(),
|
| + SK_Scalar1 * h / texture->height()));
|
| }
|
|
|
| void SkGpuDevice::drawBitmapRect(const SkDraw& origDraw, const SkBitmap& bitmap,
|
| @@ -1695,8 +1704,8 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
| SkRect srcRect = SkRect::MakeWH(SK_Scalar1 * w / devTex->width(),
|
| SK_Scalar1 * h / devTex->height());
|
|
|
| - fContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, SkMatrix::I(), dstRect,
|
| - srcRect);
|
| + fDrawContext->drawNonAARectToRect(fRenderTarget, fClip, grPaint, SkMatrix::I(), dstRect,
|
| + srcRect);
|
| }
|
|
|
| bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) {
|
| @@ -1865,17 +1874,17 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| }
|
| colors = convertedColors.get();
|
| }
|
| - fContext->drawVertices(fRenderTarget,
|
| - fClip,
|
| - grPaint,
|
| - *draw.fMatrix,
|
| - primType,
|
| - vertexCount,
|
| - vertices,
|
| - texs,
|
| - colors,
|
| - outIndices,
|
| - indexCount);
|
| + fDrawContext->drawVertices(fRenderTarget,
|
| + fClip,
|
| + grPaint,
|
| + *draw.fMatrix,
|
| + primType,
|
| + vertexCount,
|
| + vertices,
|
| + texs,
|
| + colors,
|
| + outIndices,
|
| + indexCount);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|