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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 } | 291 } |
292 } | 292 } |
293 | 293 |
294 GrSurfaceDesc rtDesc = desc; | 294 GrSurfaceDesc rtDesc = desc; |
295 rtDesc.fFlags = rtDesc.fFlags | | 295 rtDesc.fFlags = rtDesc.fFlags | |
296 kRenderTarget_GrSurfaceFlag | | 296 kRenderTarget_GrSurfaceFlag | |
297 kNoStencil_GrSurfaceFlag; | 297 kNoStencil_GrSurfaceFlag; |
298 rtDesc.fWidth = GrNextPow2(desc.fWidth); | 298 rtDesc.fWidth = GrNextPow2(desc.fWidth); |
299 rtDesc.fHeight = GrNextPow2(desc.fHeight); | 299 rtDesc.fHeight = GrNextPow2(desc.fHeight); |
300 | 300 |
301 GrTexture* texture = fGpu->createTexture(rtDesc, NULL, 0); | 301 GrTexture* texture = fGpu->createTexture(rtDesc, true, NULL, 0); |
302 | 302 |
303 if (texture) { | 303 if (texture) { |
304 GrDrawState drawState; | 304 GrDrawState drawState; |
305 drawState.setRenderTarget(texture->asRenderTarget()); | 305 drawState.setRenderTarget(texture->asRenderTarget()); |
306 | 306 |
307 // if filtering is not desired then we want to ensure all | 307 // if filtering is not desired then we want to ensure all |
308 // texels in the resampled image are copies of texels from | 308 // texels in the resampled image are copies of texels from |
309 // the original. | 309 // the original. |
310 GrTextureParams params(SkShader::kClamp_TileMode, | 310 GrTextureParams params(SkShader::kClamp_TileMode, |
311 filter ? GrTextureParams::kBilerp_FilterMode : | 311 filter ? GrTextureParams::kBilerp_FilterMode : |
(...skipping 28 matching lines...) Expand all Loading... |
340 // We shouldn't be resizing a compressed texture. | 340 // We shouldn't be resizing a compressed texture. |
341 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); | 341 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); |
342 | 342 |
343 size_t bpp = GrBytesPerPixel(desc.fConfig); | 343 size_t bpp = GrBytesPerPixel(desc.fConfig); |
344 GrAutoMalloc<128*128*4> stretchedPixels(bpp * rtDesc.fWidth * rtDesc.fHe
ight); | 344 GrAutoMalloc<128*128*4> stretchedPixels(bpp * rtDesc.fWidth * rtDesc.fHe
ight); |
345 stretch_image(stretchedPixels.get(), rtDesc.fWidth, rtDesc.fHeight, | 345 stretch_image(stretchedPixels.get(), rtDesc.fWidth, rtDesc.fHeight, |
346 srcData, desc.fWidth, desc.fHeight, bpp); | 346 srcData, desc.fWidth, desc.fHeight, bpp); |
347 | 347 |
348 size_t stretchedRowBytes = rtDesc.fWidth * bpp; | 348 size_t stretchedRowBytes = rtDesc.fWidth * bpp; |
349 | 349 |
350 texture = fGpu->createTexture(rtDesc, stretchedPixels.get(), stretchedRo
wBytes); | 350 texture = fGpu->createTexture(rtDesc, true, stretchedPixels.get(), stret
chedRowBytes); |
351 SkASSERT(texture); | 351 SkASSERT(texture); |
352 } | 352 } |
353 | 353 |
354 return texture; | 354 return texture; |
355 } | 355 } |
356 | 356 |
357 GrTexture* GrContext::createTexture(const GrTextureParams* params, | 357 GrTexture* GrContext::createTexture(const GrTextureParams* params, |
358 const GrSurfaceDesc& desc, | 358 const GrSurfaceDesc& desc, |
359 const GrCacheID& cacheID, | 359 const GrCacheID& cacheID, |
360 const void* srcData, | 360 const void* srcData, |
361 size_t rowBytes, | 361 size_t rowBytes, |
362 GrResourceKey* cacheKey) { | 362 GrResourceKey* cacheKey) { |
363 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); | 363 GrResourceKey resourceKey = GrTexturePriv::ComputeKey(fGpu, params, desc, ca
cheID); |
364 | 364 |
365 GrTexture* texture; | 365 GrTexture* texture; |
366 if (GrTexturePriv::NeedsResizing(resourceKey)) { | 366 if (GrTexturePriv::NeedsResizing(resourceKey)) { |
367 // We do not know how to resize compressed textures. | 367 // We do not know how to resize compressed textures. |
368 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); | 368 SkASSERT(!GrPixelConfigIsCompressed(desc.fConfig)); |
369 | 369 |
370 texture = this->createResizedTexture(desc, cacheID, | 370 texture = this->createResizedTexture(desc, cacheID, |
371 srcData, rowBytes, | 371 srcData, rowBytes, |
372 GrTexturePriv::NeedsBilerp(resource
Key)); | 372 GrTexturePriv::NeedsBilerp(resource
Key)); |
373 } else { | 373 } else { |
374 texture = fGpu->createTexture(desc, srcData, rowBytes); | 374 texture = fGpu->createTexture(desc, true, srcData, rowBytes); |
375 } | 375 } |
376 | 376 |
377 if (texture) { | 377 if (texture) { |
378 if (texture->cacheAccess().setContentKey(resourceKey)) { | 378 if (texture->cacheAccess().setContentKey(resourceKey)) { |
379 if (cacheKey) { | 379 if (cacheKey) { |
380 *cacheKey = resourceKey; | 380 *cacheKey = resourceKey; |
381 } | 381 } |
382 } else { | 382 } else { |
383 texture->unref(); | 383 texture->unref(); |
384 texture = NULL; | 384 texture = NULL; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 desc.writable()->fFlags = desc->fFlags & ~kNoStencil_GrSurfaceFl
ag; | 438 desc.writable()->fFlags = desc->fFlags & ~kNoStencil_GrSurfaceFl
ag; |
439 } else { | 439 } else { |
440 break; | 440 break; |
441 } | 441 } |
442 | 442 |
443 } while (true); | 443 } while (true); |
444 | 444 |
445 desc.writable()->fFlags = origFlags; | 445 desc.writable()->fFlags = origFlags; |
446 } | 446 } |
447 | 447 |
448 GrTexture* texture = fGpu->createTexture(*desc, NULL, 0); | 448 GrTexture* texture = fGpu->createTexture(*desc, true, NULL, 0); |
449 #ifdef SK_DEBUG | 449 #ifdef SK_DEBUG |
450 GrScratchKey key; | 450 GrScratchKey key; |
451 GrTexturePriv::ComputeScratchKey(*desc, &key); | 451 GrTexturePriv::ComputeScratchKey(*desc, &key); |
452 SkASSERT(NULL == texture || texture->cacheAccess().getScratchKey() == key); | 452 SkASSERT(NULL == texture || texture->cacheAccess().getScratchKey() == key); |
453 #endif | 453 #endif |
454 return texture; | 454 return texture; |
455 } | 455 } |
456 | 456 |
457 void GrContext::OverBudgetCB(void* data) { | 457 void GrContext::OverBudgetCB(void* data) { |
458 SkASSERT(data); | 458 SkASSERT(data); |
459 | 459 |
460 GrContext* context = reinterpret_cast<GrContext*>(data); | 460 GrContext* context = reinterpret_cast<GrContext*>(data); |
461 | 461 |
462 // Flush the InOrderDrawBuffer to possibly free up some textures | 462 // Flush the InOrderDrawBuffer to possibly free up some textures |
463 context->fFlushToReduceCacheSize = true; | 463 context->fFlushToReduceCacheSize = true; |
464 } | 464 } |
465 | 465 |
466 | 466 |
467 GrTexture* GrContext::createUncachedTexture(const GrSurfaceDesc& descIn, | 467 GrTexture* GrContext::createUncachedTexture(const GrSurfaceDesc& desc, |
468 void* srcData, | 468 void* srcData, |
469 size_t rowBytes) { | 469 size_t rowBytes) { |
470 GrSurfaceDesc descCopy = descIn; | 470 return fGpu->createTexture(desc, false, srcData, rowBytes); |
471 GrTexture* texture = fGpu->createTexture(descCopy, srcData, rowBytes); | |
472 if (texture) { | |
473 // TODO: It'd be nice to be able to do this before creation so we don't
boot something | |
474 // out of the cache. We could temporarily boost the cache budget. | |
475 texture->cacheAccess().setBudgeted(false); | |
476 } | |
477 return texture; | |
478 } | 471 } |
479 | 472 |
480 void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes
) const { | 473 void GrContext::getResourceCacheLimits(int* maxTextures, size_t* maxTextureBytes
) const { |
481 if (maxTextures) { | 474 if (maxTextures) { |
482 *maxTextures = fResourceCache2->getMaxResourceCount(); | 475 *maxTextures = fResourceCache2->getMaxResourceCount(); |
483 } | 476 } |
484 if (maxTextureBytes) { | 477 if (maxTextureBytes) { |
485 *maxTextureBytes = fResourceCache2->getMaxResourceBytes(); | 478 *maxTextureBytes = fResourceCache2->getMaxResourceBytes(); |
486 } | 479 } |
487 } | 480 } |
(...skipping 1263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 fResourceCache2->printStats(); | 1744 fResourceCache2->printStats(); |
1752 } | 1745 } |
1753 #endif | 1746 #endif |
1754 | 1747 |
1755 #if GR_GPU_STATS | 1748 #if GR_GPU_STATS |
1756 const GrContext::GPUStats* GrContext::gpuStats() const { | 1749 const GrContext::GPUStats* GrContext::gpuStats() const { |
1757 return fGpu->gpuStats(); | 1750 return fGpu->gpuStats(); |
1758 } | 1751 } |
1759 #endif | 1752 #endif |
1760 | 1753 |
OLD | NEW |