diff options
author | Greg Daniel <egdaniel@google.com> | 2018-02-13 15:34:14 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-02-14 14:07:47 +0000 |
commit | 8242c5c199f5d04e4209222b265f9e27f7c55fa7 (patch) | |
tree | a3d37070d9766419d7b71a307f3e8bfdfde267fd /src/gpu/GrProxyProvider.cpp | |
parent | b8ea6fb50713edf9b27eff11905255e5199fc432 (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/GrProxyProvider.cpp')
-rw-r--r-- | src/gpu/GrProxyProvider.cpp | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp index d051bfdc13..e520046e7c 100644 --- a/src/gpu/GrProxyProvider.cpp +++ b/src/gpu/GrProxyProvider.cpp @@ -252,28 +252,7 @@ sk_sp<GrTextureProxy> GrProxyProvider::createMipMapProxy(const GrSurfaceDesc& de return nullptr; } - // 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; - if (1 == mipCount) { - return this->createProxy(desc, SkBackingFit::kExact, budgeted); - } - - 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; - } - - sk_sp<GrTexture> tex(fResourceProvider->createTexture(desc, budgeted, - texels.get(), mipCount, - SkDestinationSurfaceColorMode::kLegacy)); - if (!tex) { - return nullptr; - } - - return this->createWrapped(std::move(tex), desc.fOrigin); + return this->createProxy(desc, GrMipMapped::kYes, SkBackingFit::kExact, budgeted, 0); } sk_sp<GrTextureProxy> GrProxyProvider::createMipMapProxyFromBitmap(const SkBitmap& bitmap, @@ -361,12 +340,21 @@ sk_sp<GrTextureProxy> GrProxyProvider::createMipMapProxyFromBitmap(const SkBitma } sk_sp<GrTextureProxy> GrProxyProvider::createProxy(const GrSurfaceDesc& desc, + GrMipMapped mipMapped, SkBackingFit fit, SkBudgeted budgeted, uint32_t flags) { SkASSERT(0 == flags || GrResourceProvider::kNoPendingIO_Flag == flags); - if (!this->caps()->validateSurfaceDesc(desc, GrMipMapped::kNo)) { + if (GrMipMapped::kYes == mipMapped) { + // 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; + if (1 == mipCount) { + mipMapped = GrMipMapped::kNo; + } + } + + if (!this->caps()->validateSurfaceDesc(desc, mipMapped)) { return nullptr; } GrSurfaceDesc copyDesc = desc; @@ -379,10 +367,12 @@ sk_sp<GrTextureProxy> GrProxyProvider::createProxy(const GrSurfaceDesc& desc, // We know anything we instantiate later from this deferred path will be // both texturable and renderable return sk_sp<GrTextureProxy>( - new GrTextureRenderTargetProxy(*this->caps(), copyDesc, fit, budgeted, flags)); + new GrTextureRenderTargetProxy(*this->caps(), copyDesc, mipMapped, fit, budgeted, + flags)); } - return sk_sp<GrTextureProxy>(new GrTextureProxy(copyDesc, fit, budgeted, nullptr, 0, flags)); + return sk_sp<GrTextureProxy>(new GrTextureProxy(copyDesc, mipMapped, fit, budgeted, nullptr, 0, + flags)); } sk_sp<GrTextureProxy> GrProxyProvider::createWrappedTextureProxy( |