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

Unified Diff: src/gpu/GrClipMaskManager.cpp

Issue 324963005: Split caching from allocation in GrClipMaskManager (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Code review changes 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/GrClipMaskManager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrClipMaskManager.cpp
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index 071b9d31916cd4207b4d559d1542f5f702bd20c6..a878894c59949410cf2c0522e766657f23c06336 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -502,36 +502,39 @@ void GrClipMaskManager::getTemp(int width, int height, GrAutoScratchTexture* tem
}
////////////////////////////////////////////////////////////////////////////////
-// Handles caching & allocation (if needed) of a clip alpha-mask texture for both the sw-upload
-// or gpu-rendered cases. Returns true if there is no more work to be done (i.e., we got a cache
-// hit)
-bool GrClipMaskManager::getMaskTexture(int32_t elementsGenID,
- const SkIRect& clipSpaceIBounds,
- GrTexture** result,
- bool willUpload) {
+// Return the texture currently in the cache if it exists. Otherwise, return NULL
+GrTexture* GrClipMaskManager::getCachedMaskTexture(int32_t elementsGenID,
+ const SkIRect& clipSpaceIBounds) {
bool cached = fAACache.canReuse(elementsGenID, clipSpaceIBounds);
if (!cached) {
+ return NULL;
+ }
- // There isn't a suitable entry in the cache so we create a new texture to store the mask.
- // Since we are setting up the cache we know the last lookup was a miss. Free up the
- // currently cached mask so it can be reused.
- fAACache.reset();
+ return fAACache.getLastMask();
+}
- GrTextureDesc desc;
- desc.fFlags = willUpload ? kNone_GrTextureFlags : kRenderTarget_GrTextureFlagBit;
- desc.fWidth = clipSpaceIBounds.width();
- desc.fHeight = clipSpaceIBounds.height();
- desc.fConfig = kRGBA_8888_GrPixelConfig;
- if (willUpload || this->getContext()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) {
- // We would always like A8 but it isn't supported on all platforms
- desc.fConfig = kAlpha_8_GrPixelConfig;
- }
+////////////////////////////////////////////////////////////////////////////////
+// Allocate a texture in the texture cache. This function returns the texture
+// allocated (or NULL on error).
+GrTexture* GrClipMaskManager::allocMaskTexture(int32_t elementsGenID,
+ const SkIRect& clipSpaceIBounds,
+ bool willUpload) {
+ // Since we are setting up the cache we should free up the
+ // currently cached mask so it can be reused.
+ fAACache.reset();
- fAACache.acquireMask(elementsGenID, desc, clipSpaceIBounds);
+ GrTextureDesc desc;
+ desc.fFlags = willUpload ? kNone_GrTextureFlags : kRenderTarget_GrTextureFlagBit;
+ desc.fWidth = clipSpaceIBounds.width();
+ desc.fHeight = clipSpaceIBounds.height();
+ desc.fConfig = kRGBA_8888_GrPixelConfig;
+ if (willUpload || this->getContext()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) {
+ // We would always like A8 but it isn't supported on all platforms
+ desc.fConfig = kAlpha_8_GrPixelConfig;
}
- *result = fAACache.getLastMask();
- return cached;
+ fAACache.acquireMask(elementsGenID, desc, clipSpaceIBounds);
+ return fAACache.getLastMask();
}
////////////////////////////////////////////////////////////////////////////////
@@ -542,12 +545,15 @@ GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
const SkIRect& clipSpaceIBounds) {
SkASSERT(kNone_ClipMaskType == fCurrClipMaskType);
- GrTexture* result;
- if (this->getMaskTexture(elementsGenID, clipSpaceIBounds, &result, false)) {
+ // First, check for cached texture
+ GrTexture* result = this->getCachedMaskTexture(elementsGenID, clipSpaceIBounds);
+ if (NULL != result) {
fCurrClipMaskType = kAlpha_ClipMaskType;
return result;
}
+ // There's no texture in the cache. Let's try to allocate it then.
+ result = this->allocMaskTexture(elementsGenID, clipSpaceIBounds, false);
if (NULL == result) {
fAACache.reset();
return NULL;
@@ -1039,16 +1045,11 @@ GrTexture* GrClipMaskManager::createSoftwareClipMask(int32_t elementsGenID,
const SkIRect& clipSpaceIBounds) {
SkASSERT(kNone_ClipMaskType == fCurrClipMaskType);
- GrTexture* result;
- if (this->getMaskTexture(elementsGenID, clipSpaceIBounds, &result, true)) {
+ GrTexture* result = this->getCachedMaskTexture(elementsGenID, clipSpaceIBounds);
+ if (NULL != result) {
return result;
}
- if (NULL == result) {
- fAACache.reset();
- return NULL;
- }
-
// The mask texture may be larger than necessary. We round out the clip space bounds and pin
// the top left corner of the resulting rect to the top left of the texture.
SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpaceIBounds.height());
@@ -1099,6 +1100,12 @@ GrTexture* GrClipMaskManager::createSoftwareClipMask(int32_t elementsGenID,
}
}
+ // Allocate clip mask texture
+ result = this->allocMaskTexture(elementsGenID, clipSpaceIBounds, true);
+ if (NULL == result) {
+ fAACache.reset();
+ return NULL;
+ }
helper.toTexture(result);
fCurrClipMaskType = kAlpha_ClipMaskType;
« no previous file with comments | « src/gpu/GrClipMaskManager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698