/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tests/Test.h" #include "include/gpu/graphite/BackendTexture.h" #include "include/gpu/graphite/Context.h" #include "include/gpu/graphite/Recorder.h" #include "src/gpu/graphite/Caps.h" #include "src/gpu/graphite/ContextPriv.h" #include "src/gpu/graphite/RecorderPriv.h" #include "src/gpu/graphite/ResourceProvider.h" #include "src/gpu/graphite/Texture.h" #include "src/gpu/graphite/TextureProxy.h" namespace skgpu::graphite { DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(GraphiteTextureProxyTest, reporter, context) { const Caps* caps = context->priv().caps(); constexpr SkISize kValidSize = SkISize::Make(1, 1); constexpr SkISize kInvalidSize = SkISize::MakeEmpty(); constexpr SkColorType kValidColorType = kRGBA_8888_SkColorType; constexpr SkColorType kInvalidColorType = kUnknown_SkColorType; std::unique_ptr recorder = context->makeRecorder(); ResourceProvider* resourceProvider = recorder->priv().resourceProvider(); const TextureInfo textureInfo = caps->getDefaultSampledTextureInfo( kValidColorType, Mipmapped::kNo, Protected::kNo, Renderable::kNo); const BackendTexture backendTexture = recorder->createBackendTexture(kValidSize, textureInfo); sk_sp texture = resourceProvider->createWrappedTexture(backendTexture); auto nullCallback = [](ResourceProvider*) -> sk_sp { return nullptr; }; auto callback = [texture](ResourceProvider*) -> sk_sp { return texture; }; // Assign to assignableTexture before instantiating with this callback. sk_sp assignableTexture; auto assignableCallback = [&assignableTexture](ResourceProvider*) -> sk_sp { return assignableTexture; }; // Invalid parameters. sk_sp textureProxy; textureProxy = TextureProxy::Make(caps, kInvalidSize, kValidColorType, Mipmapped::kNo, Protected::kNo, Renderable::kNo, skgpu::Budgeted::kNo); REPORTER_ASSERT(reporter, textureProxy == nullptr); textureProxy = TextureProxy::Make(caps, kValidSize, kInvalidColorType, Mipmapped::kNo, Protected::kNo, Renderable::kNo, skgpu::Budgeted::kNo); REPORTER_ASSERT(reporter, textureProxy == nullptr); // Non-lazy TextureProxy, successful instantiation. textureProxy = TextureProxy::Make(caps, kValidSize, kValidColorType, Mipmapped::kNo, Protected::kNo, Renderable::kNo, skgpu::Budgeted::kNo); REPORTER_ASSERT(reporter, !textureProxy->isLazy()); REPORTER_ASSERT(reporter, !textureProxy->isFullyLazy()); REPORTER_ASSERT(reporter, !textureProxy->isVolatile()); REPORTER_ASSERT(reporter, !textureProxy->isInstantiated()); REPORTER_ASSERT(reporter, textureProxy->dimensions() == kValidSize); bool instantiateSuccess = textureProxy->instantiate(resourceProvider); REPORTER_ASSERT(reporter, instantiateSuccess); REPORTER_ASSERT(reporter, textureProxy->isInstantiated()); REPORTER_ASSERT(reporter, textureProxy->dimensions() == kValidSize); const Texture* createdTexture = textureProxy->texture(); instantiateSuccess = textureProxy->instantiate(resourceProvider); REPORTER_ASSERT(reporter, instantiateSuccess); REPORTER_ASSERT(reporter, textureProxy->texture() == createdTexture); // Lazy, non-volatile TextureProxy, unsuccessful instantiation. textureProxy = TextureProxy::MakeLazy( kValidSize, textureInfo, skgpu::Budgeted::kNo, Volatile::kNo, nullCallback); REPORTER_ASSERT(reporter, textureProxy->isLazy()); REPORTER_ASSERT(reporter, !textureProxy->isFullyLazy()); REPORTER_ASSERT(reporter, !textureProxy->isVolatile()); instantiateSuccess = textureProxy->lazyInstantiate(resourceProvider); REPORTER_ASSERT(reporter, !instantiateSuccess); REPORTER_ASSERT(reporter, !textureProxy->isInstantiated()); // Lazy, non-volatile TextureProxy, successful instantiation. textureProxy = TextureProxy::MakeLazy( kValidSize, textureInfo, skgpu::Budgeted::kNo, Volatile::kNo, callback); instantiateSuccess = textureProxy->lazyInstantiate(resourceProvider); REPORTER_ASSERT(reporter, instantiateSuccess); REPORTER_ASSERT(reporter, textureProxy->texture() == texture.get()); // Lazy, volatile TextureProxy, unsuccessful instantiation. textureProxy = TextureProxy::MakeLazy( kValidSize, textureInfo, skgpu::Budgeted::kNo, Volatile::kYes, nullCallback); REPORTER_ASSERT(reporter, textureProxy->isLazy()); REPORTER_ASSERT(reporter, !textureProxy->isFullyLazy()); REPORTER_ASSERT(reporter, textureProxy->isVolatile()); instantiateSuccess = textureProxy->lazyInstantiate(resourceProvider); REPORTER_ASSERT(reporter, !instantiateSuccess); REPORTER_ASSERT(reporter, !textureProxy->isInstantiated()); // Lazy, volatile TextureProxy, successful instantiation. textureProxy = TextureProxy::MakeLazy( kValidSize, textureInfo, skgpu::Budgeted::kNo, Volatile::kYes, callback); instantiateSuccess = textureProxy->lazyInstantiate(resourceProvider); REPORTER_ASSERT(reporter, instantiateSuccess); REPORTER_ASSERT(reporter, textureProxy->texture() == texture.get()); textureProxy->deinstantiate(); REPORTER_ASSERT(reporter, !textureProxy->isInstantiated()); // Fully-lazy TextureProxy. textureProxy = TextureProxy::MakeFullyLazy( textureInfo, skgpu::Budgeted::kNo, Volatile::kYes, assignableCallback); REPORTER_ASSERT(reporter, textureProxy->isLazy()); REPORTER_ASSERT(reporter, textureProxy->isFullyLazy()); REPORTER_ASSERT(reporter, textureProxy->isVolatile()); assignableTexture = texture; instantiateSuccess = textureProxy->lazyInstantiate(resourceProvider); REPORTER_ASSERT(reporter, instantiateSuccess); REPORTER_ASSERT(reporter, textureProxy->isInstantiated()); REPORTER_ASSERT(reporter, textureProxy->isFullyLazy()); REPORTER_ASSERT(reporter, textureProxy->dimensions() == kValidSize); textureProxy->deinstantiate(); REPORTER_ASSERT(reporter, !textureProxy->isInstantiated()); REPORTER_ASSERT(reporter, textureProxy->isFullyLazy()); constexpr SkISize kLargerSize = SkISize::Make(2, 2); const BackendTexture largerBackendTexture = recorder->createBackendTexture(kLargerSize, textureInfo); assignableTexture = resourceProvider->createWrappedTexture(largerBackendTexture); instantiateSuccess = textureProxy->lazyInstantiate(resourceProvider); REPORTER_ASSERT(reporter, instantiateSuccess); REPORTER_ASSERT(reporter, textureProxy->dimensions() == kLargerSize); // InstantiateIfNotLazy tests. textureProxy = TextureProxy::Make(caps, kValidSize, kValidColorType, Mipmapped::kNo, Protected::kNo, Renderable::kNo, skgpu::Budgeted::kNo); instantiateSuccess = TextureProxy::InstantiateIfNotLazy(resourceProvider, textureProxy.get()); REPORTER_ASSERT(reporter, instantiateSuccess); textureProxy = TextureProxy::MakeLazy( kValidSize, textureInfo, skgpu::Budgeted::kNo, Volatile::kNo, nullCallback); instantiateSuccess = TextureProxy::InstantiateIfNotLazy(resourceProvider, textureProxy.get()); REPORTER_ASSERT(reporter, instantiateSuccess); } } // namespace skgpu::graphite