GrDrawOpAtlas.cpp revision c3d706f7ce87cdd94158d2266ab2fe2f18f5020a
15bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt/* 25bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt * Copyright 2015 Google Inc. 35bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt * 45bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt * Use of this source code is governed by a BSD-style license that can be 55bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt * found in the LICENSE file. 65bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt */ 75bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 85bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt#include "GrBatchAtlas.h" 97539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon#include "GrBatchFlushState.h" 105bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt#include "GrRectanizer.h" 115bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt#include "GrTracing.h" 125bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 135df175ee71164dce97758564f308ab301bfe393ajoshualitt//////////////////////////////////////////////////////////////////////////////// 145bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 155df175ee71164dce97758564f308ab301bfe393ajoshualittGrBatchAtlas::BatchPlot::BatchPlot(int index, uint64_t genID, int offX, int offY, int width, 16c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth int height, GrPixelConfig config) 17c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth : fLastUpload(GrBatchDrawToken::AlreadyFlushedToken()) 18342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon , fLastUse(GrBatchDrawToken::AlreadyFlushedToken()) 195df175ee71164dce97758564f308ab301bfe393ajoshualitt , fIndex(index) 205df175ee71164dce97758564f308ab301bfe393ajoshualitt , fGenID(genID) 215df175ee71164dce97758564f308ab301bfe393ajoshualitt , fID(CreateId(fIndex, fGenID)) 22c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth , fData(nullptr) 235df175ee71164dce97758564f308ab301bfe393ajoshualitt , fWidth(width) 245df175ee71164dce97758564f308ab301bfe393ajoshualitt , fHeight(height) 255df175ee71164dce97758564f308ab301bfe393ajoshualitt , fX(offX) 265df175ee71164dce97758564f308ab301bfe393ajoshualitt , fY(offY) 275df175ee71164dce97758564f308ab301bfe393ajoshualitt , fRects(nullptr) 285df175ee71164dce97758564f308ab301bfe393ajoshualitt , fOffset(SkIPoint16::Make(fX * fWidth, fY * fHeight)) 295df175ee71164dce97758564f308ab301bfe393ajoshualitt , fConfig(config) 305df175ee71164dce97758564f308ab301bfe393ajoshualitt , fBytesPerPixel(GrBytesPerPixel(config)) 315df175ee71164dce97758564f308ab301bfe393ajoshualitt#ifdef SK_DEBUG 325df175ee71164dce97758564f308ab301bfe393ajoshualitt , fDirty(false) 335df175ee71164dce97758564f308ab301bfe393ajoshualitt#endif 345df175ee71164dce97758564f308ab301bfe393ajoshualitt{ 355df175ee71164dce97758564f308ab301bfe393ajoshualitt fDirtyRect.setEmpty(); 365df175ee71164dce97758564f308ab301bfe393ajoshualitt} 375bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 385df175ee71164dce97758564f308ab301bfe393ajoshualittGrBatchAtlas::BatchPlot::~BatchPlot() { 39c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth sk_free(fData); 405df175ee71164dce97758564f308ab301bfe393ajoshualitt delete fRects; 415df175ee71164dce97758564f308ab301bfe393ajoshualitt} 422b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips 435df175ee71164dce97758564f308ab301bfe393ajoshualittbool GrBatchAtlas::BatchPlot::addSubImage(int width, int height, const void* image, 445df175ee71164dce97758564f308ab301bfe393ajoshualitt SkIPoint16* loc) { 455df175ee71164dce97758564f308ab301bfe393ajoshualitt SkASSERT(width <= fWidth && height <= fHeight); 465bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 475df175ee71164dce97758564f308ab301bfe393ajoshualitt if (!fRects) { 485df175ee71164dce97758564f308ab301bfe393ajoshualitt fRects = GrRectanizer::Factory(fWidth, fHeight); 495bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 505bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 515df175ee71164dce97758564f308ab301bfe393ajoshualitt if (!fRects->addRect(width, height, loc)) { 525df175ee71164dce97758564f308ab301bfe393ajoshualitt return false; 53b4c507e03386f2105e33f0c4c09b4a9d0a23196djoshualitt } 545bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 55c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth if (!fData) { 56c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth fData = reinterpret_cast<unsigned char*>(sk_calloc_throw(fBytesPerPixel * fWidth * 57c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth fHeight)); 585df175ee71164dce97758564f308ab301bfe393ajoshualitt } 595df175ee71164dce97758564f308ab301bfe393ajoshualitt size_t rowBytes = width * fBytesPerPixel; 605df175ee71164dce97758564f308ab301bfe393ajoshualitt const unsigned char* imagePtr = (const unsigned char*)image; 615df175ee71164dce97758564f308ab301bfe393ajoshualitt // point ourselves at the right starting spot 62c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth unsigned char* dataPtr = fData; 635df175ee71164dce97758564f308ab301bfe393ajoshualitt dataPtr += fBytesPerPixel * fWidth * loc->fY; 645df175ee71164dce97758564f308ab301bfe393ajoshualitt dataPtr += fBytesPerPixel * loc->fX; 655df175ee71164dce97758564f308ab301bfe393ajoshualitt // copy into the data buffer 665df175ee71164dce97758564f308ab301bfe393ajoshualitt for (int i = 0; i < height; ++i) { 675df175ee71164dce97758564f308ab301bfe393ajoshualitt memcpy(dataPtr, imagePtr, rowBytes); 685df175ee71164dce97758564f308ab301bfe393ajoshualitt dataPtr += fBytesPerPixel * fWidth; 695df175ee71164dce97758564f308ab301bfe393ajoshualitt imagePtr += rowBytes; 705bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 715bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 725df175ee71164dce97758564f308ab301bfe393ajoshualitt fDirtyRect.join(loc->fX, loc->fY, loc->fX + width, loc->fY + height); 735bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 745df175ee71164dce97758564f308ab301bfe393ajoshualitt loc->fX += fOffset.fX; 755df175ee71164dce97758564f308ab301bfe393ajoshualitt loc->fY += fOffset.fY; 765df175ee71164dce97758564f308ab301bfe393ajoshualitt SkDEBUGCODE(fDirty = true;) 775bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 785df175ee71164dce97758564f308ab301bfe393ajoshualitt return true; 795df175ee71164dce97758564f308ab301bfe393ajoshualitt} 805bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 81342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomonvoid GrBatchAtlas::BatchPlot::uploadToTexture(GrDrawBatch::WritePixelsFn& writePixels, 825df175ee71164dce97758564f308ab301bfe393ajoshualitt GrTexture* texture) { 835df175ee71164dce97758564f308ab301bfe393ajoshualitt // We should only be issuing uploads if we are in fact dirty 84c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth SkASSERT(fDirty && fData && texture); 855df175ee71164dce97758564f308ab301bfe393ajoshualitt TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), "GrBatchPlot::uploadToTexture"); 865df175ee71164dce97758564f308ab301bfe393ajoshualitt size_t rowBytes = fBytesPerPixel * fWidth; 87c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth const unsigned char* dataPtr = fData; 88c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth dataPtr += rowBytes * fDirtyRect.fTop; 89c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth dataPtr += fBytesPerPixel * fDirtyRect.fLeft; 90c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth writePixels(texture, fOffset.fX + fDirtyRect.fLeft, fOffset.fY + fDirtyRect.fTop, 91c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth fDirtyRect.width(), fDirtyRect.height(), fConfig, dataPtr, rowBytes); 925df175ee71164dce97758564f308ab301bfe393ajoshualitt fDirtyRect.setEmpty(); 935df175ee71164dce97758564f308ab301bfe393ajoshualitt SkDEBUGCODE(fDirty = false;) 945df175ee71164dce97758564f308ab301bfe393ajoshualitt} 955bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 965df175ee71164dce97758564f308ab301bfe393ajoshualittvoid GrBatchAtlas::BatchPlot::resetRects() { 975df175ee71164dce97758564f308ab301bfe393ajoshualitt if (fRects) { 985df175ee71164dce97758564f308ab301bfe393ajoshualitt fRects->reset(); 995bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1005bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1015df175ee71164dce97758564f308ab301bfe393ajoshualitt fGenID++; 1025df175ee71164dce97758564f308ab301bfe393ajoshualitt fID = CreateId(fIndex, fGenID); 1032b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips 1045df175ee71164dce97758564f308ab301bfe393ajoshualitt // zero out the plot 105c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth if (fData) { 106c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth sk_bzero(fData, fBytesPerPixel * fWidth * fHeight); 1075bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1085bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1095df175ee71164dce97758564f308ab301bfe393ajoshualitt fDirtyRect.setEmpty(); 1105df175ee71164dce97758564f308ab301bfe393ajoshualitt SkDEBUGCODE(fDirty = false;) 1115df175ee71164dce97758564f308ab301bfe393ajoshualitt} 1125bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1135bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt/////////////////////////////////////////////////////////////////////////////// 1145bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 115c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverthGrBatchAtlas::GrBatchAtlas(GrTexture* texture, int numPlotsX, int numPlotsY) 1165bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt : fTexture(texture) 1177c3a2f834e0ba3f11a3129d5348b393efcc9b0e1joshualitt , fAtlasGeneration(kInvalidAtlasGeneration + 1) { 1182b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips 1192b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips int plotWidth = texture->width() / numPlotsX; 1202b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips int plotHeight = texture->height() / numPlotsY; 1212b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(numPlotsX * numPlotsY <= BulkUseTokenUpdater::kMaxPlots); 1222b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(plotWidth * numPlotsX == texture->width()); 1232b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(plotHeight * numPlotsY == texture->height()); 1242b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips 1252b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkDEBUGCODE(fNumPlots = numPlotsX * numPlotsY;) 1265bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1275bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // We currently do not support compressed atlases... 1285bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkASSERT(!GrPixelConfigIsCompressed(texture->desc().fConfig)); 1295bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1305bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // set up allocated plots 1312b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips fPlotArray = new SkAutoTUnref<BatchPlot>[numPlotsX * numPlotsY]; 1325bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1335bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkAutoTUnref<BatchPlot>* currPlot = fPlotArray; 1342b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips for (int y = numPlotsY - 1, r = 0; y >= 0; --y, ++r) { 1352b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips for (int x = numPlotsX - 1, c = 0; x >= 0; --x, ++c) { 1362b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips uint32_t index = r * numPlotsX + c; 1372b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips currPlot->reset(new BatchPlot(index, 1, x, y, plotWidth, plotHeight, 138c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth texture->desc().fConfig)); 1395bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1405bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // build LRU list 1415bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt fPlotList.addToHead(currPlot->get()); 1425bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt ++currPlot; 1435bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1445bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1455bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt} 1465bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1475bf99f1ca8f30287803b594d06c60a7b6796ad45joshualittGrBatchAtlas::~GrBatchAtlas() { 1485bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkSafeUnref(fTexture); 149385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary delete[] fPlotArray; 1505bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt} 1515bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1525bf99f1ca8f30287803b594d06c60a7b6796ad45joshualittvoid GrBatchAtlas::processEviction(AtlasID id) { 1535bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt for (int i = 0; i < fEvictionCallbacks.count(); i++) { 1545bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt (*fEvictionCallbacks[i].fFunc)(id, fEvictionCallbacks[i].fData); 1555bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1565bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt} 1575bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1587539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomoninline void GrBatchAtlas::updatePlot(GrDrawBatch::Target* target, AtlasID* id, BatchPlot* plot) { 1595bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt this->makeMRU(plot); 1605bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1615bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // If our most recent upload has already occurred then we have to insert a new 1625bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // upload. Otherwise, we already have a scheduled upload that hasn't yet ocurred. 1635bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // This new update will piggy back on that previously scheduled update. 164342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon if (target->hasDrawBeenFlushed(plot->lastUploadToken())) { 165c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth // With c+14 we could move sk_sp into lamba to only ref once. 166342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon sk_sp<BatchPlot> plotsp(SkRef(plot)); 167342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon GrTexture* texture = fTexture; 168342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon GrBatchDrawToken lastUploadToken = target->addAsapUpload( 169c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth [plotsp, texture] (GrDrawBatch::WritePixelsFn& writePixels) { 170c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth plotsp->uploadToTexture(writePixels, texture); 171342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon } 172342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon ); 173342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon plot->setLastUploadToken(lastUploadToken); 1745bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1755bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt *id = plot->id(); 1765bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt} 1775bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 178342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomonbool GrBatchAtlas::addToAtlas(AtlasID* id, GrDrawBatch::Target* target, 1795bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt int width, int height, const void* image, SkIPoint16* loc) { 1805bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // We should already have a texture, TODO clean this up 1812b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(fTexture); 1825bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1835bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // now look through all allocated plots for one we can share, in Most Recently Refed order 1845bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt GrBatchPlotList::Iter plotIter; 1855bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt plotIter.init(fPlotList, GrBatchPlotList::Iter::kHead_IterStart); 1865bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt BatchPlot* plot; 1875bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt while ((plot = plotIter.get())) { 1882b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(GrBytesPerPixel(fTexture->desc().fConfig) == plot->bpp()); 1892b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips if (plot->addSubImage(width, height, image, loc)) { 190342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon this->updatePlot(target, id, plot); 1915bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt return true; 1925bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1935bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt plotIter.next(); 1945bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 1955bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 1965bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // If the above fails, then see if the least recently refed plot has already been flushed to the 1975bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt // gpu 1982b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips plot = fPlotList.tail(); 1995bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkASSERT(plot); 200342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon if (target->hasDrawBeenFlushed(plot->lastUseToken())) { 2015bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt this->processEviction(plot->id()); 2025bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt plot->resetRects(); 2032b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(GrBytesPerPixel(fTexture->desc().fConfig) == plot->bpp()); 2042b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkDEBUGCODE(bool verify = )plot->addSubImage(width, height, image, loc); 2055bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkASSERT(verify); 206342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon this->updatePlot(target, id, plot); 2077c3a2f834e0ba3f11a3129d5348b393efcc9b0e1joshualitt fAtlasGeneration++; 2085bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt return true; 2095bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 2105bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 211342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon // If this plot has been used in a draw that is currently being prepared by a batch, then we 212342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon // have to fail. This gives the batch a chance to enqueue the draw, and call back into this 213342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon // function. When that draw is enqueued, the draw token advances, and the subsequent call will 214342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon // continue past this branch and prepare an inline upload that will occur after the enqueued 215342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon // draw which references the plot's pre-upload content. 216342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon if (plot->lastUseToken() == target->nextDrawToken()) { 2175bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt return false; 2185bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt } 2195bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 2202b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(!plot->unique()); // The GrPlotUpdater should have a ref too 2215bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 2225bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt this->processEviction(plot->id()); 2235bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt fPlotList.remove(plot); 2245bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkAutoTUnref<BatchPlot>& newPlot = fPlotArray[plot->index()]; 2252b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips newPlot.reset(plot->clone()); 2265bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt 2275bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt fPlotList.addToHead(newPlot.get()); 2282b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkASSERT(GrBytesPerPixel(fTexture->desc().fConfig) == newPlot->bpp()); 2292b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips SkDEBUGCODE(bool verify = )newPlot->addSubImage(width, height, image, loc); 2305bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt SkASSERT(verify); 2312b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips 2321f0e350af690044b2ba807893ac470800f8914a2robertphillips // Note that this plot will be uploaded inline with the draws whereas the 2331f0e350af690044b2ba807893ac470800f8914a2robertphillips // one it displaced most likely was uploaded asap. 234342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon // With c+14 we could move sk_sp into lamba to only ref once. 235342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon sk_sp<BatchPlot> plotsp(SkRef(newPlot.get())); 236342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon GrTexture* texture = fTexture; 237342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon GrBatchDrawToken lastUploadToken = target->addInlineUpload( 238c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth [plotsp, texture] (GrDrawBatch::WritePixelsFn& writePixels) { 239c3d706f7ce87cdd94158d2266ab2fe2f18f5020ajvanverth plotsp->uploadToTexture(writePixels, texture); 240342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon } 241342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon ); 242342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon newPlot->setLastUploadToken(lastUploadToken); 243342bfc25de5b0452b1551bf9db4bf45eac7718b2bsalomon 2445bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt *id = newPlot->id(); 2452b0536f37aa8915b6f58dae0b88b18023cb04d17robertphillips 2467c3a2f834e0ba3f11a3129d5348b393efcc9b0e1joshualitt fAtlasGeneration++; 2475bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt return true; 2485bf99f1ca8f30287803b594d06c60a7b6796ad45joshualitt} 249