| Index: src/gpu/SkGpuDevice.cpp
|
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
|
| index 40da40aca4f6773bf4a978295609b9b80a78112a..e33ea4477c5a3037516931dd4490bd1101e1cbff 100644
|
| --- a/src/gpu/SkGpuDevice.cpp
|
| +++ b/src/gpu/SkGpuDevice.cpp
|
| @@ -50,6 +50,9 @@
|
|
|
| #if SK_SUPPORT_GPU
|
|
|
| +#define ASSERT_SINGLE_OWNER \
|
| + SkDEBUGCODE(GrSingleOwner::AutoEnforce debug_SingleOwner(fContext->debugSingleOwner());)
|
| +
|
| enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 };
|
|
|
| #if 0
|
| @@ -227,6 +230,7 @@ GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::B
|
|
|
| bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
|
| int x, int y) {
|
| + ASSERT_SINGLE_OWNER
|
| DO_DEFERRED_CLEAR();
|
|
|
| // TODO: teach fRenderTarget to take ImageInfo directly to specify the src pixels
|
| @@ -245,6 +249,7 @@ bool SkGpuDevice::onReadPixels(const SkImageInfo& dstInfo, void* dstPixels, size
|
|
|
| bool SkGpuDevice::onWritePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes,
|
| int x, int y) {
|
| + ASSERT_SINGLE_OWNER
|
| // TODO: teach fRenderTarget to take ImageInfo directly to specify the src pixels
|
| GrPixelConfig config = SkImageInfo2GrPixelConfig(info);
|
| if (kUnknown_GrPixelConfig == config) {
|
| @@ -263,11 +268,13 @@ bool SkGpuDevice::onWritePixels(const SkImageInfo& info, const void* pixels, siz
|
| }
|
|
|
| const SkBitmap& SkGpuDevice::onAccessBitmap() {
|
| + ASSERT_SINGLE_OWNER
|
| DO_DEFERRED_CLEAR();
|
| return fLegacyBitmap;
|
| }
|
|
|
| bool SkGpuDevice::onAccessPixels(SkPixmap* pmap) {
|
| + ASSERT_SINGLE_OWNER
|
| DO_DEFERRED_CLEAR();
|
| // For compatibility with clients the know we're backed w/ a bitmap, and want to inspect its
|
| // genID. When we can hide/remove that fact, we can eliminate this call to notify.
|
| @@ -277,6 +284,7 @@ bool SkGpuDevice::onAccessPixels(SkPixmap* pmap) {
|
| }
|
|
|
| void SkGpuDevice::onAttachToCanvas(SkCanvas* canvas) {
|
| + ASSERT_SINGLE_OWNER
|
| INHERITED::onAttachToCanvas(canvas);
|
|
|
| // Canvas promises that this ptr is valid until onDetachFromCanvas is called
|
| @@ -284,6 +292,7 @@ void SkGpuDevice::onAttachToCanvas(SkCanvas* canvas) {
|
| }
|
|
|
| void SkGpuDevice::onDetachFromCanvas() {
|
| + ASSERT_SINGLE_OWNER
|
| INHERITED::onDetachFromCanvas();
|
| fClip.reset();
|
| fClipStack.reset(nullptr);
|
| @@ -292,6 +301,7 @@ void SkGpuDevice::onDetachFromCanvas() {
|
| // call this every draw call, to ensure that the context reflects our state,
|
| // and not the state from some other canvas/device
|
| void SkGpuDevice::prepareDraw(const SkDraw& draw) {
|
| + ASSERT_SINGLE_OWNER
|
| SkASSERT(fClipStack.get());
|
|
|
| SkASSERT(draw.fClipStack && draw.fClipStack == fClipStack);
|
| @@ -302,11 +312,13 @@ void SkGpuDevice::prepareDraw(const SkDraw& draw) {
|
| }
|
|
|
| GrRenderTarget* SkGpuDevice::accessRenderTarget() {
|
| + ASSERT_SINGLE_OWNER
|
| DO_DEFERRED_CLEAR();
|
| return fRenderTarget;
|
| }
|
|
|
| void SkGpuDevice::clearAll() {
|
| + ASSERT_SINGLE_OWNER
|
| GrColor color = 0;
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "clearAll", fContext);
|
| SkIRect rect = SkIRect::MakeWH(this->width(), this->height());
|
| @@ -315,6 +327,7 @@ void SkGpuDevice::clearAll() {
|
| }
|
|
|
| void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
|
| + ASSERT_SINGLE_OWNER
|
| // Caller must have accessed the render target, because it knows the rt must be replaced.
|
| SkASSERT(!fNeedClear);
|
|
|
| @@ -354,6 +367,7 @@ void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| CHECK_SHOULD_DRAW(draw);
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPaint", fContext);
|
|
|
| @@ -396,6 +410,7 @@ static bool needs_antialiasing(SkCanvas::PointMode mode, size_t count, const SkP
|
|
|
| void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| size_t count, const SkPoint pts[], const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| CHECK_FOR_ANNOTATION(paint);
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| @@ -446,6 +461,7 @@ void SkGpuDevice::drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawRect", fContext);
|
| CHECK_FOR_ANNOTATION(paint);
|
| CHECK_SHOULD_DRAW(draw);
|
| @@ -492,6 +508,7 @@ void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect, const SkPaint
|
|
|
| void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect,
|
| const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawRRect", fContext);
|
| CHECK_FOR_ANNOTATION(paint);
|
| CHECK_SHOULD_DRAW(draw);
|
| @@ -555,6 +572,7 @@ void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect,
|
|
|
| void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| const SkRRect& inner, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawDRRect", fContext);
|
| CHECK_FOR_ANNOTATION(paint);
|
| CHECK_SHOULD_DRAW(draw);
|
| @@ -587,6 +605,7 @@ void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
|
| /////////////////////////////////////////////////////////////////////////////
|
|
|
| void SkGpuDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawOval", fContext);
|
| CHECK_FOR_ANNOTATION(paint);
|
| CHECK_SHOULD_DRAW(draw);
|
| @@ -631,6 +650,7 @@ static SkBitmap wrap_texture(GrTexture* texture, int width, int height) {
|
| void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath,
|
| const SkPaint& paint, const SkMatrix* prePathMatrix,
|
| bool pathIsMutable) {
|
| + ASSERT_SINGLE_OWNER
|
| if (!origSrcPath.isInverseFillType() && !paint.getPathEffect() && !prePathMatrix) {
|
| bool isClosed;
|
| SkRect rect;
|
| @@ -723,6 +743,7 @@ bool SkGpuDevice::shouldTileImageID(uint32_t imageID, const SkIRect& imageRect,
|
| int maxTileSize,
|
| int* tileSize,
|
| SkIRect* clippedSubset) const {
|
| + ASSERT_SINGLE_OWNER
|
| // if it's larger than the max tile size, then we have no choice but tiling.
|
| if (imageRect.width() > maxTileSize || imageRect.height() > maxTileSize) {
|
| determine_clipped_src_rect(fRenderTarget, fClip, viewMatrix, imageRect.size(),
|
| @@ -769,6 +790,7 @@ bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap,
|
| int maxTileSize,
|
| int* tileSize,
|
| SkIRect* clippedSrcRect) const {
|
| + ASSERT_SINGLE_OWNER
|
| // if bitmap is explictly texture backed then just use the texture
|
| if (bitmap.getTexture()) {
|
| return false;
|
| @@ -781,6 +803,7 @@ bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap,
|
| bool SkGpuDevice::shouldTileImage(const SkImage* image, const SkRect* srcRectPtr,
|
| SkCanvas::SrcRectConstraint constraint, SkFilterQuality quality,
|
| const SkMatrix& viewMatrix) const {
|
| + ASSERT_SINGLE_OWNER
|
| // if image is explictly texture backed then just use the texture
|
| if (as_IB(image)->peekTexture()) {
|
| return false;
|
| @@ -815,6 +838,7 @@ void SkGpuDevice::drawBitmap(const SkDraw& origDraw,
|
| const SkBitmap& bitmap,
|
| const SkMatrix& m,
|
| const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| CHECK_SHOULD_DRAW(origDraw);
|
| SkMatrix viewMatrix;
|
| viewMatrix.setConcat(*origDraw.fMatrix, m);
|
| @@ -915,6 +939,7 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap,
|
| SkCanvas::SrcRectConstraint constraint,
|
| int tileSize,
|
| bool bicubic) {
|
| + ASSERT_SINGLE_OWNER
|
| // The following pixel lock is technically redundant, but it is desirable
|
| // to lock outside of the tile loop to prevent redecoding the whole image
|
| // at each tile in cases where 'bitmap' holds an SkDiscardablePixelRef that
|
| @@ -1107,6 +1132,7 @@ bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture,
|
| const SkImageFilter* filter,
|
| const SkImageFilter::Context& ctx,
|
| SkBitmap* result, SkIPoint* offset) {
|
| + ASSERT_SINGLE_OWNER
|
| SkASSERT(filter);
|
|
|
| SkImageFilter::DeviceProxy proxy(this);
|
| @@ -1121,6 +1147,7 @@ bool SkGpuDevice::filterTexture(GrContext* context, GrTexture* texture,
|
|
|
| void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
|
| int left, int top, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| // drawSprite is defined to be in device coords.
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| @@ -1200,6 +1227,7 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
|
| void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap,
|
| const SkRect* src, const SkRect& origDst,
|
| const SkPaint& paint, SkCanvas::SrcRectConstraint constraint) {
|
| + ASSERT_SINGLE_OWNER
|
| if (bitmap.getTexture()) {
|
| CHECK_SHOULD_DRAW(draw);
|
| GrBitmapTextureAdjuster adjuster(&bitmap);
|
| @@ -1286,6 +1314,7 @@ void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap,
|
|
|
| void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
| int x, int y, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| // clear of the source device must occur before CHECK_SHOULD_DRAW
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawDevice", fContext);
|
| SkGpuDevice* dev = static_cast<SkGpuDevice*>(device);
|
| @@ -1364,12 +1393,14 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device,
|
| }
|
|
|
| bool SkGpuDevice::canHandleImageFilter(const SkImageFilter* filter) {
|
| + ASSERT_SINGLE_OWNER
|
| return filter->canFilterImageGPU();
|
| }
|
|
|
| bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src,
|
| const SkImageFilter::Context& ctx,
|
| SkBitmap* result, SkIPoint* offset) {
|
| + ASSERT_SINGLE_OWNER
|
| // want explicitly our impl, so guard against a subclass of us overriding it
|
| if (!this->SkGpuDevice::canHandleImageFilter(filter)) {
|
| return false;
|
| @@ -1394,6 +1425,7 @@ bool SkGpuDevice::filterImage(const SkImageFilter* filter, const SkBitmap& src,
|
|
|
| void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x, SkScalar y,
|
| const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| SkMatrix viewMatrix = *draw.fMatrix;
|
| viewMatrix.preTranslate(x, y);
|
| if (as_IB(image)->peekTexture()) {
|
| @@ -1425,6 +1457,7 @@ void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x
|
| void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const SkRect* src,
|
| const SkRect& dst, const SkPaint& paint,
|
| SkCanvas::SrcRectConstraint constraint) {
|
| + ASSERT_SINGLE_OWNER
|
| if (as_IB(image)->peekTexture()) {
|
| CHECK_SHOULD_DRAW(draw);
|
| GrImageTextureAdjuster adjuster(as_IB(image));
|
| @@ -1492,6 +1525,7 @@ void SkGpuDevice::drawProducerNine(const SkDraw& draw, GrTextureProducer* produc
|
|
|
| void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image,
|
| const SkIRect& center, const SkRect& dst, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| if (as_IB(image)->peekTexture()) {
|
| GrImageTextureAdjuster adjuster(as_IB(image));
|
| this->drawProducerNine(draw, &adjuster, center, dst, paint);
|
| @@ -1508,6 +1542,7 @@ void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image,
|
|
|
| void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect& center,
|
| const SkRect& dst, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| if (bitmap.getTexture()) {
|
| GrBitmapTextureAdjuster adjuster(&bitmap);
|
| this->drawProducerNine(draw, &adjuster, center, dst, paint);
|
| @@ -1532,6 +1567,7 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| SkXfermode* xmode,
|
| const uint16_t indices[], int indexCount,
|
| const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| CHECK_SHOULD_DRAW(draw);
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawVertices", fContext);
|
|
|
| @@ -1659,6 +1695,7 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
|
| void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRSXform xform[],
|
| const SkRect texRect[], const SkColor colors[], int count,
|
| SkXfermode::Mode mode, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| if (paint.isAntiAlias()) {
|
| this->INHERITED::drawAtlas(draw, atlas, xform, texRect, colors, count, mode, paint);
|
| return;
|
| @@ -1691,6 +1728,7 @@ void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRS
|
| void SkGpuDevice::drawText(const SkDraw& draw, const void* text,
|
| size_t byteLength, SkScalar x, SkScalar y,
|
| const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| CHECK_SHOULD_DRAW(draw);
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawText", fContext);
|
|
|
| @@ -1708,6 +1746,7 @@ void SkGpuDevice::drawText(const SkDraw& draw, const void* text,
|
| void SkGpuDevice::drawPosText(const SkDraw& draw, const void* text, size_t byteLength,
|
| const SkScalar pos[], int scalarsPerPos,
|
| const SkPoint& offset, const SkPaint& paint) {
|
| + ASSERT_SINGLE_OWNER
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPosText", fContext);
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| @@ -1725,6 +1764,7 @@ 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) {
|
| + ASSERT_SINGLE_OWNER
|
| GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawTextBlob", fContext);
|
| CHECK_SHOULD_DRAW(draw);
|
|
|
| @@ -1741,6 +1781,7 @@ bool SkGpuDevice::onShouldDisableLCD(const SkPaint& paint) const {
|
| }
|
|
|
| void SkGpuDevice::flush() {
|
| + ASSERT_SINGLE_OWNER
|
| DO_DEFERRED_CLEAR();
|
| fRenderTarget->prepareForExternalIO();
|
|
|
| @@ -1754,6 +1795,7 @@ void SkGpuDevice::flush() {
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint*) {
|
| + ASSERT_SINGLE_OWNER
|
| GrSurfaceDesc desc;
|
| desc.fConfig = fRenderTarget->config();
|
| desc.fFlags = kRenderTarget_GrSurfaceFlag;
|
| @@ -1786,6 +1828,7 @@ SkBaseDevice* SkGpuDevice::onCreateDevice(const CreateInfo& cinfo, const SkPaint
|
| }
|
|
|
| SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps& props) {
|
| + ASSERT_SINGLE_OWNER
|
| // TODO: Change the signature of newSurface to take a budgeted parameter.
|
| static const SkSurface::Budgeted kBudgeted = SkSurface::kNo_Budgeted;
|
| return SkSurface::NewRenderTarget(fContext, kBudgeted, info, fRenderTarget->desc().fSampleCnt,
|
| @@ -1794,6 +1837,7 @@ SkSurface* SkGpuDevice::newSurface(const SkImageInfo& info, const SkSurfaceProps
|
|
|
| bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* mainCanvas, const SkPicture* mainPicture,
|
| const SkMatrix* matrix, const SkPaint* paint) {
|
| + ASSERT_SINGLE_OWNER
|
| #ifndef SK_IGNORE_GPU_LAYER_HOISTING
|
| // todo: should handle this natively
|
| if (paint) {
|
| @@ -1867,6 +1911,7 @@ SkImageFilter::Cache* SkGpuDevice::NewImageFilterCache() {
|
| }
|
|
|
| SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
|
| + ASSERT_SINGLE_OWNER
|
| // We always return a transient cache, so it is freed after each
|
| // filter traversal.
|
| return SkGpuDevice::NewImageFilterCache();
|
|
|