// Copyright (C) 2023 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "GfxstreamEnd2EndTests.h" namespace gfxstream { namespace tests { namespace { using testing::Eq; class GfxstreamEnd2EndCompositionTest : public GfxstreamEnd2EndTest {}; TEST_P(GfxstreamEnd2EndCompositionTest, BasicComposition) { ScopedRenderControlDevice rcDevice(*mRc); auto layer1Ahb = GL_ASSERT(CreateAHBFromImage("256x256_android.png")); auto layer2Ahb = GL_ASSERT(CreateAHBFromImage("256x256_android_with_transparency.png")); auto resultAhb = GL_ASSERT(ScopedAHardwareBuffer::Allocate(*mGralloc, 256, 256, GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM)); const RenderControlComposition composition = { .displayId = 0, .compositionResultColorBufferHandle = mGralloc->getHostHandle(resultAhb), }; const RenderControlCompositionLayer compositionLayers[2] = { { .colorBufferHandle = mGralloc->getHostHandle(layer1Ahb), .composeMode = HWC2_COMPOSITION_DEVICE, .displayFrame = { .left = 0, .top = 0, .right = 256, .bottom = 256, }, .crop = { .left = 0, .top = 0, .right = static_cast(256), .bottom = static_cast(256), }, .blendMode = HWC2_BLEND_MODE_PREMULTIPLIED, .alpha = 1.0, .color = { .r = 0, .g = 0, .b = 0, .a = 0, }, .transform = static_cast(0), }, { .colorBufferHandle = mGralloc->getHostHandle(layer2Ahb), .composeMode = HWC2_COMPOSITION_DEVICE, .displayFrame = { .left = 64, .top = 32, .right = 128, .bottom = 160, }, .crop = { .left = 0, .top = 0, .right = static_cast(256), .bottom = static_cast(256), }, .blendMode = HWC2_BLEND_MODE_PREMULTIPLIED, .alpha = 1.0, .color = { .r = 0, .g = 0, .b = 0, .a = 0, }, .transform = static_cast(0), }, }; ASSERT_THAT(mRc->rcCompose(rcDevice, &composition, 2, compositionLayers), Eq(0)); GL_ASSERT(CompareAHBWithGolden(resultAhb, "256x256_golden_basic_composition.png")); } TEST_P(GfxstreamEnd2EndCompositionTest, BasicCompositionBGRA) { ScopedRenderControlDevice rcDevice(*mRc); auto layer1Ahb = GL_ASSERT(CreateAHBFromImage("256x256_android.png")); auto layer2Ahb = GL_ASSERT(CreateAHBFromImage("256x256_android_with_transparency.png")); auto resultAhb = GL_ASSERT( ScopedAHardwareBuffer::Allocate(*mGralloc, 256, 256, GFXSTREAM_AHB_FORMAT_B8G8R8A8_UNORM)); const RenderControlComposition composition = { .displayId = 0, .compositionResultColorBufferHandle = mGralloc->getHostHandle(resultAhb), }; const RenderControlCompositionLayer compositionLayers[2] = { { .colorBufferHandle = mGralloc->getHostHandle(layer1Ahb), .composeMode = HWC2_COMPOSITION_DEVICE, .displayFrame = { .left = 0, .top = 0, .right = 256, .bottom = 256, }, .crop = { .left = 0, .top = 0, .right = static_cast(256), .bottom = static_cast(256), }, .blendMode = HWC2_BLEND_MODE_PREMULTIPLIED, .alpha = 1.0, .color = { .r = 0, .g = 0, .b = 0, .a = 0, }, .transform = static_cast(0), }, { .colorBufferHandle = mGralloc->getHostHandle(layer2Ahb), .composeMode = HWC2_COMPOSITION_DEVICE, .displayFrame = { .left = 64, .top = 32, .right = 128, .bottom = 160, }, .crop = { .left = 0, .top = 0, .right = static_cast(256), .bottom = static_cast(256), }, .blendMode = HWC2_BLEND_MODE_PREMULTIPLIED, .alpha = 1.0, .color = { .r = 0, .g = 0, .b = 0, .a = 0, }, .transform = static_cast(0), }, }; ASSERT_THAT(mRc->rcCompose(rcDevice, &composition, 2, compositionLayers), Eq(0)); GL_ASSERT(CompareAHBWithGolden(resultAhb, "256x256_golden_basic_composition.png")); } INSTANTIATE_TEST_CASE_P(GfxstreamEnd2EndTests, GfxstreamEnd2EndCompositionTest, ::testing::ValuesIn({ TestParams{ .with_gl = true, .with_vk = false, }, TestParams{ .with_gl = true, .with_vk = true, }, TestParams{ .with_gl = false, .with_vk = true, }, }), &GetTestName); } // namespace } // namespace tests } // namespace gfxstream