| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrBatchAtlas.h" | 8 #include "GrBatchAtlas.h" |
| 9 #include "GrBatchFlushState.h" | 9 #include "GrBatchFlushState.h" |
| 10 #include "GrRectanizer.h" | 10 #include "GrRectanizer.h" |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 , fAtlasGeneration(kInvalidAtlasGeneration + 1) { | 212 , fAtlasGeneration(kInvalidAtlasGeneration + 1) { |
| 213 | 213 |
| 214 int plotWidth = texture->width() / numPlotsX; | 214 int plotWidth = texture->width() / numPlotsX; |
| 215 int plotHeight = texture->height() / numPlotsY; | 215 int plotHeight = texture->height() / numPlotsY; |
| 216 SkASSERT(numPlotsX * numPlotsY <= BulkUseTokenUpdater::kMaxPlots); | 216 SkASSERT(numPlotsX * numPlotsY <= BulkUseTokenUpdater::kMaxPlots); |
| 217 SkASSERT(plotWidth * numPlotsX == texture->width()); | 217 SkASSERT(plotWidth * numPlotsX == texture->width()); |
| 218 SkASSERT(plotHeight * numPlotsY == texture->height()); | 218 SkASSERT(plotHeight * numPlotsY == texture->height()); |
| 219 | 219 |
| 220 SkDEBUGCODE(fNumPlots = numPlotsX * numPlotsY;) | 220 SkDEBUGCODE(fNumPlots = numPlotsX * numPlotsY;) |
| 221 | 221 |
| 222 fTexture->setFromRawPixels(true); |
| 223 fTexture->setException(true); |
| 224 |
| 222 // We currently do not support compressed atlases... | 225 // We currently do not support compressed atlases... |
| 223 SkASSERT(!GrPixelConfigIsCompressed(texture->desc().fConfig)); | 226 SkASSERT(!GrPixelConfigIsCompressed(texture->desc().fConfig)); |
| 224 | 227 |
| 225 // set up allocated plots | 228 // set up allocated plots |
| 226 fPlotArray = new SkAutoTUnref<BatchPlot>[numPlotsX * numPlotsY]; | 229 fPlotArray = new SkAutoTUnref<BatchPlot>[numPlotsX * numPlotsY]; |
| 227 | 230 |
| 228 SkAutoTUnref<BatchPlot>* currPlot = fPlotArray; | 231 SkAutoTUnref<BatchPlot>* currPlot = fPlotArray; |
| 229 for (int y = numPlotsY - 1, r = 0; y >= 0; --y, ++r) { | 232 for (int y = numPlotsY - 1, r = 0; y >= 0; --y, ++r) { |
| 230 for (int x = numPlotsX - 1, c = 0; x >= 0; --x, ++c) { | 233 for (int x = numPlotsX - 1, c = 0; x >= 0; --x, ++c) { |
| 231 uint32_t index = r * numPlotsX + c; | 234 uint32_t index = r * numPlotsX + c; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 fAtlasGeneration++; | 308 fAtlasGeneration++; |
| 306 return true; | 309 return true; |
| 307 } | 310 } |
| 308 | 311 |
| 309 // The least recently used plot hasn't been flushed to the gpu yet, however,
if we have flushed | 312 // The least recently used plot hasn't been flushed to the gpu yet, however,
if we have flushed |
| 310 // it to the batch target than we can reuse it. Our last use token is guara
nteed to be less | 313 // it to the batch target than we can reuse it. Our last use token is guara
nteed to be less |
| 311 // than or equal to the current token. If its 'less than' the current token
, than we can spin | 314 // than or equal to the current token. If its 'less than' the current token
, than we can spin |
| 312 // off the plot (ie let the batch target manage it) and create a new plot in
its place in our | 315 // off the plot (ie let the batch target manage it) and create a new plot in
its place in our |
| 313 // array. If it is equal to the currentToken, then the caller has to flush
draws to the batch | 316 // array. If it is equal to the currentToken, then the caller has to flush
draws to the batch |
| 314 // target so we can spin off the plot | 317 // target so we can spin off the plot |
| 315 if (plot->lastUseToken() == batchTarget->currentToken()) { | 318 if (plot->lastUseToken() == batchTarget->currentToken1()) { |
| 316 return false; | 319 return false; |
| 317 } | 320 } |
| 318 | 321 |
| 319 SkASSERT(plot->lastUseToken() < batchTarget->currentToken()); | 322 SkASSERT(plot->lastUseToken() < batchTarget->currentToken1()); |
| 320 SkASSERT(!batchTarget->hasTokenBeenFlushed(batchTarget->currentToken())); | 323 SkASSERT(!batchTarget->hasTokenBeenFlushed(batchTarget->currentToken1())); |
| 321 | 324 |
| 322 SkASSERT(!plot->unique()); // The GrPlotUpdater should have a ref too | 325 SkASSERT(!plot->unique()); // The GrPlotUpdater should have a ref too |
| 323 | 326 |
| 324 this->processEviction(plot->id()); | 327 this->processEviction(plot->id()); |
| 325 fPlotList.remove(plot); | 328 fPlotList.remove(plot); |
| 326 SkAutoTUnref<BatchPlot>& newPlot = fPlotArray[plot->index()]; | 329 SkAutoTUnref<BatchPlot>& newPlot = fPlotArray[plot->index()]; |
| 327 newPlot.reset(plot->clone()); | 330 newPlot.reset(plot->clone()); |
| 328 | 331 |
| 329 fPlotList.addToHead(newPlot.get()); | 332 fPlotList.addToHead(newPlot.get()); |
| 330 SkASSERT(GrBytesPerPixel(fTexture->desc().fConfig) == newPlot->bpp()); | 333 SkASSERT(GrBytesPerPixel(fTexture->desc().fConfig) == newPlot->bpp()); |
| 331 SkDEBUGCODE(bool verify = )newPlot->addSubImage(width, height, image, loc); | 334 SkDEBUGCODE(bool verify = )newPlot->addSubImage(width, height, image, loc); |
| 332 SkASSERT(verify); | 335 SkASSERT(verify); |
| 333 | 336 |
| 334 // Note that this plot will be uploaded inline with the draws whereas the | 337 // Note that this plot will be uploaded inline with the draws whereas the |
| 335 // one it displaced most likely was uploaded asap. | 338 // one it displaced most likely was uploaded asap. |
| 336 newPlot->setLastUploadToken(batchTarget->currentToken()); | 339 newPlot->setLastUploadToken(batchTarget->currentToken1()); |
| 337 SkAutoTUnref<GrPlotUploader> uploader(new GrPlotUploader(newPlot, fTexture))
; | 340 SkAutoTUnref<GrPlotUploader> uploader(new GrPlotUploader(newPlot, fTexture))
; |
| 338 batchTarget->upload(uploader); | 341 batchTarget->upload(uploader); |
| 339 *id = newPlot->id(); | 342 *id = newPlot->id(); |
| 340 | 343 |
| 341 fAtlasGeneration++; | 344 fAtlasGeneration++; |
| 342 return true; | 345 return true; |
| 343 } | 346 } |
| 344 | 347 |
| 345 bool GrBatchAtlas::hasID(AtlasID id) { | 348 bool GrBatchAtlas::hasID(AtlasID id) { |
| 346 uint32_t index = GetIndexFromID(id); | 349 uint32_t index = GetIndexFromID(id); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 358 | 361 |
| 359 void GrBatchAtlas::setLastUseTokenBulk(const BulkUseTokenUpdater& updater, | 362 void GrBatchAtlas::setLastUseTokenBulk(const BulkUseTokenUpdater& updater, |
| 360 GrBatchToken batchToken) { | 363 GrBatchToken batchToken) { |
| 361 int count = updater.fPlotsToUpdate.count(); | 364 int count = updater.fPlotsToUpdate.count(); |
| 362 for (int i = 0; i < count; i++) { | 365 for (int i = 0; i < count; i++) { |
| 363 BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]]; | 366 BatchPlot* plot = fPlotArray[updater.fPlotsToUpdate[i]]; |
| 364 this->makeMRU(plot); | 367 this->makeMRU(plot); |
| 365 plot->setLastUseToken(batchToken); | 368 plot->setLastUseToken(batchToken); |
| 366 } | 369 } |
| 367 } | 370 } |
| OLD | NEW |