| /* | |
| * Copyright 2021 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/gpu/graphite/TextureProxy.h" | |
| #include "src/core/SkMipmap.h" | |
| #include "src/gpu/graphite/Caps.h" | |
| #include "src/gpu/graphite/ResourceProvider.h" | |
| #include "src/gpu/graphite/Texture.h" | |
| namespace skgpu::graphite { | |
| TextureProxy::TextureProxy(SkISize dimensions, const TextureInfo& info, skgpu::Budgeted budgeted) | |
| : fDimensions(dimensions), fInfo(info), fBudgeted(budgeted), fVolatile(Volatile::kNo) { | |
| SkASSERT(fInfo.isValid()); | |
| } | |
| TextureProxy::TextureProxy(sk_sp<Texture> texture) | |
| : fDimensions(texture->dimensions()) | |
| , fInfo(texture->textureInfo()) | |
| , fBudgeted(texture->budgeted()) | |
| , fVolatile(Volatile::kNo) | |
| , fTexture(std::move(texture)) { | |
| SkASSERT(fInfo.isValid()); | |
| } | |
| TextureProxy::TextureProxy(SkISize dimensions, | |
| const TextureInfo& textureInfo, | |
| skgpu::Budgeted budgeted, | |
| Volatile isVolatile, | |
| LazyInstantiateCallback&& callback) | |
| : fDimensions(dimensions) | |
| , fInfo(textureInfo) | |
| , fBudgeted(budgeted) | |
| , fVolatile(isVolatile) | |
| , fLazyInstantiateCallback(std::move(callback)) { | |
| SkASSERT(fInfo.isValid()); | |
| SkASSERT(fLazyInstantiateCallback); | |
| } | |
| TextureProxy::~TextureProxy() {} | |
| SkISize TextureProxy::dimensions() const { | |
| SkASSERT(!this->isFullyLazy() || this->isInstantiated()); | |
| return this->isInstantiated() ? fTexture->dimensions() : fDimensions; | |
| } | |
| bool TextureProxy::isLazy() const { | |
| return SkToBool(fLazyInstantiateCallback); | |
| } | |
| bool TextureProxy::isFullyLazy() const { | |
| bool result = fDimensions.width() < 0; | |
| SkASSERT(result == (fDimensions.height() < 0)); | |
| SkASSERT(!result || this->isLazy()); | |
| return result; | |
| } | |
| bool TextureProxy::isVolatile() const { | |
| SkASSERT(fVolatile == Volatile::kNo || SkToBool(fLazyInstantiateCallback)); | |
| return fVolatile == Volatile::kYes; | |
| } | |
| bool TextureProxy::instantiate(ResourceProvider* resourceProvider) { | |
| SkASSERT(!this->isLazy()); | |
| if (fTexture) { | |
| return true; | |
| } | |
| fTexture = resourceProvider->findOrCreateScratchTexture(fDimensions, fInfo, fBudgeted); | |
| if (!fTexture) { | |
| return false; | |
| } | |
| SkDEBUGCODE(this->validateTexture(fTexture.get())); | |
| return true; | |
| } | |
| bool TextureProxy::lazyInstantiate(ResourceProvider* resourceProvider) { | |
| SkASSERT(this->isLazy()); | |
| if (fTexture) { | |
| return true; | |
| } | |
| fTexture = fLazyInstantiateCallback(resourceProvider); | |
| if (!fTexture) { | |
| return false; | |
| } | |
| SkDEBUGCODE(this->validateTexture(fTexture.get())); | |
| return true; | |
| } | |
| bool TextureProxy::InstantiateIfNotLazy(ResourceProvider* resourceProvider, | |
| TextureProxy* textureProxy) { | |
| if (textureProxy->isLazy()) { | |
| return true; | |
| } | |
| return textureProxy->instantiate(resourceProvider); | |
| } | |
| void TextureProxy::deinstantiate() { | |
| SkASSERT(fVolatile == Volatile::kYes && SkToBool(fLazyInstantiateCallback)); | |
| fTexture.reset(); | |
| } | |
| sk_sp<Texture> TextureProxy::refTexture() const { | |
| return fTexture; | |
| } | |
| const Texture* TextureProxy::texture() const { | |
| return fTexture.get(); | |
| } | |
| sk_sp<TextureProxy> TextureProxy::Make(const Caps* caps, | |
| SkISize dimensions, | |
| SkColorType colorType, | |
| Mipmapped mipmapped, | |
| Protected isProtected, | |
| Renderable renderable, | |
| skgpu::Budgeted budgeted) { | |
| if (dimensions.width() < 1 || dimensions.height() < 1) { | |
| return nullptr; | |
| } | |
| TextureInfo textureInfo = caps->getDefaultSampledTextureInfo(colorType, | |
| mipmapped, | |
| isProtected, | |
| renderable); | |
| if (!textureInfo.isValid()) { | |
| return nullptr; | |
| } | |
| return sk_make_sp<TextureProxy>(dimensions, textureInfo, budgeted); | |
| } | |
| sk_sp<TextureProxy> TextureProxy::MakeLazy(SkISize dimensions, | |
| const TextureInfo& textureInfo, | |
| skgpu::Budgeted budgeted, | |
| Volatile isVolatile, | |
| LazyInstantiateCallback&& callback) { | |
| SkASSERT(textureInfo.isValid()); | |
| return sk_sp<TextureProxy>(new TextureProxy(dimensions, textureInfo, budgeted, | |
| isVolatile, std::move(callback))); | |
| } | |
| sk_sp<TextureProxy> TextureProxy::MakeFullyLazy(const TextureInfo& textureInfo, | |
| skgpu::Budgeted budgeted, | |
| Volatile isVolatile, | |
| LazyInstantiateCallback&& callback) { | |
| return MakeLazy(SkISize::Make(-1, -1), textureInfo, budgeted, isVolatile, std::move(callback)); | |
| } | |
| #ifdef SK_DEBUG | |
| void TextureProxy::validateTexture(const Texture* texture) { | |
| SkASSERT(this->isFullyLazy() || fDimensions == texture->dimensions()); | |
| SkASSERT(fInfo == texture->textureInfo()); | |
| } | |
| #endif | |
| } // namespace skgpu::graphite |