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

Unified Diff: src/gpu/SkGpuDevice.cpp

Issue 350183006: Move allocation of texture from SkGpuDevice to GrLayerCache (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address code review comments 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.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/SkGpuDevice.cpp
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 861383bf6a03f48b8edeb3488d0f99a16dc05bf9..d34170cba110160aa42446bbfaa9d319c965923b 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1842,6 +1842,10 @@ void SkGpuDevice::EXPERIMENTAL_purge(const SkPicture* picture) {
bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* canvas, const SkPicture* picture) {
+ if (NULL == picture->fPlayback.get()) {
+ return false;
+ }
+
SkPicture::AccelData::Key key = GPUAccelData::ComputeAccelDataKey();
const SkPicture::AccelData* data = picture->EXPERIMENTAL_getAccelData(key);
@@ -1938,60 +1942,50 @@ bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* canvas, const SkPicture* pi
SkPicturePlayback::PlaybackReplacements replacements;
+ // Generate the layer and/or ensure it is locked
for (int i = 0; i < gpuData->numSaveLayers(); ++i) {
if (pullForward[i]) {
GrCachedLayer* layer = fContext->getLayerCache()->findLayerOrCreate(picture, i);
const GPUAccelData::SaveLayerInfo& info = gpuData->saveLayerInfo(i);
- if (NULL != picture->fPlayback.get()) {
- SkPicturePlayback::PlaybackReplacements::ReplacementInfo* layerInfo =
+ SkPicturePlayback::PlaybackReplacements::ReplacementInfo* layerInfo =
replacements.push();
- layerInfo->fStart = info.fSaveLayerOpID;
- layerInfo->fStop = info.fRestoreOpID;
- layerInfo->fPos = info.fOffset;
-
- GrTextureDesc desc;
- desc.fFlags = kRenderTarget_GrTextureFlagBit;
- desc.fWidth = info.fSize.fWidth;
- desc.fHeight = info.fSize.fHeight;
- desc.fConfig = kSkia8888_GrPixelConfig;
- // TODO: need to deal with sample count
-
- bool bNeedsRendering = true;
-
- // This just uses scratch textures and doesn't cache the texture.
- // This can yield a lot of re-rendering
- if (NULL == layer->getTexture()) {
- layer->setTexture(fContext->lockAndRefScratchTexture(desc,
- GrContext::kApprox_ScratchTexMatch));
- if (NULL == layer->getTexture()) {
- continue;
- }
- } else {
- bNeedsRendering = false;
- }
+ layerInfo->fStart = info.fSaveLayerOpID;
+ layerInfo->fStop = info.fRestoreOpID;
+ layerInfo->fPos = info.fOffset;
+
+ GrTextureDesc desc;
+ desc.fFlags = kRenderTarget_GrTextureFlagBit;
+ desc.fWidth = info.fSize.fWidth;
+ desc.fHeight = info.fSize.fHeight;
+ desc.fConfig = kSkia8888_GrPixelConfig;
+ // TODO: need to deal with sample count
+
+ bool needsRendering = !fContext->getLayerCache()->lock(layer, desc);
+ if (NULL == layer->getTexture()) {
+ continue;
+ }
- layerInfo->fBM = SkNEW(SkBitmap);
- wrap_texture(layer->getTexture(), desc.fWidth, desc.fHeight, layerInfo->fBM);
+ layerInfo->fBM = SkNEW(SkBitmap); // fBM is allocated so ReplacementInfo can be POD
+ wrap_texture(layer->getTexture(), desc.fWidth, desc.fHeight, layerInfo->fBM);
- SkASSERT(info.fPaint);
- layerInfo->fPaint = info.fPaint;
+ SkASSERT(info.fPaint);
+ layerInfo->fPaint = info.fPaint;
- if (bNeedsRendering) {
- SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect(
- layer->getTexture()->asRenderTarget()));
+ if (needsRendering) {
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect(
+ layer->getTexture()->asRenderTarget()));
- SkCanvas* canvas = surface->getCanvas();
+ SkCanvas* canvas = surface->getCanvas();
- canvas->setMatrix(info.fCTM);
- canvas->clear(SK_ColorTRANSPARENT);
+ canvas->setMatrix(info.fCTM);
+ canvas->clear(SK_ColorTRANSPARENT);
- picture->fPlayback->setDrawLimits(info.fSaveLayerOpID, info.fRestoreOpID);
- picture->fPlayback->draw(*canvas, NULL);
- picture->fPlayback->setDrawLimits(0, 0);
- canvas->flush();
- }
+ picture->fPlayback->setDrawLimits(info.fSaveLayerOpID, info.fRestoreOpID);
+ picture->fPlayback->draw(*canvas, NULL);
+ picture->fPlayback->setDrawLimits(0, 0);
+ canvas->flush();
}
}
}
@@ -2001,13 +1995,10 @@ bool SkGpuDevice::EXPERIMENTAL_drawPicture(SkCanvas* canvas, const SkPicture* pi
picture->fPlayback->draw(*canvas, NULL);
picture->fPlayback->setReplacements(NULL);
+ // unlock the layers
for (int i = 0; i < gpuData->numSaveLayers(); ++i) {
- GrCachedLayer* layer = fContext->getLayerCache()->findLayerOrCreate(picture, i);
-
- if (NULL != layer->getTexture()) {
- fContext->unlockScratchTexture(layer->getTexture());
- layer->setTexture(NULL);
- }
+ GrCachedLayer* layer = fContext->getLayerCache()->findLayer(picture, i);
+ fContext->getLayerCache()->unlock(layer);
}
return true;
« no previous file with comments | « src/gpu/GrLayerCache.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698