| 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 "GrAtlasTextContext.h" | 12 #include "GrAtlasTextContext.h" |
| 13 #include "GrBatch.h" | 13 #include "GrBatch.h" |
| 14 #include "GrBatchFontCache.h" | 14 #include "GrBatchFontCache.h" |
| 15 #include "GrBatchTarget.h" | 15 #include "GrBatchTarget.h" |
| 16 #include "GrBufferAllocPool.h" | 16 #include "GrBufferAllocPool.h" |
| 17 #include "GrDefaultGeoProcFactory.h" | 17 #include "GrDefaultGeoProcFactory.h" |
| 18 #include "GrGpuResource.h" | 18 #include "GrGpuResource.h" |
| 19 #include "GrGpuResourcePriv.h" | 19 #include "GrGpuResourcePriv.h" |
| 20 #include "GrDrawTargetCaps.h" | 20 #include "GrDrawTargetCaps.h" |
| 21 #include "GrGpu.h" | 21 #include "GrGpu.h" |
| 22 #include "GrIndexBuffer.h" | 22 #include "GrIndexBuffer.h" |
| 23 #include "GrInOrderDrawBuffer.h" | 23 #include "GrInOrderDrawBuffer.h" |
| 24 #include "GrLayerCache.h" | 24 #include "GrLayerCache.h" |
| 25 #include "GrOvalRenderer.h" | 25 #include "GrOvalRenderer.h" |
| 26 #include "GrPathRenderer.h" | 26 #include "GrPathRenderer.h" |
| 27 #include "GrPathUtils.h" | 27 #include "GrPathUtils.h" |
| 28 #include "GrRenderTargetPriv.h" | 28 #include "GrRenderTargetPriv.h" |
| 29 #include "GrResourceCache.h" | 29 #include "GrResourceCache.h" |
| 30 #include "GrResourceProvider.h" |
| 30 #include "GrSoftwarePathRenderer.h" | 31 #include "GrSoftwarePathRenderer.h" |
| 31 #include "GrStencilAndCoverTextContext.h" | 32 #include "GrStencilAndCoverTextContext.h" |
| 32 #include "GrStrokeInfo.h" | 33 #include "GrStrokeInfo.h" |
| 33 #include "GrSurfacePriv.h" | 34 #include "GrSurfacePriv.h" |
| 34 #include "GrTextBlobCache.h" | 35 #include "GrTextBlobCache.h" |
| 35 #include "GrTexturePriv.h" | 36 #include "GrTexturePriv.h" |
| 36 #include "GrTraceMarker.h" | 37 #include "GrTraceMarker.h" |
| 37 #include "GrTracing.h" | 38 #include "GrTracing.h" |
| 38 #include "SkDashPathPriv.h" | 39 #include "SkDashPathPriv.h" |
| 39 #include "SkConfig8888.h" | 40 #include "SkConfig8888.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 if (context->init(backend, backendContext)) { | 86 if (context->init(backend, backendContext)) { |
| 86 return context; | 87 return context; |
| 87 } else { | 88 } else { |
| 88 context->unref(); | 89 context->unref(); |
| 89 return NULL; | 90 return NULL; |
| 90 } | 91 } |
| 91 } | 92 } |
| 92 | 93 |
| 93 GrContext::GrContext(const Options& opts) : fOptions(opts) { | 94 GrContext::GrContext(const Options& opts) : fOptions(opts) { |
| 94 fGpu = NULL; | 95 fGpu = NULL; |
| 96 fResourceCache = NULL; |
| 97 fResourceProvider = NULL; |
| 95 fPathRendererChain = NULL; | 98 fPathRendererChain = NULL; |
| 96 fSoftwarePathRenderer = NULL; | 99 fSoftwarePathRenderer = NULL; |
| 97 fResourceCache = NULL; | |
| 98 fBatchFontCache = NULL; | 100 fBatchFontCache = NULL; |
| 99 fDrawBuffer = NULL; | 101 fDrawBuffer = NULL; |
| 100 fDrawBufferVBAllocPool = NULL; | 102 fDrawBufferVBAllocPool = NULL; |
| 101 fDrawBufferIBAllocPool = NULL; | 103 fDrawBufferIBAllocPool = NULL; |
| 102 fFlushToReduceCacheSize = false; | 104 fFlushToReduceCacheSize = false; |
| 103 fAARectRenderer = NULL; | 105 fAARectRenderer = NULL; |
| 104 fOvalRenderer = NULL; | 106 fOvalRenderer = NULL; |
| 105 fMaxTextureSizeOverride = 1 << 20; | 107 fMaxTextureSizeOverride = 1 << 20; |
| 106 } | 108 } |
| 107 | 109 |
| 108 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { | 110 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { |
| 109 SkASSERT(NULL == fGpu); | 111 SkASSERT(NULL == fGpu); |
| 110 | 112 |
| 111 fGpu = GrGpu::Create(backend, backendContext, this); | 113 fGpu = GrGpu::Create(backend, backendContext, this); |
| 112 if (NULL == fGpu) { | 114 if (NULL == fGpu) { |
| 113 return false; | 115 return false; |
| 114 } | 116 } |
| 115 this->initCommon(); | 117 this->initCommon(); |
| 116 return true; | 118 return true; |
| 117 } | 119 } |
| 118 | 120 |
| 119 void GrContext::initCommon() { | 121 void GrContext::initCommon() { |
| 120 fResourceCache = SkNEW(GrResourceCache); | 122 fResourceCache = SkNEW(GrResourceCache); |
| 121 fResourceCache->setOverBudgetCallback(OverBudgetCB, this); | 123 fResourceCache->setOverBudgetCallback(OverBudgetCB, this); |
| 124 fResourceProvider = SkNEW_ARGS(GrResourceProvider, (fGpu, fResourceCache)); |
| 122 | 125 |
| 123 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); | 126 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); |
| 124 | 127 |
| 125 fAARectRenderer = SkNEW_ARGS(GrAARectRenderer, (fGpu)); | 128 fAARectRenderer = SkNEW_ARGS(GrAARectRenderer, (fGpu)); |
| 126 fOvalRenderer = SkNEW_ARGS(GrOvalRenderer, (fGpu)); | 129 fOvalRenderer = SkNEW_ARGS(GrOvalRenderer, (fGpu)); |
| 127 | 130 |
| 128 fDidTestPMConversions = false; | 131 fDidTestPMConversions = false; |
| 129 | 132 |
| 130 this->setupDrawBuffer(); | 133 this->setupDrawBuffer(); |
| 131 | 134 |
| 132 // GrBatchFontCache will eventually replace GrFontCache | 135 // GrBatchFontCache will eventually replace GrFontCache |
| 133 fBatchFontCache = SkNEW_ARGS(GrBatchFontCache, (this)); | 136 fBatchFontCache = SkNEW_ARGS(GrBatchFontCache, (this)); |
| 134 | 137 |
| 135 fTextBlobCache.reset(SkNEW_ARGS(GrTextBlobCache, (TextBlobCacheOverBudgetCB,
this))); | 138 fTextBlobCache.reset(SkNEW_ARGS(GrTextBlobCache, (TextBlobCacheOverBudgetCB,
this))); |
| 136 } | 139 } |
| 137 | 140 |
| 138 GrContext::~GrContext() { | 141 GrContext::~GrContext() { |
| 139 if (NULL == fGpu) { | 142 if (NULL == fGpu) { |
| 140 return; | 143 return; |
| 141 } | 144 } |
| 142 | 145 |
| 143 this->flush(); | 146 this->flush(); |
| 144 | 147 |
| 145 for (int i = 0; i < fCleanUpData.count(); ++i) { | 148 for (int i = 0; i < fCleanUpData.count(); ++i) { |
| 146 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); | 149 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); |
| 147 } | 150 } |
| 148 | 151 |
| 152 SkDELETE(fResourceProvider); |
| 149 SkDELETE(fResourceCache); | 153 SkDELETE(fResourceCache); |
| 150 SkDELETE(fBatchFontCache); | 154 SkDELETE(fBatchFontCache); |
| 151 SkDELETE(fDrawBuffer); | 155 SkDELETE(fDrawBuffer); |
| 152 SkDELETE(fDrawBufferVBAllocPool); | 156 SkDELETE(fDrawBufferVBAllocPool); |
| 153 SkDELETE(fDrawBufferIBAllocPool); | 157 SkDELETE(fDrawBufferIBAllocPool); |
| 154 | 158 |
| 155 fAARectRenderer->unref(); | 159 fAARectRenderer->unref(); |
| 156 fOvalRenderer->unref(); | 160 fOvalRenderer->unref(); |
| 157 | 161 |
| 158 fGpu->unref(); | 162 fGpu->unref(); |
| 159 SkSafeUnref(fPathRendererChain); | 163 SkSafeUnref(fPathRendererChain); |
| 160 SkSafeUnref(fSoftwarePathRenderer); | 164 SkSafeUnref(fSoftwarePathRenderer); |
| 161 } | 165 } |
| 162 | 166 |
| 163 void GrContext::abandonContext() { | 167 void GrContext::abandonContext() { |
| 168 fResourceProvider->abandon(); |
| 164 // abandon first to so destructors | 169 // abandon first to so destructors |
| 165 // don't try to free the resources in the API. | 170 // don't try to free the resources in the API. |
| 166 fResourceCache->abandonAll(); | 171 fResourceCache->abandonAll(); |
| 167 | 172 |
| 168 fGpu->contextAbandoned(); | 173 fGpu->contextAbandoned(); |
| 169 | 174 |
| 170 // a path renderer may be holding onto resources that | 175 // a path renderer may be holding onto resources that |
| 171 // are now unusable | 176 // are now unusable |
| 172 SkSafeSetNull(fPathRendererChain); | 177 SkSafeSetNull(fPathRendererChain); |
| 173 SkSafeSetNull(fSoftwarePathRenderer); | 178 SkSafeSetNull(fSoftwarePathRenderer); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 GrStencilAttachment* sb = renderTarget->renderTargetPriv().attachStencil
Attachment(); | 235 GrStencilAttachment* sb = renderTarget->renderTargetPriv().attachStencil
Attachment(); |
| 231 if (sb) { | 236 if (sb) { |
| 232 return GrStencilAndCoverTextContext::Create(this, gpuDevice, leakyPr
operties); | 237 return GrStencilAndCoverTextContext::Create(this, gpuDevice, leakyPr
operties); |
| 233 } | 238 } |
| 234 } | 239 } |
| 235 | 240 |
| 236 return GrAtlasTextContext::Create(this, gpuDevice, leakyProperties, enableDi
stanceFieldFonts); | 241 return GrAtlasTextContext::Create(this, gpuDevice, leakyProperties, enableDi
stanceFieldFonts); |
| 237 } | 242 } |
| 238 | 243 |
| 239 //////////////////////////////////////////////////////////////////////////////// | 244 //////////////////////////////////////////////////////////////////////////////// |
| 240 enum ScratchTextureFlags { | |
| 241 kExact_ScratchTextureFlag = 0x1, | |
| 242 kNoPendingIO_ScratchTextureFlag = 0x2, | |
| 243 kNoCreate_ScratchTextureFlag = 0x4, | |
| 244 }; | |
| 245 | 245 |
| 246 bool GrContext::isConfigTexturable(GrPixelConfig config) const { | 246 bool GrContext::isConfigTexturable(GrPixelConfig config) const { |
| 247 return fGpu->caps()->isConfigTexturable(config); | 247 return fGpu->caps()->isConfigTexturable(config); |
| 248 } | 248 } |
| 249 | 249 |
| 250 bool GrContext::npotTextureTileSupport() const { | 250 bool GrContext::npotTextureTileSupport() const { |
| 251 return fGpu->caps()->npotTextureTileSupport(); | 251 return fGpu->caps()->npotTextureTileSupport(); |
| 252 } | 252 } |
| 253 | 253 |
| 254 GrTexture* GrContext::createTexture(const GrSurfaceDesc& desc, bool budgeted, co
nst void* srcData, | |
| 255 size_t rowBytes) { | |
| 256 RETURN_NULL_IF_ABANDONED | |
| 257 if ((desc.fFlags & kRenderTarget_GrSurfaceFlag) && | |
| 258 !this->isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { | |
| 259 return NULL; | |
| 260 } | |
| 261 if (!GrPixelConfigIsCompressed(desc.fConfig)) { | |
| 262 static const uint32_t kFlags = kExact_ScratchTextureFlag | | |
| 263 kNoCreate_ScratchTextureFlag; | |
| 264 if (GrTexture* texture = this->internalRefScratchTexture(desc, kFlags))
{ | |
| 265 if (!srcData || texture->writePixels(0, 0, desc.fWidth, desc.fHeight
, desc.fConfig, | |
| 266 srcData, rowBytes)) { | |
| 267 if (!budgeted) { | |
| 268 texture->resourcePriv().makeUnbudgeted(); | |
| 269 } | |
| 270 return texture; | |
| 271 } | |
| 272 texture->unref(); | |
| 273 } | |
| 274 } | |
| 275 return fGpu->createTexture(desc, budgeted, srcData, rowBytes); | |
| 276 } | |
| 277 | |
| 278 GrTexture* GrContext::refScratchTexture(const GrSurfaceDesc& desc, ScratchTexMat
ch match, | |
| 279 bool calledDuringFlush) { | |
| 280 RETURN_NULL_IF_ABANDONED | |
| 281 // Currently we don't recycle compressed textures as scratch. | |
| 282 if (GrPixelConfigIsCompressed(desc.fConfig)) { | |
| 283 return NULL; | |
| 284 } else { | |
| 285 uint32_t flags = 0; | |
| 286 if (kExact_ScratchTexMatch == match) { | |
| 287 flags |= kExact_ScratchTextureFlag; | |
| 288 } | |
| 289 if (calledDuringFlush) { | |
| 290 flags |= kNoPendingIO_ScratchTextureFlag; | |
| 291 } | |
| 292 return this->internalRefScratchTexture(desc, flags); | |
| 293 } | |
| 294 } | |
| 295 | |
| 296 GrTexture* GrContext::internalRefScratchTexture(const GrSurfaceDesc& inDesc, uin
t32_t flags) { | |
| 297 SkASSERT(!GrPixelConfigIsCompressed(inDesc.fConfig)); | |
| 298 | |
| 299 SkTCopyOnFirstWrite<GrSurfaceDesc> desc(inDesc); | |
| 300 | |
| 301 if (fGpu->caps()->reuseScratchTextures() || (desc->fFlags & kRenderTarget_Gr
SurfaceFlag)) { | |
| 302 if (!(kExact_ScratchTextureFlag & flags)) { | |
| 303 // bin by pow2 with a reasonable min | |
| 304 static const int MIN_SIZE = 16; | |
| 305 GrSurfaceDesc* wdesc = desc.writable(); | |
| 306 wdesc->fWidth = SkTMax(MIN_SIZE, GrNextPow2(desc->fWidth)); | |
| 307 wdesc->fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc->fHeight)); | |
| 308 } | |
| 309 | |
| 310 GrScratchKey key; | |
| 311 GrTexturePriv::ComputeScratchKey(*desc, &key); | |
| 312 uint32_t scratchFlags = 0; | |
| 313 if (kNoPendingIO_ScratchTextureFlag & flags) { | |
| 314 scratchFlags = GrResourceCache::kRequireNoPendingIO_ScratchFlag; | |
| 315 } else if (!(desc->fFlags & kRenderTarget_GrSurfaceFlag)) { | |
| 316 // If it is not a render target then it will most likely be populate
d by | |
| 317 // writePixels() which will trigger a flush if the texture has pendi
ng IO. | |
| 318 scratchFlags = GrResourceCache::kPreferNoPendingIO_ScratchFlag; | |
| 319 } | |
| 320 GrGpuResource* resource = fResourceCache->findAndRefScratchResource(key,
scratchFlags); | |
| 321 if (resource) { | |
| 322 GrSurface* surface = static_cast<GrSurface*>(resource); | |
| 323 GrRenderTarget* rt = surface->asRenderTarget(); | |
| 324 if (rt && fGpu->caps()->discardRenderTargetSupport()) { | |
| 325 rt->discard(); | |
| 326 } | |
| 327 return surface->asTexture(); | |
| 328 } | |
| 329 } | |
| 330 | |
| 331 if (!(kNoCreate_ScratchTextureFlag & flags)) { | |
| 332 return fGpu->createTexture(*desc, true, NULL, 0); | |
| 333 } | |
| 334 | |
| 335 return NULL; | |
| 336 } | |
| 337 | |
| 338 void GrContext::OverBudgetCB(void* data) { | 254 void GrContext::OverBudgetCB(void* data) { |
| 339 SkASSERT(data); | 255 SkASSERT(data); |
| 340 | 256 |
| 341 GrContext* context = reinterpret_cast<GrContext*>(data); | 257 GrContext* context = reinterpret_cast<GrContext*>(data); |
| 342 | 258 |
| 343 // Flush the InOrderDrawBuffer to possibly free up some textures | 259 // Flush the InOrderDrawBuffer to possibly free up some textures |
| 344 context->fFlushToReduceCacheSize = true; | 260 context->fFlushToReduceCacheSize = true; |
| 345 } | 261 } |
| 346 | 262 |
| 347 void GrContext::TextBlobCacheOverBudgetCB(void* data) { | 263 void GrContext::TextBlobCacheOverBudgetCB(void* data) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 362 int GrContext::getMaxRenderTargetSize() const { | 278 int GrContext::getMaxRenderTargetSize() const { |
| 363 return fGpu->caps()->maxRenderTargetSize(); | 279 return fGpu->caps()->maxRenderTargetSize(); |
| 364 } | 280 } |
| 365 | 281 |
| 366 int GrContext::getMaxSampleCount() const { | 282 int GrContext::getMaxSampleCount() const { |
| 367 return fGpu->caps()->maxSampleCount(); | 283 return fGpu->caps()->maxSampleCount(); |
| 368 } | 284 } |
| 369 | 285 |
| 370 /////////////////////////////////////////////////////////////////////////////// | 286 /////////////////////////////////////////////////////////////////////////////// |
| 371 | 287 |
| 372 GrTexture* GrContext::wrapBackendTexture(const GrBackendTextureDesc& desc) { | |
| 373 RETURN_NULL_IF_ABANDONED | |
| 374 return fGpu->wrapBackendTexture(desc); | |
| 375 } | |
| 376 | |
| 377 GrRenderTarget* GrContext::wrapBackendRenderTarget(const GrBackendRenderTargetDe
sc& desc) { | |
| 378 RETURN_NULL_IF_ABANDONED | |
| 379 return fGpu->wrapBackendRenderTarget(desc); | |
| 380 } | |
| 381 | |
| 382 //////////////////////////////////////////////////////////////////////////////// | |
| 383 | |
| 384 void GrContext::clear(const SkIRect* rect, | 288 void GrContext::clear(const SkIRect* rect, |
| 385 const GrColor color, | 289 const GrColor color, |
| 386 bool canIgnoreRect, | 290 bool canIgnoreRect, |
| 387 GrRenderTarget* renderTarget) { | 291 GrRenderTarget* renderTarget) { |
| 388 RETURN_IF_ABANDONED | 292 RETURN_IF_ABANDONED |
| 389 ASSERT_OWNED_RESOURCE(renderTarget); | 293 ASSERT_OWNED_RESOURCE(renderTarget); |
| 390 SkASSERT(renderTarget); | 294 SkASSERT(renderTarget); |
| 391 | 295 |
| 392 AutoCheckFlush acf(this); | 296 AutoCheckFlush acf(this); |
| 393 GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this); | 297 GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this); |
| (...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1529 if (GrPixelConfigSwapRAndB(srcConfig) == | 1433 if (GrPixelConfigSwapRAndB(srcConfig) == |
| 1530 fGpu->preferredWritePixelsConfig(srcConfig, renderTarget->config())) { | 1434 fGpu->preferredWritePixelsConfig(srcConfig, renderTarget->config())) { |
| 1531 writeConfig = GrPixelConfigSwapRAndB(srcConfig); | 1435 writeConfig = GrPixelConfigSwapRAndB(srcConfig); |
| 1532 swapRAndB = true; | 1436 swapRAndB = true; |
| 1533 } | 1437 } |
| 1534 | 1438 |
| 1535 GrSurfaceDesc desc; | 1439 GrSurfaceDesc desc; |
| 1536 desc.fWidth = width; | 1440 desc.fWidth = width; |
| 1537 desc.fHeight = height; | 1441 desc.fHeight = height; |
| 1538 desc.fConfig = writeConfig; | 1442 desc.fConfig = writeConfig; |
| 1539 SkAutoTUnref<GrTexture> texture(this->refScratchTexture(desc, kApprox_Scratc
hTexMatch)); | 1443 SkAutoTUnref<GrTexture> texture(this->textureProvider()->refScratchTexture(d
esc, |
| 1444 GrTextureProvider::kApprox_ScratchTexMatch)); |
| 1540 if (!texture) { | 1445 if (!texture) { |
| 1541 return false; | 1446 return false; |
| 1542 } | 1447 } |
| 1543 | 1448 |
| 1544 SkAutoTUnref<const GrFragmentProcessor> fp; | 1449 SkAutoTUnref<const GrFragmentProcessor> fp; |
| 1545 SkMatrix textureMatrix; | 1450 SkMatrix textureMatrix; |
| 1546 textureMatrix.setIDiv(texture->width(), texture->height()); | 1451 textureMatrix.setIDiv(texture->width(), texture->height()); |
| 1547 | 1452 |
| 1548 // allocate a tmp buffer and sw convert the pixels to premul | 1453 // allocate a tmp buffer and sw convert the pixels to premul |
| 1549 SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); | 1454 SkAutoSTMalloc<128 * 128, uint32_t> tmpPixels(0); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1674 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 1579 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 1675 desc.fWidth = width; | 1580 desc.fWidth = width; |
| 1676 desc.fHeight = height; | 1581 desc.fHeight = height; |
| 1677 desc.fConfig = readConfig; | 1582 desc.fConfig = readConfig; |
| 1678 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 1583 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 1679 | 1584 |
| 1680 // When a full read back is faster than a partial we could always make t
he scratch exactly | 1585 // When a full read back is faster than a partial we could always make t
he scratch exactly |
| 1681 // match the passed rect. However, if we see many different size rectang
les we will trash | 1586 // match the passed rect. However, if we see many different size rectang
les we will trash |
| 1682 // our texture cache and pay the cost of creating and destroying many te
xtures. So, we only | 1587 // our texture cache and pay the cost of creating and destroying many te
xtures. So, we only |
| 1683 // request an exact match when the caller is reading an entire RT. | 1588 // request an exact match when the caller is reading an entire RT. |
| 1684 ScratchTexMatch match = kApprox_ScratchTexMatch; | 1589 GrTextureProvider::ScratchTexMatch match = GrTextureProvider::kApprox_Sc
ratchTexMatch; |
| 1685 if (0 == left && | 1590 if (0 == left && |
| 1686 0 == top && | 1591 0 == top && |
| 1687 target->width() == width && | 1592 target->width() == width && |
| 1688 target->height() == height && | 1593 target->height() == height && |
| 1689 fGpu->fullReadPixelsIsFasterThanPartial()) { | 1594 fGpu->fullReadPixelsIsFasterThanPartial()) { |
| 1690 match = kExact_ScratchTexMatch; | 1595 match = GrTextureProvider::kExact_ScratchTexMatch; |
| 1691 } | 1596 } |
| 1692 tempTexture.reset(this->refScratchTexture(desc, match)); | 1597 tempTexture.reset(this->textureProvider()->refScratchTexture(desc, match
)); |
| 1693 if (tempTexture) { | 1598 if (tempTexture) { |
| 1694 // compute a matrix to perform the draw | 1599 // compute a matrix to perform the draw |
| 1695 SkMatrix textureMatrix; | 1600 SkMatrix textureMatrix; |
| 1696 textureMatrix.setTranslate(SK_Scalar1 *left, SK_Scalar1 *top); | 1601 textureMatrix.setTranslate(SK_Scalar1 *left, SK_Scalar1 *top); |
| 1697 textureMatrix.postIDiv(src->width(), src->height()); | 1602 textureMatrix.postIDiv(src->width(), src->height()); |
| 1698 | 1603 |
| 1699 SkAutoTUnref<const GrFragmentProcessor> fp; | 1604 SkAutoTUnref<const GrFragmentProcessor> fp; |
| 1700 if (unpremul) { | 1605 if (unpremul) { |
| 1701 fp.reset(this->createPMToUPMEffect(src, swapRAndB, textureMatrix
)); | 1606 fp.reset(this->createPMToUPMEffect(src, swapRAndB, textureMatrix
)); |
| 1702 if (fp) { | 1607 if (fp) { |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1976 } | 1881 } |
| 1977 if (maxTextureBytes) { | 1882 if (maxTextureBytes) { |
| 1978 *maxTextureBytes = fResourceCache->getMaxResourceBytes(); | 1883 *maxTextureBytes = fResourceCache->getMaxResourceBytes(); |
| 1979 } | 1884 } |
| 1980 } | 1885 } |
| 1981 | 1886 |
| 1982 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ | 1887 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ |
| 1983 fResourceCache->setLimits(maxTextures, maxTextureBytes); | 1888 fResourceCache->setLimits(maxTextures, maxTextureBytes); |
| 1984 } | 1889 } |
| 1985 | 1890 |
| 1986 void GrContext::addResourceToCache(const GrUniqueKey& key, GrGpuResource* resour
ce) { | |
| 1987 ASSERT_OWNED_RESOURCE(resource); | |
| 1988 if (!resource) { | |
| 1989 return; | |
| 1990 } | |
| 1991 resource->resourcePriv().setUniqueKey(key); | |
| 1992 } | |
| 1993 | |
| 1994 bool GrContext::isResourceInCache(const GrUniqueKey& key) const { | |
| 1995 return fResourceCache->hasUniqueKey(key); | |
| 1996 } | |
| 1997 | |
| 1998 GrGpuResource* GrContext::findAndRefCachedResource(const GrUniqueKey& key) { | |
| 1999 return fResourceCache->findAndRefUniqueResource(key); | |
| 2000 } | |
| 2001 | |
| 2002 ////////////////////////////////////////////////////////////////////////////// | 1891 ////////////////////////////////////////////////////////////////////////////// |
| 2003 | 1892 |
| 2004 void GrContext::addGpuTraceMarker(const GrGpuTraceMarker* marker) { | 1893 void GrContext::addGpuTraceMarker(const GrGpuTraceMarker* marker) { |
| 2005 fGpu->addGpuTraceMarker(marker); | 1894 fGpu->addGpuTraceMarker(marker); |
| 2006 if (fDrawBuffer) { | 1895 if (fDrawBuffer) { |
| 2007 fDrawBuffer->addGpuTraceMarker(marker); | 1896 fDrawBuffer->addGpuTraceMarker(marker); |
| 2008 } | 1897 } |
| 2009 } | 1898 } |
| 2010 | 1899 |
| 2011 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { | 1900 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
| 2012 fGpu->removeGpuTraceMarker(marker); | 1901 fGpu->removeGpuTraceMarker(marker); |
| 2013 if (fDrawBuffer) { | 1902 if (fDrawBuffer) { |
| 2014 fDrawBuffer->removeGpuTraceMarker(marker); | 1903 fDrawBuffer->removeGpuTraceMarker(marker); |
| 2015 } | 1904 } |
| 2016 } | 1905 } |
| 2017 | |
| OLD | NEW |