OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "GrContext.h" | 9 #include "GrContext.h" |
10 | 10 |
11 #include "GrAARectRenderer.h" | 11 #include "GrAARectRenderer.h" |
12 #include "GrBufferAllocPool.h" | 12 #include "GrBufferAllocPool.h" |
13 #include "GrDefaultGeoProcFactory.h" | 13 #include "GrDefaultGeoProcFactory.h" |
14 #include "GrFontCache.h" | 14 #include "GrFontCache.h" |
15 #include "GrGpuResource.h" | 15 #include "GrGpuResource.h" |
16 #include "GrGpuResourceCacheAccess.h" | 16 #include "GrGpuResourceCacheAccess.h" |
17 #include "GrDistanceFieldTextContext.h" | 17 #include "GrDistanceFieldTextContext.h" |
18 #include "GrDrawTargetCaps.h" | 18 #include "GrDrawTargetCaps.h" |
19 #include "GrGpu.h" | 19 #include "GrGpu.h" |
20 #include "GrIndexBuffer.h" | 20 #include "GrIndexBuffer.h" |
21 #include "GrInOrderDrawBuffer.h" | 21 #include "GrInOrderDrawBuffer.h" |
22 #include "GrLayerCache.h" | 22 #include "GrLayerCache.h" |
23 #include "GrOvalRenderer.h" | 23 #include "GrOvalRenderer.h" |
24 #include "GrPathRenderer.h" | 24 #include "GrPathRenderer.h" |
25 #include "GrPathUtils.h" | 25 #include "GrPathUtils.h" |
26 #include "GrResourceCache2.h" | 26 #include "GrResourceCache.h" |
27 #include "GrSoftwarePathRenderer.h" | 27 #include "GrSoftwarePathRenderer.h" |
28 #include "GrStencilAndCoverTextContext.h" | 28 #include "GrStencilAndCoverTextContext.h" |
29 #include "GrStrokeInfo.h" | 29 #include "GrStrokeInfo.h" |
30 #include "GrSurfacePriv.h" | 30 #include "GrSurfacePriv.h" |
31 #include "GrTexturePriv.h" | 31 #include "GrTexturePriv.h" |
32 #include "GrTraceMarker.h" | 32 #include "GrTraceMarker.h" |
33 #include "GrTracing.h" | 33 #include "GrTracing.h" |
34 #include "SkDashPathPriv.h" | 34 #include "SkDashPathPriv.h" |
35 #include "SkConfig8888.h" | 35 #include "SkConfig8888.h" |
36 #include "SkGr.h" | 36 #include "SkGr.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 context->unref(); | 81 context->unref(); |
82 return NULL; | 82 return NULL; |
83 } | 83 } |
84 } | 84 } |
85 | 85 |
86 GrContext::GrContext(const Options& opts) : fOptions(opts) { | 86 GrContext::GrContext(const Options& opts) : fOptions(opts) { |
87 fGpu = NULL; | 87 fGpu = NULL; |
88 fClip = NULL; | 88 fClip = NULL; |
89 fPathRendererChain = NULL; | 89 fPathRendererChain = NULL; |
90 fSoftwarePathRenderer = NULL; | 90 fSoftwarePathRenderer = NULL; |
91 fResourceCache2 = NULL; | 91 fResourceCache = NULL; |
92 fFontCache = NULL; | 92 fFontCache = NULL; |
93 fDrawBuffer = NULL; | 93 fDrawBuffer = NULL; |
94 fDrawBufferVBAllocPool = NULL; | 94 fDrawBufferVBAllocPool = NULL; |
95 fDrawBufferIBAllocPool = NULL; | 95 fDrawBufferIBAllocPool = NULL; |
96 fFlushToReduceCacheSize = false; | 96 fFlushToReduceCacheSize = false; |
97 fAARectRenderer = NULL; | 97 fAARectRenderer = NULL; |
98 fOvalRenderer = NULL; | 98 fOvalRenderer = NULL; |
99 fMaxTextureSizeOverride = 1 << 20; | 99 fMaxTextureSizeOverride = 1 << 20; |
100 } | 100 } |
101 | 101 |
102 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { | 102 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { |
103 SkASSERT(NULL == fGpu); | 103 SkASSERT(NULL == fGpu); |
104 | 104 |
105 fGpu = GrGpu::Create(backend, backendContext, this); | 105 fGpu = GrGpu::Create(backend, backendContext, this); |
106 if (NULL == fGpu) { | 106 if (NULL == fGpu) { |
107 return false; | 107 return false; |
108 } | 108 } |
109 this->initCommon(); | 109 this->initCommon(); |
110 return true; | 110 return true; |
111 } | 111 } |
112 | 112 |
113 void GrContext::initCommon() { | 113 void GrContext::initCommon() { |
114 fResourceCache2 = SkNEW(GrResourceCache2); | 114 fResourceCache = SkNEW(GrResourceCache); |
115 fResourceCache2->setOverBudgetCallback(OverBudgetCB, this); | 115 fResourceCache->setOverBudgetCallback(OverBudgetCB, this); |
116 | 116 |
117 fFontCache = SkNEW_ARGS(GrFontCache, (fGpu)); | 117 fFontCache = SkNEW_ARGS(GrFontCache, (fGpu)); |
118 | 118 |
119 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); | 119 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); |
120 | 120 |
121 fAARectRenderer = SkNEW_ARGS(GrAARectRenderer, (fGpu)); | 121 fAARectRenderer = SkNEW_ARGS(GrAARectRenderer, (fGpu)); |
122 fOvalRenderer = SkNEW_ARGS(GrOvalRenderer, (fGpu)); | 122 fOvalRenderer = SkNEW_ARGS(GrOvalRenderer, (fGpu)); |
123 | 123 |
124 fDidTestPMConversions = false; | 124 fDidTestPMConversions = false; |
125 | 125 |
126 this->setupDrawBuffer(); | 126 this->setupDrawBuffer(); |
127 } | 127 } |
128 | 128 |
129 GrContext::~GrContext() { | 129 GrContext::~GrContext() { |
130 if (NULL == fGpu) { | 130 if (NULL == fGpu) { |
131 return; | 131 return; |
132 } | 132 } |
133 | 133 |
134 this->flush(); | 134 this->flush(); |
135 | 135 |
136 for (int i = 0; i < fCleanUpData.count(); ++i) { | 136 for (int i = 0; i < fCleanUpData.count(); ++i) { |
137 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); | 137 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); |
138 } | 138 } |
139 | 139 |
140 SkDELETE(fResourceCache2); | 140 SkDELETE(fResourceCache); |
141 SkDELETE(fFontCache); | 141 SkDELETE(fFontCache); |
142 SkDELETE(fDrawBuffer); | 142 SkDELETE(fDrawBuffer); |
143 SkDELETE(fDrawBufferVBAllocPool); | 143 SkDELETE(fDrawBufferVBAllocPool); |
144 SkDELETE(fDrawBufferIBAllocPool); | 144 SkDELETE(fDrawBufferIBAllocPool); |
145 | 145 |
146 fAARectRenderer->unref(); | 146 fAARectRenderer->unref(); |
147 fOvalRenderer->unref(); | 147 fOvalRenderer->unref(); |
148 | 148 |
149 fGpu->unref(); | 149 fGpu->unref(); |
150 SkSafeUnref(fPathRendererChain); | 150 SkSafeUnref(fPathRendererChain); |
151 SkSafeUnref(fSoftwarePathRenderer); | 151 SkSafeUnref(fSoftwarePathRenderer); |
152 } | 152 } |
153 | 153 |
154 void GrContext::abandonContext() { | 154 void GrContext::abandonContext() { |
155 // abandon first to so destructors | 155 // abandon first to so destructors |
156 // don't try to free the resources in the API. | 156 // don't try to free the resources in the API. |
157 fResourceCache2->abandonAll(); | 157 fResourceCache->abandonAll(); |
158 | 158 |
159 fGpu->contextAbandoned(); | 159 fGpu->contextAbandoned(); |
160 | 160 |
161 // a path renderer may be holding onto resources that | 161 // a path renderer may be holding onto resources that |
162 // are now unusable | 162 // are now unusable |
163 SkSafeSetNull(fPathRendererChain); | 163 SkSafeSetNull(fPathRendererChain); |
164 SkSafeSetNull(fSoftwarePathRenderer); | 164 SkSafeSetNull(fSoftwarePathRenderer); |
165 | 165 |
166 delete fDrawBuffer; | 166 delete fDrawBuffer; |
167 fDrawBuffer = NULL; | 167 fDrawBuffer = NULL; |
(...skipping 27 matching lines...) Expand all Loading... |
195 | 195 |
196 fFontCache->freeAll(); | 196 fFontCache->freeAll(); |
197 fLayerCache->freeAll(); | 197 fLayerCache->freeAll(); |
198 // a path renderer may be holding onto resources | 198 // a path renderer may be holding onto resources |
199 SkSafeSetNull(fPathRendererChain); | 199 SkSafeSetNull(fPathRendererChain); |
200 SkSafeSetNull(fSoftwarePathRenderer); | 200 SkSafeSetNull(fSoftwarePathRenderer); |
201 } | 201 } |
202 | 202 |
203 void GrContext::getResourceCacheUsage(int* resourceCount, size_t* resourceBytes)
const { | 203 void GrContext::getResourceCacheUsage(int* resourceCount, size_t* resourceBytes)
const { |
204 if (resourceCount) { | 204 if (resourceCount) { |
205 *resourceCount = fResourceCache2->getBudgetedResourceCount(); | 205 *resourceCount = fResourceCache->getBudgetedResourceCount(); |
206 } | 206 } |
207 if (resourceBytes) { | 207 if (resourceBytes) { |
208 *resourceBytes = fResourceCache2->getBudgetedResourceBytes(); | 208 *resourceBytes = fResourceCache->getBudgetedResourceBytes(); |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
212 GrTextContext* GrContext::createTextContext(GrRenderTarget* renderTarget, | 212 GrTextContext* GrContext::createTextContext(GrRenderTarget* renderTarget, |
213 const SkDeviceProperties& | 213 const SkDeviceProperties& |
214 leakyProperties, | 214 leakyProperties, |
215 bool enableDistanceFieldFonts) { | 215 bool enableDistanceFieldFonts) { |
216 if (fGpu->caps()->pathRenderingSupport() && renderTarget->getStencilBuffer()
&& | 216 if (fGpu->caps()->pathRenderingSupport() && renderTarget->getStencilBuffer()
&& |
217 renderTarget->isMultisampled())
{ | 217 renderTarget->isMultisampled())
{ |
218 return GrStencilAndCoverTextContext::Create(this, leakyProperties); | 218 return GrStencilAndCoverTextContext::Create(this, leakyProperties); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 GrSurfaceDesc* wdesc = desc.writable(); | 292 GrSurfaceDesc* wdesc = desc.writable(); |
293 wdesc->fWidth = SkTMax(MIN_SIZE, GrNextPow2(desc->fWidth)); | 293 wdesc->fWidth = SkTMax(MIN_SIZE, GrNextPow2(desc->fWidth)); |
294 wdesc->fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc->fHeight)); | 294 wdesc->fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc->fHeight)); |
295 } | 295 } |
296 | 296 |
297 do { | 297 do { |
298 GrScratchKey key; | 298 GrScratchKey key; |
299 GrTexturePriv::ComputeScratchKey(*desc, &key); | 299 GrTexturePriv::ComputeScratchKey(*desc, &key); |
300 uint32_t scratchFlags = 0; | 300 uint32_t scratchFlags = 0; |
301 if (kNoPendingIO_ScratchTextureFlag & flags) { | 301 if (kNoPendingIO_ScratchTextureFlag & flags) { |
302 scratchFlags = GrResourceCache2::kRequireNoPendingIO_ScratchFlag
; | 302 scratchFlags = GrResourceCache::kRequireNoPendingIO_ScratchFlag; |
303 } else if (!(desc->fFlags & kRenderTarget_GrSurfaceFlag)) { | 303 } else if (!(desc->fFlags & kRenderTarget_GrSurfaceFlag)) { |
304 // If it is not a render target then it will most likely be popu
lated by | 304 // If it is not a render target then it will most likely be popu
lated by |
305 // writePixels() which will trigger a flush if the texture has p
ending IO. | 305 // writePixels() which will trigger a flush if the texture has p
ending IO. |
306 scratchFlags = GrResourceCache2::kPreferNoPendingIO_ScratchFlag; | 306 scratchFlags = GrResourceCache::kPreferNoPendingIO_ScratchFlag; |
307 } | 307 } |
308 GrGpuResource* resource = fResourceCache2->findAndRefScratchResource
(key, scratchFlags); | 308 GrGpuResource* resource = fResourceCache->findAndRefScratchResource(
key, scratchFlags); |
309 if (resource) { | 309 if (resource) { |
310 GrSurface* surface = static_cast<GrSurface*>(resource); | 310 GrSurface* surface = static_cast<GrSurface*>(resource); |
311 GrRenderTarget* rt = surface->asRenderTarget(); | 311 GrRenderTarget* rt = surface->asRenderTarget(); |
312 if (rt && fGpu->caps()->discardRenderTargetSupport()) { | 312 if (rt && fGpu->caps()->discardRenderTargetSupport()) { |
313 rt->discard(); | 313 rt->discard(); |
314 } | 314 } |
315 return surface->asTexture(); | 315 return surface->asTexture(); |
316 } | 316 } |
317 | 317 |
318 if (kExact_ScratchTextureFlag & flags) { | 318 if (kExact_ScratchTextureFlag & flags) { |
(...skipping 1243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1562 return GrConfigConversionEffect::Create(texture, swapRAndB, upmToPM, mat
rix); | 1562 return GrConfigConversionEffect::Create(texture, swapRAndB, upmToPM, mat
rix); |
1563 } else { | 1563 } else { |
1564 return NULL; | 1564 return NULL; |
1565 } | 1565 } |
1566 } | 1566 } |
1567 | 1567 |
1568 ////////////////////////////////////////////////////////////////////////////// | 1568 ////////////////////////////////////////////////////////////////////////////// |
1569 | 1569 |
1570 void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes
) const { | 1570 void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes
) const { |
1571 if (maxTextures) { | 1571 if (maxTextures) { |
1572 *maxTextures = fResourceCache2->getMaxResourceCount(); | 1572 *maxTextures = fResourceCache->getMaxResourceCount(); |
1573 } | 1573 } |
1574 if (maxTextureBytes) { | 1574 if (maxTextureBytes) { |
1575 *maxTextureBytes = fResourceCache2->getMaxResourceBytes(); | 1575 *maxTextureBytes = fResourceCache->getMaxResourceBytes(); |
1576 } | 1576 } |
1577 } | 1577 } |
1578 | 1578 |
1579 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ | 1579 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ |
1580 fResourceCache2->setLimits(maxTextures, maxTextureBytes); | 1580 fResourceCache->setLimits(maxTextures, maxTextureBytes); |
1581 } | 1581 } |
1582 | 1582 |
1583 bool GrContext::addResourceToCache(const GrContentKey& key, GrGpuResource* resou
rce) { | 1583 bool GrContext::addResourceToCache(const GrContentKey& key, GrGpuResource* resou
rce) { |
1584 ASSERT_OWNED_RESOURCE(resource); | 1584 ASSERT_OWNED_RESOURCE(resource); |
1585 if (!resource || resource->wasDestroyed()) { | 1585 if (!resource || resource->wasDestroyed()) { |
1586 return false; | 1586 return false; |
1587 } | 1587 } |
1588 return resource->cacheAccess().setContentKey(key); | 1588 return resource->cacheAccess().setContentKey(key); |
1589 } | 1589 } |
1590 | 1590 |
1591 bool GrContext::isResourceInCache(const GrContentKey& key) const { | 1591 bool GrContext::isResourceInCache(const GrContentKey& key) const { |
1592 return fResourceCache2->hasContentKey(key); | 1592 return fResourceCache->hasContentKey(key); |
1593 } | 1593 } |
1594 | 1594 |
1595 GrGpuResource* GrContext::findAndRefCachedResource(const GrContentKey& key) { | 1595 GrGpuResource* GrContext::findAndRefCachedResource(const GrContentKey& key) { |
1596 return fResourceCache2->findAndRefContentResource(key); | 1596 return fResourceCache->findAndRefContentResource(key); |
1597 } | 1597 } |
1598 | 1598 |
1599 ////////////////////////////////////////////////////////////////////////////// | 1599 ////////////////////////////////////////////////////////////////////////////// |
1600 | 1600 |
1601 void GrContext::addGpuTraceMarker(const GrGpuTraceMarker* marker) { | 1601 void GrContext::addGpuTraceMarker(const GrGpuTraceMarker* marker) { |
1602 fGpu->addGpuTraceMarker(marker); | 1602 fGpu->addGpuTraceMarker(marker); |
1603 if (fDrawBuffer) { | 1603 if (fDrawBuffer) { |
1604 fDrawBuffer->addGpuTraceMarker(marker); | 1604 fDrawBuffer->addGpuTraceMarker(marker); |
1605 } | 1605 } |
1606 } | 1606 } |
1607 | 1607 |
1608 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { | 1608 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
1609 fGpu->removeGpuTraceMarker(marker); | 1609 fGpu->removeGpuTraceMarker(marker); |
1610 if (fDrawBuffer) { | 1610 if (fDrawBuffer) { |
1611 fDrawBuffer->removeGpuTraceMarker(marker); | 1611 fDrawBuffer->removeGpuTraceMarker(marker); |
1612 } | 1612 } |
1613 } | 1613 } |
1614 | 1614 |
OLD | NEW |