| Index: src/gpu/GrContext.cpp
|
| diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
|
| index a4679a923c75bac501b92302947c69c1123fede8..98e78d9926e08443dd1f06ed171374f9ae3ecb22 100755
|
| --- a/src/gpu/GrContext.cpp
|
| +++ b/src/gpu/GrContext.cpp
|
| @@ -23,6 +23,7 @@
|
| #include "GrOvalRenderer.h"
|
| #include "GrPathRenderer.h"
|
| #include "GrPathUtils.h"
|
| +#include "GrRenderTargetPriv.h"
|
| #include "GrResourceCache.h"
|
| #include "GrSoftwarePathRenderer.h"
|
| #include "GrStencilAndCoverTextContext.h"
|
| @@ -213,9 +214,11 @@ GrTextContext* GrContext::createTextContext(GrRenderTarget* renderTarget,
|
| const SkDeviceProperties&
|
| leakyProperties,
|
| bool enableDistanceFieldFonts) {
|
| - if (fGpu->caps()->pathRenderingSupport() && renderTarget->getStencilBuffer() &&
|
| - renderTarget->isMultisampled()) {
|
| - return GrStencilAndCoverTextContext::Create(this, leakyProperties);
|
| + if (fGpu->caps()->pathRenderingSupport() && renderTarget->isMultisampled()) {
|
| + GrStencilBuffer* sb = renderTarget->renderTargetPriv().attachStencilBuffer();
|
| + if (sb) {
|
| + return GrStencilAndCoverTextContext::Create(this, leakyProperties);
|
| + }
|
| }
|
|
|
| return GrDistanceFieldTextContext::Create(this, leakyProperties, enableDistanceFieldFonts);
|
| @@ -278,14 +281,10 @@ GrTexture* GrContext::refScratchTexture(const GrSurfaceDesc& desc, ScratchTexMat
|
|
|
| GrTexture* GrContext::internalRefScratchTexture(const GrSurfaceDesc& inDesc, uint32_t flags) {
|
| SkASSERT(!GrPixelConfigIsCompressed(inDesc.fConfig));
|
| - // kNoStencil has no meaning if kRT isn't set.
|
| - SkASSERT((inDesc.fFlags & kRenderTarget_GrSurfaceFlag) ||
|
| - !(inDesc.fFlags & kNoStencil_GrSurfaceFlag));
|
|
|
| SkTCopyOnFirstWrite<GrSurfaceDesc> desc(inDesc);
|
|
|
| if (fGpu->caps()->reuseScratchTextures() || (desc->fFlags & kRenderTarget_GrSurfaceFlag)) {
|
| - GrSurfaceFlags origFlags = desc->fFlags;
|
| if (!(kExact_ScratchTextureFlag & flags)) {
|
| // bin by pow2 with a reasonable min
|
| static const int MIN_SIZE = 16;
|
| @@ -294,44 +293,25 @@ GrTexture* GrContext::internalRefScratchTexture(const GrSurfaceDesc& inDesc, uin
|
| wdesc->fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc->fHeight));
|
| }
|
|
|
| - do {
|
| - GrScratchKey key;
|
| - GrTexturePriv::ComputeScratchKey(*desc, &key);
|
| - uint32_t scratchFlags = 0;
|
| - if (kNoPendingIO_ScratchTextureFlag & flags) {
|
| - scratchFlags = GrResourceCache::kRequireNoPendingIO_ScratchFlag;
|
| - } else if (!(desc->fFlags & kRenderTarget_GrSurfaceFlag)) {
|
| - // If it is not a render target then it will most likely be populated by
|
| - // writePixels() which will trigger a flush if the texture has pending IO.
|
| - scratchFlags = GrResourceCache::kPreferNoPendingIO_ScratchFlag;
|
| - }
|
| - GrGpuResource* resource = fResourceCache->findAndRefScratchResource(key, scratchFlags);
|
| - if (resource) {
|
| - GrSurface* surface = static_cast<GrSurface*>(resource);
|
| - GrRenderTarget* rt = surface->asRenderTarget();
|
| - if (rt && fGpu->caps()->discardRenderTargetSupport()) {
|
| - rt->discard();
|
| - }
|
| - return surface->asTexture();
|
| - }
|
| -
|
| - if (kExact_ScratchTextureFlag & flags) {
|
| - break;
|
| - }
|
| - // We had a cache miss and we are in approx mode, relax the fit of the flags.
|
| -
|
| - // We no longer try to reuse textures that were previously used as render targets in
|
| - // situations where no RT is needed; doing otherwise can confuse the video driver and
|
| - // cause significant performance problems in some cases.
|
| - if (desc->fFlags & kNoStencil_GrSurfaceFlag) {
|
| - desc.writable()->fFlags = desc->fFlags & ~kNoStencil_GrSurfaceFlag;
|
| - } else {
|
| - break;
|
| + GrScratchKey key;
|
| + GrTexturePriv::ComputeScratchKey(*desc, &key);
|
| + uint32_t scratchFlags = 0;
|
| + if (kNoPendingIO_ScratchTextureFlag & flags) {
|
| + scratchFlags = GrResourceCache::kRequireNoPendingIO_ScratchFlag;
|
| + } else if (!(desc->fFlags & kRenderTarget_GrSurfaceFlag)) {
|
| + // If it is not a render target then it will most likely be populated by
|
| + // writePixels() which will trigger a flush if the texture has pending IO.
|
| + scratchFlags = GrResourceCache::kPreferNoPendingIO_ScratchFlag;
|
| + }
|
| + GrGpuResource* resource = fResourceCache->findAndRefScratchResource(key, scratchFlags);
|
| + if (resource) {
|
| + GrSurface* surface = static_cast<GrSurface*>(resource);
|
| + GrRenderTarget* rt = surface->asRenderTarget();
|
| + if (rt && fGpu->caps()->discardRenderTargetSupport()) {
|
| + rt->discard();
|
| }
|
| -
|
| - } while (true);
|
| -
|
| - desc.writable()->fFlags = origFlags;
|
| + return surface->asTexture();
|
| + }
|
| }
|
|
|
| if (!(kNoCreate_ScratchTextureFlag & flags)) {
|
|
|