Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: src/gpu/GrLayerCache.cpp

Issue 359953002: Revert of Begin atlasing (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrLayerCache.h ('k') | src/gpu/GrTextStrike.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrLayerCache.cpp
diff --git a/src/gpu/GrLayerCache.cpp b/src/gpu/GrLayerCache.cpp
index 5f657c73420261be07b5275d8c7ac958230c0924..c20d8090621cfc3509a4dbd817a5279930a2416e 100644
--- a/src/gpu/GrLayerCache.cpp
+++ b/src/gpu/GrLayerCache.cpp
@@ -42,14 +42,14 @@
};
GrLayerCache::GrLayerCache(GrContext* context)
- : fContext(context) {
- this->initAtlas();
+ : fContext(context)
+ , fLayerPool(16) { // TODO: may need to increase this later
}
GrLayerCache::~GrLayerCache() {
}
-void GrLayerCache::initAtlas() {
+void GrLayerCache::init() {
static const int kAtlasTextureWidth = 1024;
static const int kAtlasTextureHeight = 1024;
@@ -58,31 +58,19 @@
// The layer cache only gets 1 plot
SkISize textureSize = SkISize::Make(kAtlasTextureWidth, kAtlasTextureHeight);
fAtlas.reset(SkNEW_ARGS(GrAtlas, (fContext->getGpu(), kSkia8888_GrPixelConfig,
- kRenderTarget_GrTextureFlagBit,
textureSize, 1, 1, false)));
}
void GrLayerCache::freeAll() {
- SkTDArray<GrCachedLayer*>& layerArray = fLayerHash.getArray();
- for (int i = 0; i < fLayerHash.count(); ++i) {
- this->unlock(layerArray[i]);
- }
-
fLayerHash.deleteAll();
-
- // The atlas only lets go of its texture when the atlas is deleted.
fAtlas.free();
- // GrLayerCache always assumes an atlas exists so recreate it. The atlas
- // lazily allocates a replacement texture so reallocating a new
- // atlas here won't disrupt a GrContext::contextDestroyed or freeGpuResources.
- // TODO: Make GrLayerCache lazily allocate the atlas manager?
- this->initAtlas();
}
GrCachedLayer* GrLayerCache::createLayer(const SkPicture* picture, int layerID) {
+ GrCachedLayer* layer = fLayerPool.alloc();
+
SkASSERT(picture->uniqueID() != SK_InvalidGenID);
-
- GrCachedLayer* layer = SkNEW_ARGS(GrCachedLayer, (picture->uniqueID(), layerID));
+ layer->init(picture->uniqueID(), layerID);
fLayerHash.insert(PictureLayerKey(picture->uniqueID(), layerID), layer);
return layer;
}
@@ -103,70 +91,19 @@
}
bool GrLayerCache::lock(GrCachedLayer* layer, const GrTextureDesc& desc) {
+ SkASSERT(NULL == layer->getTexture());
- if (NULL != layer->texture()) {
- // This layer is already locked
-#ifdef SK_DEBUG
- if (!layer->rect().isEmpty()) {
- // It claims to be atlased
- SkASSERT(layer->rect().width() == desc.fWidth);
- SkASSERT(layer->rect().height() == desc.fHeight);
- }
-#endif
- return true;
- }
-
-#if USE_ATLAS
- SkIPoint16 loc;
- GrPlot* plot = fAtlas->addToAtlas(&fPlotUsage, desc.fWidth, desc.fHeight, NULL, &loc);
- if (NULL != plot) {
- GrIRect16 bounds = GrIRect16::MakeXYWH(loc.fX, loc.fY,
- SkToS16(desc.fWidth), SkToS16(desc.fHeight));
- layer->setTexture(fAtlas->getTexture(), bounds);
- return false;
- }
-#endif
-
- // This path always uses a new scratch texture and (thus) doesn't cache anything.
+ // This just uses scratch textures and doesn't cache the texture.
// This can yield a lot of re-rendering
- layer->setTexture(fContext->lockAndRefScratchTexture(desc, GrContext::kApprox_ScratchTexMatch),
- GrIRect16::MakeEmpty());
+ layer->setTexture(fContext->lockAndRefScratchTexture(desc, GrContext::kApprox_ScratchTexMatch));
return false;
}
void GrLayerCache::unlock(GrCachedLayer* layer) {
- if (NULL == layer || NULL == layer->texture()) {
+ if (NULL == layer || NULL == layer->getTexture()) {
return;
}
- // The atlas doesn't currently use a scratch texture (and we would have
- // to free up space differently anyways)
- // TODO: unlock atlas space when a recycling rectanizer is available
- if (layer->texture() != fAtlas->getTexture()) {
- fContext->unlockScratchTexture(layer->texture());
- layer->setTexture(NULL, GrIRect16::MakeEmpty());
- }
+ fContext->unlockScratchTexture(layer->getTexture());
+ layer->setTexture(NULL);
}
-
-void GrLayerCache::purge(const SkPicture* picture) {
- // This is somewhat of an abuse of GrTHashTable. We need to find all the
- // layers associated with 'picture' but the usual hash calls only look for
- // exact key matches. This code peeks into the hash table's innards to
- // find all the 'picture'-related layers.
- // TODO: use a different data structure for the layer hash?
- SkTDArray<GrCachedLayer*> toBeRemoved;
-
- const SkTDArray<GrCachedLayer*>& layerArray = fLayerHash.getArray();
- for (int i = 0; i < fLayerHash.count(); ++i) {
- if (picture->uniqueID() == layerArray[i]->pictureID()) {
- *toBeRemoved.append() = layerArray[i];
- }
- }
-
- for (int i = 0; i < toBeRemoved.count(); ++i) {
- this->unlock(toBeRemoved[i]);
-
- PictureLayerKey key(picture->uniqueID(), toBeRemoved[i]->layerID());
- fLayerHash.remove(key, toBeRemoved[i]);
- }
-}
« no previous file with comments | « src/gpu/GrLayerCache.h ('k') | src/gpu/GrTextStrike.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698