| 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 |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 if (fGpu->caps()->pathRenderingSupport() && renderTarget->getStencilBuffer()
&& | 254 if (fGpu->caps()->pathRenderingSupport() && renderTarget->getStencilBuffer()
&& |
| 255 renderTarget->isMultisampled())
{ | 255 renderTarget->isMultisampled())
{ |
| 256 return GrStencilAndCoverTextContext::Create(this, leakyProperties); | 256 return GrStencilAndCoverTextContext::Create(this, leakyProperties); |
| 257 } | 257 } |
| 258 | 258 |
| 259 return GrDistanceFieldTextContext::Create(this, leakyProperties, enableDista
nceFieldFonts); | 259 return GrDistanceFieldTextContext::Create(this, leakyProperties, enableDista
nceFieldFonts); |
| 260 } | 260 } |
| 261 | 261 |
| 262 //////////////////////////////////////////////////////////////////////////////// | 262 //////////////////////////////////////////////////////////////////////////////// |
| 263 | 263 |
| 264 GrTexture* GrContext::findAndRefTexture(const GrTextureDesc& desc, | 264 GrTexture* GrContext::findAndRefTexture(const GrSurfaceDesc& desc, |
| 265 const GrCacheID& cacheID, | 265 const GrCacheID& cacheID, |
| 266 const GrTextureParams* params) { | 266 const GrTextureParams* params) { |
| 267 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); | 267 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); |
| 268 GrGpuResource* resource = fResourceCache->find(resourceKey); | 268 GrGpuResource* resource = fResourceCache->find(resourceKey); |
| 269 SkSafeRef(resource); | 269 SkSafeRef(resource); |
| 270 return static_cast<GrTexture*>(resource); | 270 return static_cast<GrTexture*>(resource); |
| 271 } | 271 } |
| 272 | 272 |
| 273 bool GrContext::isTextureInCache(const GrTextureDesc& desc, | 273 bool GrContext::isTextureInCache(const GrSurfaceDesc& desc, |
| 274 const GrCacheID& cacheID, | 274 const GrCacheID& cacheID, |
| 275 const GrTextureParams* params) const { | 275 const GrTextureParams* params) const { |
| 276 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); | 276 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); |
| 277 return fResourceCache->hasKey(resourceKey); | 277 return fResourceCache->hasKey(resourceKey); |
| 278 } | 278 } |
| 279 | 279 |
| 280 void GrContext::addStencilBuffer(GrStencilBuffer* sb) { | 280 void GrContext::addStencilBuffer(GrStencilBuffer* sb) { |
| 281 ASSERT_OWNED_RESOURCE(sb); | 281 ASSERT_OWNED_RESOURCE(sb); |
| 282 | 282 |
| 283 GrResourceKey resourceKey = GrStencilBuffer::ComputeKey(sb->width(), | 283 GrResourceKey resourceKey = GrStencilBuffer::ComputeKey(sb->width(), |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 // position + local coordinate | 325 // position + local coordinate |
| 326 extern const GrVertexAttrib gVertexAttribs[] = { | 326 extern const GrVertexAttrib gVertexAttribs[] = { |
| 327 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding
}, | 327 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding
}, |
| 328 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttribBindi
ng} | 328 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttribBindi
ng} |
| 329 }; | 329 }; |
| 330 | 330 |
| 331 }; | 331 }; |
| 332 | 332 |
| 333 // The desired texture is NPOT and tiled but that isn't supported by | 333 // The desired texture is NPOT and tiled but that isn't supported by |
| 334 // the current hardware. Resize the texture to be a POT | 334 // the current hardware. Resize the texture to be a POT |
| 335 GrTexture* GrContext::createResizedTexture(const GrTextureDesc& desc, | 335 GrTexture* GrContext::createResizedTexture(const GrSurfaceDesc& desc, |
| 336 const GrCacheID& cacheID, | 336 const GrCacheID& cacheID, |
| 337 const void* srcData, | 337 const void* srcData, |
| 338 size_t rowBytes, | 338 size_t rowBytes, |
| 339 bool filter) { | 339 bool filter) { |
| 340 SkAutoTUnref<GrTexture> clampedTexture(this->findAndRefTexture(desc, cacheID
, NULL)); | 340 SkAutoTUnref<GrTexture> clampedTexture(this->findAndRefTexture(desc, cacheID
, NULL)); |
| 341 if (NULL == clampedTexture) { | 341 if (NULL == clampedTexture) { |
| 342 clampedTexture.reset(this->createTexture(NULL, desc, cacheID, srcData, r
owBytes)); | 342 clampedTexture.reset(this->createTexture(NULL, desc, cacheID, srcData, r
owBytes)); |
| 343 | 343 |
| 344 if (NULL == clampedTexture) { | 344 if (NULL == clampedTexture) { |
| 345 return NULL; | 345 return NULL; |
| 346 } | 346 } |
| 347 } | 347 } |
| 348 | 348 |
| 349 GrTextureDesc rtDesc = desc; | 349 GrSurfaceDesc rtDesc = desc; |
| 350 rtDesc.fFlags = rtDesc.fFlags | | 350 rtDesc.fFlags = rtDesc.fFlags | |
| 351 kRenderTarget_GrTextureFlagBit | | 351 kRenderTarget_GrSurfaceFlag | |
| 352 kNoStencil_GrTextureFlagBit; | 352 kNoStencil_GrSurfaceFlag; |
| 353 rtDesc.fWidth = GrNextPow2(desc.fWidth); | 353 rtDesc.fWidth = GrNextPow2(desc.fWidth); |
| 354 rtDesc.fHeight = GrNextPow2(desc.fHeight); | 354 rtDesc.fHeight = GrNextPow2(desc.fHeight); |
| 355 | 355 |
| 356 GrTexture* texture = fGpu->createTexture(rtDesc, NULL, 0); | 356 GrTexture* texture = fGpu->createTexture(rtDesc, NULL, 0); |
| 357 | 357 |
| 358 if (texture) { | 358 if (texture) { |
| 359 GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit); | 359 GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit); |
| 360 GrDrawState* drawState = fGpu->drawState(); | 360 GrDrawState* drawState = fGpu->drawState(); |
| 361 drawState->setRenderTarget(texture->asRenderTarget()); | 361 drawState->setRenderTarget(texture->asRenderTarget()); |
| 362 | 362 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 377 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 *
sizeof(SkPoint)); | 377 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 *
sizeof(SkPoint)); |
| 378 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint)); | 378 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint)); |
| 379 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); | 379 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); |
| 380 } | 380 } |
| 381 } else { | 381 } else { |
| 382 // TODO: Our CPU stretch doesn't filter. But we create separate | 382 // TODO: Our CPU stretch doesn't filter. But we create separate |
| 383 // stretched textures when the texture params is either filtered or | 383 // stretched textures when the texture params is either filtered or |
| 384 // not. Either implement filtered stretch blit on CPU or just create | 384 // not. Either implement filtered stretch blit on CPU or just create |
| 385 // one when FBO case fails. | 385 // one when FBO case fails. |
| 386 | 386 |
| 387 rtDesc.fFlags = kNone_GrTextureFlags; | 387 rtDesc.fFlags = kNone_GrSurfaceFlags; |
| 388 // no longer need to clamp at min RT size. | 388 // no longer need to clamp at min RT size. |
| 389 rtDesc.fWidth = GrNextPow2(desc.fWidth); | 389 rtDesc.fWidth = GrNextPow2(desc.fWidth); |
| 390 rtDesc.fHeight = GrNextPow2(desc.fHeight); | 390 rtDesc.fHeight = GrNextPow2(desc.fHeight); |
| 391 | 391 |
| 392 // We shouldn't be resizing a compressed texture. | 392 // We shouldn't be resizing a compressed texture. |
| 393 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); | 393 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); |
| 394 | 394 |
| 395 size_t bpp = GrBytesPerPixel(desc.fConfig); | 395 size_t bpp = GrBytesPerPixel(desc.fConfig); |
| 396 GrAutoMalloc<128*128*4> stretchedPixels(bpp * rtDesc.fWidth * rtDesc.fHe
ight); | 396 GrAutoMalloc<128*128*4> stretchedPixels(bpp * rtDesc.fWidth * rtDesc.fHe
ight); |
| 397 stretch_image(stretchedPixels.get(), rtDesc.fWidth, rtDesc.fHeight, | 397 stretch_image(stretchedPixels.get(), rtDesc.fWidth, rtDesc.fHeight, |
| 398 srcData, desc.fWidth, desc.fHeight, bpp); | 398 srcData, desc.fWidth, desc.fHeight, bpp); |
| 399 | 399 |
| 400 size_t stretchedRowBytes = rtDesc.fWidth * bpp; | 400 size_t stretchedRowBytes = rtDesc.fWidth * bpp; |
| 401 | 401 |
| 402 texture = fGpu->createTexture(rtDesc, stretchedPixels.get(), stretchedRo
wBytes); | 402 texture = fGpu->createTexture(rtDesc, stretchedPixels.get(), stretchedRo
wBytes); |
| 403 SkASSERT(texture); | 403 SkASSERT(texture); |
| 404 } | 404 } |
| 405 | 405 |
| 406 return texture; | 406 return texture; |
| 407 } | 407 } |
| 408 | 408 |
| 409 GrTexture* GrContext::createTexture(const GrTextureParams* params, | 409 GrTexture* GrContext::createTexture(const GrTextureParams* params, |
| 410 const GrTextureDesc& desc, | 410 const GrSurfaceDesc& desc, |
| 411 const GrCacheID& cacheID, | 411 const GrCacheID& cacheID, |
| 412 const void* srcData, | 412 const void* srcData, |
| 413 size_t rowBytes, | 413 size_t rowBytes, |
| 414 GrResourceKey* cacheKey) { | 414 GrResourceKey* cacheKey) { |
| 415 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); | 415 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); |
| 416 | 416 |
| 417 GrTexture* texture; | 417 GrTexture* texture; |
| 418 if (GrTexturePriv::NeedsResizing(resourceKey)) { | 418 if (GrTexturePriv::NeedsResizing(resourceKey)) { |
| 419 // We do not know how to resize compressed textures. | 419 // We do not know how to resize compressed textures. |
| 420 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); | 420 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); |
| 421 | 421 |
| 422 texture = this->createResizedTexture(desc, cacheID, | 422 texture = this->createResizedTexture(desc, cacheID, |
| 423 srcData, rowBytes, | 423 srcData, rowBytes, |
| 424 GrTexturePriv::NeedsBilerp(resource
Key)); | 424 GrTexturePriv::NeedsBilerp(resource
Key)); |
| 425 } else { | 425 } else { |
| 426 texture = fGpu->createTexture(desc, srcData, rowBytes); | 426 texture = fGpu->createTexture(desc, srcData, rowBytes); |
| 427 } | 427 } |
| 428 | 428 |
| 429 if (texture) { | 429 if (texture) { |
| 430 fResourceCache->addResource(resourceKey, texture); | 430 fResourceCache->addResource(resourceKey, texture); |
| 431 | 431 |
| 432 if (cacheKey) { | 432 if (cacheKey) { |
| 433 *cacheKey = resourceKey; | 433 *cacheKey = resourceKey; |
| 434 } | 434 } |
| 435 } | 435 } |
| 436 | 436 |
| 437 return texture; | 437 return texture; |
| 438 } | 438 } |
| 439 | 439 |
| 440 GrTexture* GrContext::createNewScratchTexture(const GrTextureDesc& desc) { | 440 GrTexture* GrContext::createNewScratchTexture(const GrSurfaceDesc& desc) { |
| 441 GrTexture* texture = fGpu->createTexture(desc, NULL, 0); | 441 GrTexture* texture = fGpu->createTexture(desc, NULL, 0); |
| 442 if (!texture) { | 442 if (!texture) { |
| 443 return NULL; | 443 return NULL; |
| 444 } | 444 } |
| 445 fResourceCache->addResource(texture->getScratchKey(), texture); | 445 fResourceCache->addResource(texture->getScratchKey(), texture); |
| 446 return texture; | 446 return texture; |
| 447 } | 447 } |
| 448 | 448 |
| 449 GrTexture* GrContext::refScratchTexture(const GrTextureDesc& inDesc, ScratchTexM
atch match, | 449 GrTexture* GrContext::refScratchTexture(const GrSurfaceDesc& inDesc, ScratchTexM
atch match, |
| 450 bool calledDuringFlush) { | 450 bool calledDuringFlush) { |
| 451 // kNoStencil has no meaning if kRT isn't set. | 451 // kNoStencil has no meaning if kRT isn't set. |
| 452 SkASSERT((inDesc.fFlags & kRenderTarget_GrTextureFlagBit) || | 452 SkASSERT((inDesc.fFlags & kRenderTarget_GrSurfaceFlag) || |
| 453 !(inDesc.fFlags & kNoStencil_GrTextureFlagBit)); | 453 !(inDesc.fFlags & kNoStencil_GrSurfaceFlag)); |
| 454 | 454 |
| 455 // Make sure caller has checked for renderability if kRT is set. | 455 // Make sure caller has checked for renderability if kRT is set. |
| 456 SkASSERT(!(inDesc.fFlags & kRenderTarget_GrTextureFlagBit) || | 456 SkASSERT(!(inDesc.fFlags & kRenderTarget_GrSurfaceFlag) || |
| 457 this->isConfigRenderable(inDesc.fConfig, inDesc.fSampleCnt > 0)); | 457 this->isConfigRenderable(inDesc.fConfig, inDesc.fSampleCnt > 0)); |
| 458 | 458 |
| 459 SkTCopyOnFirstWrite<GrTextureDesc> desc(inDesc); | 459 SkTCopyOnFirstWrite<GrSurfaceDesc> desc(inDesc); |
| 460 | 460 |
| 461 if (fGpu->caps()->reuseScratchTextures() || (desc->fFlags & kRenderTarget_Gr
TextureFlagBit)) { | 461 if (fGpu->caps()->reuseScratchTextures() || (desc->fFlags & kRenderTarget_Gr
SurfaceFlag)) { |
| 462 GrTextureFlags origFlags = desc->fFlags; | 462 GrSurfaceFlags origFlags = desc->fFlags; |
| 463 if (kApprox_ScratchTexMatch == match) { | 463 if (kApprox_ScratchTexMatch == match) { |
| 464 // bin by pow2 with a reasonable min | 464 // bin by pow2 with a reasonable min |
| 465 static const int MIN_SIZE = 16; | 465 static const int MIN_SIZE = 16; |
| 466 GrTextureDesc* wdesc = desc.writable(); | 466 GrSurfaceDesc* wdesc = desc.writable(); |
| 467 wdesc->fWidth = SkTMax(MIN_SIZE, GrNextPow2(desc->fWidth)); | 467 wdesc->fWidth = SkTMax(MIN_SIZE, GrNextPow2(desc->fWidth)); |
| 468 wdesc->fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc->fHeight)); | 468 wdesc->fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc->fHeight)); |
| 469 } | 469 } |
| 470 | 470 |
| 471 do { | 471 do { |
| 472 GrResourceKey key = GrTexturePriv::ComputeScratchKey(*desc); | 472 GrResourceKey key = GrTexturePriv::ComputeScratchKey(*desc); |
| 473 uint32_t scratchFlags = 0; | 473 uint32_t scratchFlags = 0; |
| 474 if (calledDuringFlush) { | 474 if (calledDuringFlush) { |
| 475 scratchFlags = GrResourceCache2::kRequireNoPendingIO_ScratchFlag
; | 475 scratchFlags = GrResourceCache2::kRequireNoPendingIO_ScratchFlag
; |
| 476 } else if (!(desc->fFlags & kRenderTarget_GrTextureFlagBit)) { | 476 } else if (!(desc->fFlags & kRenderTarget_GrSurfaceFlag)) { |
| 477 // If it is not a render target then it will most likely be popu
lated by | 477 // If it is not a render target then it will most likely be popu
lated by |
| 478 // writePixels() which will trigger a flush if the texture has p
ending IO. | 478 // writePixels() which will trigger a flush if the texture has p
ending IO. |
| 479 scratchFlags = GrResourceCache2::kPreferNoPendingIO_ScratchFlag; | 479 scratchFlags = GrResourceCache2::kPreferNoPendingIO_ScratchFlag; |
| 480 } | 480 } |
| 481 GrGpuResource* resource = fResourceCache2->findAndRefScratchResource
(key, scratchFlags); | 481 GrGpuResource* resource = fResourceCache2->findAndRefScratchResource
(key, scratchFlags); |
| 482 if (resource) { | 482 if (resource) { |
| 483 fResourceCache->makeResourceMRU(resource); | 483 fResourceCache->makeResourceMRU(resource); |
| 484 return static_cast<GrTexture*>(resource); | 484 return static_cast<GrTexture*>(resource); |
| 485 } | 485 } |
| 486 | 486 |
| 487 if (kExact_ScratchTexMatch == match) { | 487 if (kExact_ScratchTexMatch == match) { |
| 488 break; | 488 break; |
| 489 } | 489 } |
| 490 // We had a cache miss and we are in approx mode, relax the fit of t
he flags. | 490 // We had a cache miss and we are in approx mode, relax the fit of t
he flags. |
| 491 | 491 |
| 492 // We no longer try to reuse textures that were previously used as r
ender targets in | 492 // We no longer try to reuse textures that were previously used as r
ender targets in |
| 493 // situations where no RT is needed; doing otherwise can confuse the
video driver and | 493 // situations where no RT is needed; doing otherwise can confuse the
video driver and |
| 494 // cause significant performance problems in some cases. | 494 // cause significant performance problems in some cases. |
| 495 if (desc->fFlags & kNoStencil_GrTextureFlagBit) { | 495 if (desc->fFlags & kNoStencil_GrSurfaceFlag) { |
| 496 desc.writable()->fFlags = desc->fFlags & ~kNoStencil_GrTextureFl
agBit; | 496 desc.writable()->fFlags = desc->fFlags & ~kNoStencil_GrSurfaceFl
ag; |
| 497 } else { | 497 } else { |
| 498 break; | 498 break; |
| 499 } | 499 } |
| 500 | 500 |
| 501 } while (true); | 501 } while (true); |
| 502 | 502 |
| 503 desc.writable()->fFlags = origFlags; | 503 desc.writable()->fFlags = origFlags; |
| 504 } | 504 } |
| 505 | 505 |
| 506 GrTexture* texture = this->createNewScratchTexture(*desc); | 506 GrTexture* texture = this->createNewScratchTexture(*desc); |
| 507 SkASSERT(NULL == texture || | 507 SkASSERT(NULL == texture || |
| 508 texture->getScratchKey() == GrTexturePriv::ComputeScratchKey(*desc)
); | 508 texture->getScratchKey() == GrTexturePriv::ComputeScratchKey(*desc)
); |
| 509 return texture; | 509 return texture; |
| 510 } | 510 } |
| 511 | 511 |
| 512 bool GrContext::OverbudgetCB(void* data) { | 512 bool GrContext::OverbudgetCB(void* data) { |
| 513 SkASSERT(data); | 513 SkASSERT(data); |
| 514 | 514 |
| 515 GrContext* context = reinterpret_cast<GrContext*>(data); | 515 GrContext* context = reinterpret_cast<GrContext*>(data); |
| 516 | 516 |
| 517 // Flush the InOrderDrawBuffer to possibly free up some textures | 517 // Flush the InOrderDrawBuffer to possibly free up some textures |
| 518 context->fFlushToReduceCacheSize = true; | 518 context->fFlushToReduceCacheSize = true; |
| 519 | 519 |
| 520 return true; | 520 return true; |
| 521 } | 521 } |
| 522 | 522 |
| 523 | 523 |
| 524 GrTexture* GrContext::createUncachedTexture(const GrTextureDesc& descIn, | 524 GrTexture* GrContext::createUncachedTexture(const GrSurfaceDesc& descIn, |
| 525 void* srcData, | 525 void* srcData, |
| 526 size_t rowBytes) { | 526 size_t rowBytes) { |
| 527 GrTextureDesc descCopy = descIn; | 527 GrSurfaceDesc descCopy = descIn; |
| 528 return fGpu->createTexture(descCopy, srcData, rowBytes); | 528 return fGpu->createTexture(descCopy, srcData, rowBytes); |
| 529 } | 529 } |
| 530 | 530 |
| 531 void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes
) const { | 531 void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes
) const { |
| 532 fResourceCache->getLimits(maxTextures, maxTextureBytes); | 532 fResourceCache->getLimits(maxTextures, maxTextureBytes); |
| 533 } | 533 } |
| 534 | 534 |
| 535 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ | 535 void GrContext::setResourceCacheLimits(int maxTextures, size_t maxTextureBytes)
{ |
| 536 fResourceCache->setLimits(maxTextures, maxTextureBytes); | 536 fResourceCache->setLimits(maxTextures, maxTextureBytes); |
| 537 } | 537 } |
| (...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 // config. This scratch will then have R and B swapped. We correct for this
by swapping again | 1308 // config. This scratch will then have R and B swapped. We correct for this
by swapping again |
| 1309 // when drawing the scratch to the dst using a conversion effect. | 1309 // when drawing the scratch to the dst using a conversion effect. |
| 1310 bool swapRAndB = false; | 1310 bool swapRAndB = false; |
| 1311 GrPixelConfig writeConfig = srcConfig; | 1311 GrPixelConfig writeConfig = srcConfig; |
| 1312 if (GrPixelConfigSwapRAndB(srcConfig) == | 1312 if (GrPixelConfigSwapRAndB(srcConfig) == |
| 1313 fGpu->preferredWritePixelsConfig(srcConfig, renderTarget->config())) { | 1313 fGpu->preferredWritePixelsConfig(srcConfig, renderTarget->config())) { |
| 1314 writeConfig = GrPixelConfigSwapRAndB(srcConfig); | 1314 writeConfig = GrPixelConfigSwapRAndB(srcConfig); |
| 1315 swapRAndB = true; | 1315 swapRAndB = true; |
| 1316 } | 1316 } |
| 1317 | 1317 |
| 1318 GrTextureDesc desc; | 1318 GrSurfaceDesc desc; |
| 1319 desc.fWidth = width; | 1319 desc.fWidth = width; |
| 1320 desc.fHeight = height; | 1320 desc.fHeight = height; |
| 1321 desc.fConfig = writeConfig; | 1321 desc.fConfig = writeConfig; |
| 1322 SkAutoTUnref<GrTexture> texture(this->refScratchTexture(desc, kApprox_Scratc
hTexMatch)); | 1322 SkAutoTUnref<GrTexture> texture(this->refScratchTexture(desc, kApprox_Scratc
hTexMatch)); |
| 1323 if (!texture) { | 1323 if (!texture) { |
| 1324 return false; | 1324 return false; |
| 1325 } | 1325 } |
| 1326 | 1326 |
| 1327 SkAutoTUnref<const GrFragmentProcessor> fp; | 1327 SkAutoTUnref<const GrFragmentProcessor> fp; |
| 1328 SkMatrix textureMatrix; | 1328 SkMatrix textureMatrix; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1445 return false; | 1445 return false; |
| 1446 } | 1446 } |
| 1447 | 1447 |
| 1448 // If the src is a texture and we would have to do conversions after read pi
xels, we instead | 1448 // If the src is a texture and we would have to do conversions after read pi
xels, we instead |
| 1449 // do the conversions by drawing the src to a scratch texture. If we handle
any of the | 1449 // do the conversions by drawing the src to a scratch texture. If we handle
any of the |
| 1450 // conversions in the draw we set the corresponding bool to false so that we
don't reapply it | 1450 // conversions in the draw we set the corresponding bool to false so that we
don't reapply it |
| 1451 // on the read back pixels. | 1451 // on the read back pixels. |
| 1452 GrTexture* src = target->asTexture(); | 1452 GrTexture* src = target->asTexture(); |
| 1453 if (src && (swapRAndB || unpremul || flipY)) { | 1453 if (src && (swapRAndB || unpremul || flipY)) { |
| 1454 // Make the scratch a render so we can read its pixels. | 1454 // Make the scratch a render so we can read its pixels. |
| 1455 GrTextureDesc desc; | 1455 GrSurfaceDesc desc; |
| 1456 desc.fFlags = kRenderTarget_GrTextureFlagBit; | 1456 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 1457 desc.fWidth = width; | 1457 desc.fWidth = width; |
| 1458 desc.fHeight = height; | 1458 desc.fHeight = height; |
| 1459 desc.fConfig = readConfig; | 1459 desc.fConfig = readConfig; |
| 1460 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | 1460 desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| 1461 | 1461 |
| 1462 // When a full read back is faster than a partial we could always make t
he scratch exactly | 1462 // When a full read back is faster than a partial we could always make t
he scratch exactly |
| 1463 // match the passed rect. However, if we see many different size rectang
les we will trash | 1463 // match the passed rect. However, if we see many different size rectang
les we will trash |
| 1464 // our texture cache and pay the cost of creating and destroying many te
xtures. So, we only | 1464 // our texture cache and pay the cost of creating and destroying many te
xtures. So, we only |
| 1465 // request an exact match when the caller is reading an entire RT. | 1465 // request an exact match when the caller is reading an entire RT. |
| 1466 ScratchTexMatch match = kApprox_ScratchTexMatch; | 1466 ScratchTexMatch match = kApprox_ScratchTexMatch; |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1801 fResourceCache->printStats(); | 1801 fResourceCache->printStats(); |
| 1802 } | 1802 } |
| 1803 #endif | 1803 #endif |
| 1804 | 1804 |
| 1805 #if GR_GPU_STATS | 1805 #if GR_GPU_STATS |
| 1806 const GrContext::GPUStats* GrContext::gpuStats() const { | 1806 const GrContext::GPUStats* GrContext::gpuStats() const { |
| 1807 return fGpu->gpuStats(); | 1807 return fGpu->gpuStats(); |
| 1808 } | 1808 } |
| 1809 #endif | 1809 #endif |
| 1810 | 1810 |
| OLD | NEW |