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

Side by Side Diff: src/gpu/SkGpuDevice.cpp

Issue 608883003: GrResourceCache2 manages scratch texture. (Closed) Base URL: https://skia.googlesource.com/skia.git@surfimpl
Patch Set: wrap line and delete unneeded friends Created 6 years, 2 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "SkGpuDevice.h" 8 #include "SkGpuDevice.h"
9 9
10 #include "effects/GrBicubicEffect.h" 10 #include "effects/GrBicubicEffect.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 this->clear(SK_ColorTRANSPARENT); \ 68 this->clear(SK_ColorTRANSPARENT); \
69 } \ 69 } \
70 } while (false) \ 70 } while (false) \
71 71
72 /////////////////////////////////////////////////////////////////////////////// 72 ///////////////////////////////////////////////////////////////////////////////
73 73
74 #define CHECK_FOR_ANNOTATION(paint) \ 74 #define CHECK_FOR_ANNOTATION(paint) \
75 do { if (paint.getAnnotation()) { return; } } while (0) 75 do { if (paint.getAnnotation()) { return; } } while (0)
76 76
77 /////////////////////////////////////////////////////////////////////////////// 77 ///////////////////////////////////////////////////////////////////////////////
78 78
robertphillips 2014/09/29 15:25:08 // If 'bitmap' is GrTexture backed, return the bac
bsalomon 2014/09/29 19:58:14 Done.
79 class AutoBitmapTexture : public SkNoncopyable {
80 public:
81 AutoBitmapTexture() {}
79 82
80 class SkGpuDevice::SkAutoCachedTexture : public ::SkNoncopyable { 83 AutoBitmapTexture(GrContext* context,
81 public: 84 const SkBitmap& bitmap,
82 SkAutoCachedTexture() 85 const GrTextureParams* params,
83 : fDevice(NULL) 86 GrTexture** texture) {
84 , fTexture(NULL) { 87 SkASSERT(texture);
88 *texture = this->set(context, bitmap, params);
85 } 89 }
86 90
87 SkAutoCachedTexture(SkGpuDevice* device, 91 GrTexture* set(GrContext* context,
88 const SkBitmap& bitmap, 92 const SkBitmap& bitmap,
89 const GrTextureParams* params, 93 const GrTextureParams* params) {
90 GrTexture** texture) 94 // Either get the texture directly from the bitmap, or else use the cach e and
91 : fDevice(NULL) 95 // remember to unref it.
92 , fTexture(NULL) { 96 if (GrTexture* bmpTexture = bitmap.getTexture()) {
93 SkASSERT(texture); 97 fTexture.reset(NULL);
94 *texture = this->set(device, bitmap, params); 98 return bmpTexture;
95 } 99 } else {
96 100 fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params));
97 ~SkAutoCachedTexture() { 101 return fTexture.get();
98 if (fTexture) {
99 GrUnlockAndUnrefCachedBitmapTexture(fTexture);
100 } 102 }
101 } 103 }
102 104
103 GrTexture* set(SkGpuDevice* device,
104 const SkBitmap& bitmap,
105 const GrTextureParams* params) {
106 if (fTexture) {
107 GrUnlockAndUnrefCachedBitmapTexture(fTexture);
108 fTexture = NULL;
109 }
110 fDevice = device;
111 GrTexture* result = (GrTexture*)bitmap.getTexture();
112 if (NULL == result) {
113 // Cannot return the native texture so look it up in our cache
114 fTexture = GrLockAndRefCachedBitmapTexture(device->context(), bitmap , params);
115 result = fTexture;
116 }
117 return result;
118 }
119
120 private: 105 private:
121 SkGpuDevice* fDevice; 106 SkAutoTUnref<GrTexture> fTexture;
122 GrTexture* fTexture;
123 }; 107 };
124 108
125 /////////////////////////////////////////////////////////////////////////////// 109 ///////////////////////////////////////////////////////////////////////////////
126 110
127 struct GrSkDrawProcs : public SkDrawProcs { 111 struct GrSkDrawProcs : public SkDrawProcs {
128 public: 112 public:
129 GrContext* fContext; 113 GrContext* fContext;
130 GrTextContext* fTextContext; 114 GrTextContext* fTextContext;
131 GrFontScaler* fFontScaler; // cached in the skia glyphcache 115 GrFontScaler* fFontScaler; // cached in the skia glyphcache
132 }; 116 };
(...skipping 12 matching lines...) Expand all
145 129
146 fDrawProcs = NULL; 130 fDrawProcs = NULL;
147 131
148 fContext = SkRef(surface->getContext()); 132 fContext = SkRef(surface->getContext());
149 133
150 fNeedClear = flags & kNeedClear_Flag; 134 fNeedClear = flags & kNeedClear_Flag;
151 135
152 fRenderTarget = SkRef(surface->asRenderTarget()); 136 fRenderTarget = SkRef(surface->asRenderTarget());
153 137
154 SkImageInfo info = surface->surfacePriv().info(); 138 SkImageInfo info = surface->surfacePriv().info();
155 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, 139 SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (info, surface));
156 (info, surface, SkToBool(flags & kCached_Flag))) ;
157 fLegacyBitmap.setInfo(info); 140 fLegacyBitmap.setInfo(info);
158 fLegacyBitmap.setPixelRef(pr)->unref(); 141 fLegacyBitmap.setPixelRef(pr)->unref();
159 142
160 this->setPixelGeometry(props.pixelGeometry()); 143 this->setPixelGeometry(props.pixelGeometry());
161 144
162 bool useDFFonts = !!(flags & kDFFonts_Flag); 145 bool useDFFonts = !!(flags & kDFFonts_Flag);
163 fMainTextContext = fContext->createTextContext(fRenderTarget, this->getLeaky Properties(), useDFFonts); 146 fMainTextContext = fContext->createTextContext(fRenderTarget, this->getLeaky Properties(), useDFFonts);
164 fFallbackTextContext = SkNEW_ARGS(GrBitmapTextContext, (fContext, this->getL eakyProperties())); 147 fFallbackTextContext = SkNEW_ARGS(GrBitmapTextContext, (fContext, this->getL eakyProperties()));
165 } 148 }
166 149
(...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 const SkRect& srcRect, 1270 const SkRect& srcRect,
1288 const GrTextureParams& params, 1271 const GrTextureParams& params,
1289 const SkPaint& paint, 1272 const SkPaint& paint,
1290 SkCanvas::DrawBitmapRectFlags flags, 1273 SkCanvas::DrawBitmapRectFlags flags,
1291 bool bicubic, 1274 bool bicubic,
1292 bool needsTextureDomain) { 1275 bool needsTextureDomain) {
1293 SkASSERT(bitmap.width() <= fContext->getMaxTextureSize() && 1276 SkASSERT(bitmap.width() <= fContext->getMaxTextureSize() &&
1294 bitmap.height() <= fContext->getMaxTextureSize()); 1277 bitmap.height() <= fContext->getMaxTextureSize());
1295 1278
1296 GrTexture* texture; 1279 GrTexture* texture;
1297 SkAutoCachedTexture act(this, bitmap, &params, &texture); 1280 AutoBitmapTexture abt(fContext, bitmap, &params, &texture);
1298 if (NULL == texture) { 1281 if (NULL == texture) {
1299 return; 1282 return;
1300 } 1283 }
1301 1284
1302 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() }; 1285 SkRect dstRect = {0, 0, srcRect.width(), srcRect.height() };
1303 SkRect paintRect; 1286 SkRect paintRect;
1304 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width())); 1287 SkScalar wInv = SkScalarInvert(SkIntToScalar(texture->width()));
1305 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height())); 1288 SkScalar hInv = SkScalarInvert(SkIntToScalar(texture->height()));
1306 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv), 1289 paintRect.setLTRB(SkScalarMul(srcRect.fLeft, wInv),
1307 SkScalarMul(srcRect.fTop, hInv), 1290 SkScalarMul(srcRect.fTop, hInv),
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 SkAutoLockPixels alp(bitmap, !bitmap.getTexture()); 1365 SkAutoLockPixels alp(bitmap, !bitmap.getTexture());
1383 if (!bitmap.getTexture() && !bitmap.readyToDraw()) { 1366 if (!bitmap.getTexture() && !bitmap.readyToDraw()) {
1384 return; 1367 return;
1385 } 1368 }
1386 1369
1387 int w = bitmap.width(); 1370 int w = bitmap.width();
1388 int h = bitmap.height(); 1371 int h = bitmap.height();
1389 1372
1390 GrTexture* texture; 1373 GrTexture* texture;
1391 // draw sprite uses the default texture params 1374 // draw sprite uses the default texture params
1392 SkAutoCachedTexture act(this, bitmap, NULL, &texture); 1375 AutoBitmapTexture abt(fContext, bitmap, NULL, &texture);
1393 1376
1394 SkImageFilter* filter = paint.getImageFilter(); 1377 SkImageFilter* filter = paint.getImageFilter();
1395 // This bitmap will own the filtered result as a texture. 1378 // This bitmap will own the filtered result as a texture.
1396 SkBitmap filteredBitmap; 1379 SkBitmap filteredBitmap;
1397 1380
1398 if (filter) { 1381 if (filter) {
1399 SkIPoint offset = SkIPoint::Make(0, 0); 1382 SkIPoint offset = SkIPoint::Make(0, 0);
1400 SkMatrix matrix(*draw.fMatrix); 1383 SkMatrix matrix(*draw.fMatrix);
1401 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top)); 1384 matrix.postTranslate(SkIntToScalar(-left), SkIntToScalar(-top));
1402 SkIRect clipBounds = SkIRect::MakeWH(bitmap.width(), bitmap.height()); 1385 SkIRect clipBounds = SkIRect::MakeWH(bitmap.width(), bitmap.height());
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1559 } 1542 }
1560 1543
1561 SkAutoLockPixels alp(src, !src.getTexture()); 1544 SkAutoLockPixels alp(src, !src.getTexture());
1562 if (!src.getTexture() && !src.readyToDraw()) { 1545 if (!src.getTexture() && !src.readyToDraw()) {
1563 return false; 1546 return false;
1564 } 1547 }
1565 1548
1566 GrTexture* texture; 1549 GrTexture* texture;
1567 // We assume here that the filter will not attempt to tile the src. Otherwis e, this cache lookup 1550 // We assume here that the filter will not attempt to tile the src. Otherwis e, this cache lookup
1568 // must be pushed upstack. 1551 // must be pushed upstack.
1569 SkAutoCachedTexture act(this, src, NULL, &texture); 1552 AutoBitmapTexture abt(fContext, src, NULL, &texture);
1570 1553
1571 return filter_texture(this, fContext, texture, filter, src.width(), src.heig ht(), ctx, 1554 return filter_texture(this, fContext, texture, filter, src.width(), src.heig ht(), ctx,
1572 result, offset); 1555 result, offset);
1573 } 1556 }
1574 1557
1575 /////////////////////////////////////////////////////////////////////////////// 1558 ///////////////////////////////////////////////////////////////////////////////
1576 1559
1577 // must be in SkCanvas::VertexMode order 1560 // must be in SkCanvas::VertexMode order
1578 static const GrPrimitiveType gVertexMode2PrimitiveType[] = { 1561 static const GrPrimitiveType gVertexMode2PrimitiveType[] = {
1579 kTriangles_GrPrimitiveType, 1562 kTriangles_GrPrimitiveType,
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1790 desc.fHeight = info.height(); 1773 desc.fHeight = info.height();
1791 desc.fSampleCnt = fRenderTarget->numSamples(); 1774 desc.fSampleCnt = fRenderTarget->numSamples();
1792 1775
1793 SkAutoTUnref<GrTexture> texture; 1776 SkAutoTUnref<GrTexture> texture;
1794 // Skia's convention is to only clear a device if it is non-opaque. 1777 // Skia's convention is to only clear a device if it is non-opaque.
1795 unsigned flags = info.isOpaque() ? 0 : kNeedClear_Flag; 1778 unsigned flags = info.isOpaque() ? 0 : kNeedClear_Flag;
1796 1779
1797 #if CACHE_COMPATIBLE_DEVICE_TEXTURES 1780 #if CACHE_COMPATIBLE_DEVICE_TEXTURES
1798 // layers are never draw in repeat modes, so we can request an approx 1781 // layers are never draw in repeat modes, so we can request an approx
1799 // match and ignore any padding. 1782 // match and ignore any padding.
1800 flags |= kCached_Flag;
1801 const GrContext::ScratchTexMatch match = (kSaveLayer_Usage == usage) ? 1783 const GrContext::ScratchTexMatch match = (kSaveLayer_Usage == usage) ?
1802 GrContext::kApprox_ScratchTexMat ch : 1784 GrContext::kApprox_ScratchTexMat ch :
1803 GrContext::kExact_ScratchTexMatc h; 1785 GrContext::kExact_ScratchTexMatc h;
1804 texture.reset(fContext->lockAndRefScratchTexture(desc, match)); 1786 texture.reset(fContext->lockAndRefScratchTexture(desc, match));
1805 #else 1787 #else
1806 texture.reset(fContext->createUncachedTexture(desc, NULL, 0)); 1788 texture.reset(fContext->createUncachedTexture(desc, NULL, 0));
1807 #endif 1789 #endif
1808 if (texture.get()) { 1790 if (texture.get()) {
1809 return SkGpuDevice::Create(texture, SkSurfaceProps(SkSurfaceProps::kLega cyFontHost_InitType), flags); 1791 return SkGpuDevice::Create(texture, SkSurfaceProps(SkSurfaceProps::kLega cyFontHost_InitType), flags);
1810 } else { 1792 } else {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1869 GrLayerHoister::UnlockLayers(fContext->getLayerCache(), atlased, nonAtlased) ; 1851 GrLayerHoister::UnlockLayers(fContext->getLayerCache(), atlased, nonAtlased) ;
1870 1852
1871 return true; 1853 return true;
1872 } 1854 }
1873 1855
1874 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { 1856 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() {
1875 // We always return a transient cache, so it is freed after each 1857 // We always return a transient cache, so it is freed after each
1876 // filter traversal. 1858 // filter traversal.
1877 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); 1859 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize);
1878 } 1860 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698