| /* | |
| * 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 "tests/Test.h" | |
| #include "experimental/graphite/include/BackendTexture.h" | |
| #include "experimental/graphite/include/Context.h" | |
| #include "experimental/graphite/include/Recorder.h" | |
| #include "experimental/graphite/include/SkStuff.h" | |
| #include "experimental/graphite/src/Caps.h" | |
| #include "experimental/graphite/src/ContextPriv.h" | |
| #include "experimental/graphite/src/Gpu.h" | |
| #include "experimental/graphite/src/ResourceTypes.h" | |
| #include "include/core/SkSurface.h" | |
| using namespace skgpu; | |
| namespace { | |
| const SkISize kSize = {16, 16}; | |
| } | |
| DEF_GRAPHITE_TEST_FOR_CONTEXTS(BackendTextureTest, reporter, context) { | |
| auto caps = context->priv().gpu()->caps(); | |
| TextureInfo info = caps->getDefaultSampledTextureInfo(kRGBA_8888_SkColorType, | |
| /*levelCount=*/1, | |
| Protected::kNo, | |
| Renderable::kNo); | |
| REPORTER_ASSERT(reporter, info.isValid()); | |
| auto texture1 = context->createBackendTexture(kSize, info); | |
| REPORTER_ASSERT(reporter, texture1.isValid()); | |
| // We make a copy to do the remaining tests so we still have texture1 to safely delete the | |
| // backend object. | |
| auto texture1Copy = texture1; | |
| REPORTER_ASSERT(reporter, texture1Copy.isValid()); | |
| REPORTER_ASSERT(reporter, texture1 == texture1Copy); | |
| auto texture2 = context->createBackendTexture(kSize, info); | |
| REPORTER_ASSERT(reporter, texture2.isValid()); | |
| REPORTER_ASSERT(reporter, texture1Copy != texture2); | |
| // Test state after assignment | |
| texture1Copy = texture2; | |
| REPORTER_ASSERT(reporter, texture1Copy.isValid()); | |
| REPORTER_ASSERT(reporter, texture1Copy == texture2); | |
| BackendTexture invalidTexture; | |
| REPORTER_ASSERT(reporter, !invalidTexture.isValid()); | |
| texture1Copy = invalidTexture; | |
| REPORTER_ASSERT(reporter, !texture1Copy.isValid()); | |
| texture1Copy = texture1; | |
| REPORTER_ASSERT(reporter, texture1Copy.isValid()); | |
| REPORTER_ASSERT(reporter, texture1 == texture1Copy); | |
| context->deleteBackendTexture(texture1); | |
| context->deleteBackendTexture(texture2); | |
| } | |
| // Tests the wrapping of a BackendTexture in an SkSurface | |
| DEF_GRAPHITE_TEST_FOR_CONTEXTS(SurfaceBackendTextureTest, reporter, context) { | |
| // TODO: Right now this just tests very basic combinations of surfaces. This should be expanded | |
| // to conver a much broader set of things once we add more support in Graphite for different | |
| // formats, color types, etc. | |
| auto caps = context->priv().gpu()->caps(); | |
| std::unique_ptr<Recorder> recorder = context->makeRecorder(); | |
| TextureInfo info = caps->getDefaultSampledTextureInfo(kRGBA_8888_SkColorType, | |
| /*levelCount=*/1, | |
| Protected::kNo, | |
| Renderable::kYes); | |
| auto texture = context->createBackendTexture(kSize, info); | |
| REPORTER_ASSERT(reporter, texture.isValid()); | |
| sk_sp<SkSurface> surface = MakeGraphiteFromBackendTexture(recorder.get(), | |
| texture, | |
| kRGBA_8888_SkColorType, | |
| /*colorSpace=*/nullptr, | |
| /*props=*/nullptr); | |
| REPORTER_ASSERT(reporter, surface); | |
| surface.reset(); | |
| // We should fail when trying to wrap the same texture in a surface with a non compatible | |
| // color type. | |
| surface = MakeGraphiteFromBackendTexture(recorder.get(), | |
| texture, | |
| kAlpha_8_SkColorType, | |
| /*colorSpace=*/nullptr, | |
| /*props=*/nullptr); | |
| REPORTER_ASSERT(reporter, !surface); | |
| context->deleteBackendTexture(texture); | |
| // We should fail to make a wrap non renderable texture in a surface. | |
| info = caps->getDefaultSampledTextureInfo(kRGBA_8888_SkColorType, | |
| /*levelCount=*/1, | |
| Protected::kNo, | |
| Renderable::kNo); | |
| texture = context->createBackendTexture(kSize, info); | |
| REPORTER_ASSERT(reporter, texture.isValid()); | |
| surface = MakeGraphiteFromBackendTexture(recorder.get(), | |
| texture, | |
| kRGBA_8888_SkColorType, | |
| /*colorSpace=*/nullptr, | |
| /*props=*/nullptr); | |
| REPORTER_ASSERT(reporter, !surface); | |
| context->deleteBackendTexture(texture); | |
| } | |