aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrSurfaceProxy.cpp
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2018-02-15 13:06:26 -0500
committerGravatar Greg Daniel <egdaniel@google.com>2018-02-15 20:13:32 +0000
commitf6f7b67ac230b14a725fbdabe951c70ea5b4428f (patch)
treea75cefe0e22e69aeaa9a862714818d4684afddc3 /src/gpu/GrSurfaceProxy.cpp
parent602836138e02935885c77f9dd93dcb51a3ec9a64 (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.cpp31
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;