aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrSurfaceProxy.cpp
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2018-02-13 15:34:14 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-02-14 14:07:47 +0000
commit8242c5c199f5d04e4209222b265f9e27f7c55fa7 (patch)
treea3d37070d9766419d7b71a307f3e8bfdfde267fd /src/gpu/GrSurfaceProxy.cpp
parentb8ea6fb50713edf9b27eff11905255e5199fc432 (diff)
When creating emptyp MipMap proxies, don't instantiate them immediately.
This chnages makes it match how we handle non mipped proxies where we don't actually instantiate them until we need to. Bug: skia: Change-Id: Id0c50eefce43ef1458a3ff0bb1881a817b045279 Reviewed-on: https://skia-review.googlesource.com/106966 Commit-Queue: Greg Daniel <egdaniel@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/GrSurfaceProxy.cpp')
-rw-r--r--src/gpu/GrSurfaceProxy.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/gpu/GrSurfaceProxy.cpp b/src/gpu/GrSurfaceProxy.cpp
index 48d4be1c8a..5b20ca5146 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,30 @@ 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);
} 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;