blob: b2b636302da8ea49a7cbe282a697f831eb000cce [file] [log] [blame]
/*
* 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> 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> texture = resourceProvider->createWrappedTexture(backendTexture);
auto nullCallback = [](ResourceProvider*) -> sk_sp<Texture> { return nullptr; };
auto callback = [texture](ResourceProvider*) -> sk_sp<Texture> { return texture; };
// Assign to assignableTexture before instantiating with this callback.
sk_sp<Texture> assignableTexture;
auto assignableCallback = [&assignableTexture](ResourceProvider*) -> sk_sp<Texture> {
return assignableTexture;
};
// Invalid parameters.
sk_sp<TextureProxy> 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