Index: src/gpu/GrLayerAtlas.cpp |
diff --git a/src/gpu/GrLayerAtlas.cpp b/src/gpu/GrLayerAtlas.cpp |
deleted file mode 100644 |
index ccb208a71c23025d807aef6efc45c12271ed20a1..0000000000000000000000000000000000000000 |
--- a/src/gpu/GrLayerAtlas.cpp |
+++ /dev/null |
@@ -1,168 +0,0 @@ |
-/* |
- * Copyright 2010 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "GrGpuResourcePriv.h" |
-#include "GrLayerAtlas.h" |
-#include "GrRectanizer.h" |
-#include "GrTextureProvider.h" |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-GrLayerAtlas::Plot::Plot() |
- : fID(-1) |
- , fRects(nullptr) { |
- fOffset.set(0, 0); |
-} |
- |
-GrLayerAtlas::Plot::~Plot() { |
- delete fRects; |
-} |
- |
-void GrLayerAtlas::Plot::init(int id, int offX, int offY, int width, int height) { |
- fID = id; |
- fRects = GrRectanizer::Factory(width, height); |
- fOffset.set(offX * width, offY * height); |
-} |
- |
-bool GrLayerAtlas::Plot::allocateRect(int width, int height, SkIPoint16* loc) { |
- if (!fRects->addRect(width, height, loc)) { |
- return false; |
- } |
- |
- loc->fX += fOffset.fX; |
- loc->fY += fOffset.fY; |
- return true; |
-} |
- |
-void GrLayerAtlas::Plot::reset() { |
- SkASSERT(fRects); |
- fRects->reset(); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-GR_DECLARE_STATIC_UNIQUE_KEY(gLayerAtlasKey); |
-static const GrUniqueKey& get_layer_atlas_key() { |
- GR_DEFINE_STATIC_UNIQUE_KEY(gLayerAtlasKey); |
- return gLayerAtlasKey; |
-} |
- |
-bool GrLayerAtlas::reattachBackingTexture() { |
- SkASSERT(!fTexture); |
- |
- fTexture.reset(fTexProvider->findAndRefTextureByUniqueKey(get_layer_atlas_key())); |
- return fTexture != nullptr; |
-} |
- |
-void GrLayerAtlas::createBackingTexture() { |
- SkASSERT(!fTexture); |
- |
- GrSurfaceDesc desc; |
- desc.fFlags = fFlags; |
- desc.fWidth = fBackingTextureSize.width(); |
- desc.fHeight = fBackingTextureSize.height(); |
- desc.fConfig = fPixelConfig; |
- |
- fTexture.reset(fTexProvider->createTexture(desc, SkBudgeted::kYes, nullptr, 0)); |
- |
- fTexture->resourcePriv().setUniqueKey(get_layer_atlas_key()); |
-} |
- |
-GrLayerAtlas::GrLayerAtlas(GrTextureProvider* texProvider, GrPixelConfig config, |
- GrSurfaceFlags flags, |
- const SkISize& backingTextureSize, |
- int numPlotsX, int numPlotsY) { |
- fTexProvider = texProvider; |
- fPixelConfig = config; |
- fFlags = flags; |
- fBackingTextureSize = backingTextureSize; |
- |
- int textureWidth = fBackingTextureSize.width(); |
- int textureHeight = fBackingTextureSize.height(); |
- |
- int plotWidth = textureWidth / numPlotsX; |
- int plotHeight = textureHeight / numPlotsY; |
- |
- SkASSERT(plotWidth * numPlotsX == textureWidth); |
- SkASSERT(plotHeight * numPlotsY == textureHeight); |
- |
- // We currently do not support compressed atlases... |
- SkASSERT(!GrPixelConfigIsCompressed(config)); |
- |
- // set up allocated plots |
- fPlotArray = new Plot[numPlotsX * numPlotsY]; |
- |
- Plot* currPlot = fPlotArray; |
- for (int y = numPlotsY-1; y >= 0; --y) { |
- for (int x = numPlotsX-1; x >= 0; --x) { |
- currPlot->init(y*numPlotsX+x, x, y, plotWidth, plotHeight); |
- |
- // build LRU list |
- fPlotList.addToHead(currPlot); |
- ++currPlot; |
- } |
- } |
-} |
- |
-void GrLayerAtlas::resetPlots() { |
- PlotIter iter; |
- for (Plot* plot = iter.init(fPlotList, PlotIter::kHead_IterStart); plot; plot = iter.next()) { |
- plot->reset(); |
- } |
-} |
- |
-GrLayerAtlas::~GrLayerAtlas() { |
- delete[] fPlotArray; |
-} |
- |
-void GrLayerAtlas::makeMRU(Plot* plot) { |
- if (fPlotList.head() == plot) { |
- return; |
- } |
- |
- fPlotList.remove(plot); |
- fPlotList.addToHead(plot); |
-}; |
- |
-GrLayerAtlas::Plot* GrLayerAtlas::addToAtlas(ClientPlotUsage* usage, |
- int width, int height, SkIPoint16* loc) { |
- // Iterate through the plots currently being used by this client and see if we can find a hole. |
- // The last one was most recently added and probably most empty. |
- // We want to consolidate the uses from individual clients to the same plot(s) so that |
- // when a specific client goes away they are more likely to completely empty a plot. |
- for (int i = usage->numPlots()-1; i >= 0; --i) { |
- Plot* plot = usage->plot(i); |
- if (plot->allocateRect(width, height, loc)) { |
- this->makeMRU(plot); |
- return plot; |
- } |
- } |
- |
- // before we get a new plot, make sure we have a backing texture |
- if (nullptr == fTexture) { |
- this->createBackingTexture(); |
- if (nullptr == fTexture) { |
- return nullptr; |
- } |
- } |
- |
- // Now look through all allocated plots for one we can share, in MRU order |
- // TODO: its seems like traversing from emptiest to fullest would make more sense |
- PlotList::Iter plotIter; |
- plotIter.init(fPlotList, PlotList::Iter::kHead_IterStart); |
- Plot* plot; |
- while ((plot = plotIter.get())) { |
- if (plot->allocateRect(width, height, loc)) { |
- this->makeMRU(plot); |
- // new plot for atlas, put at end of array |
- usage->appendPlot(plot); |
- return plot; |
- } |
- plotIter.next(); |
- } |
- |
- // If the above fails, then the current plot list has no room |
- return nullptr; |
-} |