blob: 2f54f70b3385203ad787d43def3d49028055d1a3 [file] [log] [blame]
// 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 <string>
#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<float>(256),
.bottom = static_cast<float>(256),
},
.blendMode = HWC2_BLEND_MODE_PREMULTIPLIED,
.alpha = 1.0,
.color =
{
.r = 0,
.g = 0,
.b = 0,
.a = 0,
},
.transform = static_cast<hwc_transform_t>(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<float>(256),
.bottom = static_cast<float>(256),
},
.blendMode = HWC2_BLEND_MODE_PREMULTIPLIED,
.alpha = 1.0,
.color =
{
.r = 0,
.g = 0,
.b = 0,
.a = 0,
},
.transform = static_cast<hwc_transform_t>(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<float>(256),
.bottom = static_cast<float>(256),
},
.blendMode = HWC2_BLEND_MODE_PREMULTIPLIED,
.alpha = 1.0,
.color =
{
.r = 0,
.g = 0,
.b = 0,
.a = 0,
},
.transform = static_cast<hwc_transform_t>(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<float>(256),
.bottom = static_cast<float>(256),
},
.blendMode = HWC2_BLEND_MODE_PREMULTIPLIED,
.alpha = 1.0,
.color =
{
.r = 0,
.g = 0,
.b = 0,
.a = 0,
},
.transform = static_cast<hwc_transform_t>(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