173 lines
8.1 KiB
C++
173 lines
8.1 KiB
C++
/*
|
|
* 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
|