diff options
author | Greg Daniel <egdaniel@google.com> | 2018-02-15 13:06:26 -0500 |
---|---|---|
committer | Greg Daniel <egdaniel@google.com> | 2018-02-15 20:13:32 +0000 |
commit | f6f7b67ac230b14a725fbdabe951c70ea5b4428f (patch) | |
tree | a75cefe0e22e69aeaa9a862714818d4684afddc3 /src/gpu/GrSurfaceProxy.cpp | |
parent | 602836138e02935885c77f9dd93dcb51a3ec9a64 (diff) |
When creating emptyp MipMap proxies, don't instantiate them immediately. Attempt 3
original: https://skia-review.googlesource.com/106966
Bug: skia:
Change-Id: I779985cef2d3c4f36a0129d8ecedd12e510bec7e
Reviewed-on: https://skia-review.googlesource.com/107781
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/gpu/GrSurfaceProxy.cpp')
-rw-r--r-- | src/gpu/GrSurfaceProxy.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/gpu/GrSurfaceProxy.cpp b/src/gpu/GrSurfaceProxy.cpp index 48d4be1c8a..800b44723c 100644 --- a/src/gpu/GrSurfaceProxy.cpp +++ b/src/gpu/GrSurfaceProxy.cpp @@ -117,7 +117,6 @@ sk_sp<GrSurface> GrSurfaceProxy::createSurfaceImpl( GrSurfaceFlags flags, GrMipMapped mipMapped) const { SkASSERT(GrSurfaceProxy::LazyState::kNot == this->lazyInstantiationState()); SkASSERT(!fTarget); - SkASSERT(GrMipMapped::kNo == mipMapped); GrSurfaceDesc desc; desc.fFlags = flags; if (fNeedsClear) { @@ -130,10 +129,34 @@ sk_sp<GrSurface> GrSurfaceProxy::createSurfaceImpl( desc.fSampleCnt = sampleCnt; sk_sp<GrSurface> surface; - if (SkBackingFit::kApprox == fFit) { - surface.reset(resourceProvider->createApproxTexture(desc, fFlags).release()); + if (GrMipMapped::kYes == mipMapped) { + SkASSERT(SkBackingFit::kExact == fFit); + + // SkMipMap doesn't include the base level in the level count so we have to add 1 + int mipCount = SkMipMap::ComputeLevelCount(desc.fWidth, desc.fHeight) + 1; + // We should have caught the case where mipCount == 1 when making the proxy and instead + // created a non-mipmapped proxy. + SkASSERT(mipCount > 1); + std::unique_ptr<GrMipLevel[]> texels(new GrMipLevel[mipCount]); + + // We don't want to upload any texel data + for (int i = 0; i < mipCount; i++) { + texels[i].fPixels = nullptr; + texels[i].fRowBytes = 0; + } + + surface = resourceProvider->createTexture(desc, fBudgeted, texels.get(), mipCount, + SkDestinationSurfaceColorMode::kLegacy); + if (surface) { + SkASSERT(surface->asTexture()); + SkASSERT(GrMipMapped::kYes == surface->asTexture()->texturePriv().mipMapped()); + } } else { - surface.reset(resourceProvider->createTexture(desc, fBudgeted, fFlags).release()); + if (SkBackingFit::kApprox == fFit) { + surface = resourceProvider->createApproxTexture(desc, fFlags); + } else { + surface = resourceProvider->createTexture(desc, fBudgeted, fFlags); + } } if (!surface) { return nullptr; |