blob: 9fe30f8f7250028a0e4cfa26d2b332106f96417c [file] [log] [blame]
/*
* Copyright 2020 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.
*/
#undef LOG_TAG
#define LOG_TAG "LibSurfaceFlingerUnittests"
#include "DisplayTransactionTestHelpers.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace android {
namespace {
using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
class DisplayDeviceSetProjectionTest : public DisplayTransactionTest {
public:
static constexpr int32_t DEFAULT_DISPLAY_WIDTH = 1080; // arbitrary
static constexpr int32_t DEFAULT_DISPLAY_HEIGHT = 1920; // arbitrary
static constexpr int32_t TRANSFORM_FLAGS_ROT_0 = 0;
static constexpr int32_t TRANSFORM_FLAGS_ROT_90 = HAL_TRANSFORM_ROT_90;
static constexpr int32_t TRANSFORM_FLAGS_ROT_180 = HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_FLIP_V;
static constexpr int32_t TRANSFORM_FLAGS_ROT_270 =
HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
DisplayDeviceSetProjectionTest(ui::Size flingerDisplaySize, ui::Size hardwareDisplaySize,
ui::Rotation physicalOrientation)
: mFlingerDisplaySize(flingerDisplaySize),
mHardwareDisplaySize(hardwareDisplaySize),
mPhysicalOrientation(physicalOrientation),
mDisplayDevice(createDisplayDevice()) {}
sp<DisplayDevice> createDisplayDevice() {
return injectDefaultInternalDisplay([this](FakeDisplayDeviceInjector& injector) {
injector.setPhysicalOrientation(mPhysicalOrientation);
});
}
ui::Size swapWH(const ui::Size size) const { return ui::Size(size.height, size.width); }
void setProjectionForRotation0() {
// A logical rotation of 0 uses the SurfaceFlinger display size
mDisplayDevice->setProjection(ui::ROTATION_0, Rect(mFlingerDisplaySize),
Rect(mFlingerDisplaySize));
}
void setProjectionForRotation90() {
// A logical rotation of 90 uses the SurfaceFlinger display size with
// the width/height swapped.
mDisplayDevice->setProjection(ui::ROTATION_90, Rect(swapWH(mFlingerDisplaySize)),
Rect(swapWH(mFlingerDisplaySize)));
}
void setProjectionForRotation180() {
// A logical rotation of 180 uses the SurfaceFlinger display size
mDisplayDevice->setProjection(ui::ROTATION_180, Rect(mFlingerDisplaySize),
Rect(mFlingerDisplaySize));
}
void setProjectionForRotation270() {
// A logical rotation of 270 uses the SurfaceFlinger display size with
// the width/height swapped.
mDisplayDevice->setProjection(ui::ROTATION_270, Rect(swapWH(mFlingerDisplaySize)),
Rect(swapWH(mFlingerDisplaySize)));
}
void expectStateForHardwareTransform0() {
const auto& compositionState = mDisplayDevice->getCompositionDisplay()->getState();
EXPECT_EQ(ui::Transform(TRANSFORM_FLAGS_ROT_0, mHardwareDisplaySize.width,
mHardwareDisplaySize.height),
compositionState.transform);
EXPECT_EQ(ui::ROTATION_0, compositionState.displaySpace.orientation);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.displaySpace.content);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.orientedDisplaySpace.content);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.layerStackSpace.content);
EXPECT_EQ(false, compositionState.needsFiltering);
}
void expectStateForHardwareTransform90() {
const auto& compositionState = mDisplayDevice->getCompositionDisplay()->getState();
EXPECT_EQ(ui::Transform(TRANSFORM_FLAGS_ROT_90, mHardwareDisplaySize.width,
mHardwareDisplaySize.height),
compositionState.transform);
EXPECT_EQ(ui::ROTATION_90, compositionState.displaySpace.orientation);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.displaySpace.content);
// For 90, the orientedDisplaySpaceRect and layerStackSpaceRect have the hardware display
// size width and height swapped
EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)),
compositionState.orientedDisplaySpace.content);
EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)), compositionState.layerStackSpace.content);
EXPECT_EQ(false, compositionState.needsFiltering);
}
void expectStateForHardwareTransform180() {
const auto& compositionState = mDisplayDevice->getCompositionDisplay()->getState();
EXPECT_EQ(ui::Transform(TRANSFORM_FLAGS_ROT_180, mHardwareDisplaySize.width,
mHardwareDisplaySize.height),
compositionState.transform);
EXPECT_EQ(ui::ROTATION_180, compositionState.displaySpace.orientation);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.orientedDisplaySpace.content);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.layerStackSpace.content);
EXPECT_EQ(false, compositionState.needsFiltering);
}
void expectStateForHardwareTransform270() {
const auto& compositionState = mDisplayDevice->getCompositionDisplay()->getState();
EXPECT_EQ(ui::Transform(TRANSFORM_FLAGS_ROT_270, mHardwareDisplaySize.width,
mHardwareDisplaySize.height),
compositionState.transform);
EXPECT_EQ(ui::ROTATION_270, compositionState.displaySpace.orientation);
EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.displaySpace.content);
// For 270, the orientedDisplaySpaceRect and layerStackSpaceRect have the hardware display
// size width and height swapped
EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)),
compositionState.orientedDisplaySpace.content);
EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)), compositionState.layerStackSpace.content);
EXPECT_EQ(false, compositionState.needsFiltering);
}
const ui::Size mFlingerDisplaySize;
const ui::Size mHardwareDisplaySize;
const ui::Rotation mPhysicalOrientation;
const sp<DisplayDevice> mDisplayDevice;
};
struct DisplayDeviceSetProjectionTest_Installed0 : public DisplayDeviceSetProjectionTest {
DisplayDeviceSetProjectionTest_Installed0()
: DisplayDeviceSetProjectionTest(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
ui::ROTATION_0) {}
};
TEST_F(DisplayDeviceSetProjectionTest_Installed0, checkWith0OutputRotation) {
setProjectionForRotation0();
expectStateForHardwareTransform0();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed0, checkWith90OutputRotation) {
setProjectionForRotation90();
expectStateForHardwareTransform90();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed0, checkWith180OutputRotation) {
setProjectionForRotation180();
expectStateForHardwareTransform180();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed0, checkWith270OutputRotation) {
setProjectionForRotation270();
expectStateForHardwareTransform270();
}
struct DisplayDeviceSetProjectionTest_Installed90 : public DisplayDeviceSetProjectionTest {
DisplayDeviceSetProjectionTest_Installed90()
: DisplayDeviceSetProjectionTest(ui::Size(DEFAULT_DISPLAY_HEIGHT, DEFAULT_DISPLAY_WIDTH),
ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
ui::ROTATION_90) {}
};
TEST_F(DisplayDeviceSetProjectionTest_Installed90, checkWith0OutputRotation) {
setProjectionForRotation0();
expectStateForHardwareTransform90();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed90, checkWith90OutputRotation) {
setProjectionForRotation90();
expectStateForHardwareTransform180();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed90, checkWith180OutputRotation) {
setProjectionForRotation180();
expectStateForHardwareTransform270();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed90, checkWith270OutputRotation) {
setProjectionForRotation270();
expectStateForHardwareTransform0();
}
struct DisplayDeviceSetProjectionTest_Installed180 : public DisplayDeviceSetProjectionTest {
DisplayDeviceSetProjectionTest_Installed180()
: DisplayDeviceSetProjectionTest(ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
ui::ROTATION_180) {}
};
TEST_F(DisplayDeviceSetProjectionTest_Installed180, checkWith0OutputRotation) {
setProjectionForRotation0();
expectStateForHardwareTransform180();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed180, checkWith90OutputRotation) {
setProjectionForRotation90();
expectStateForHardwareTransform270();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed180, checkWith180OutputRotation) {
setProjectionForRotation180();
expectStateForHardwareTransform0();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed180, checkWith270OutputRotation) {
setProjectionForRotation270();
expectStateForHardwareTransform90();
}
struct DisplayDeviceSetProjectionTest_Installed270 : public DisplayDeviceSetProjectionTest {
DisplayDeviceSetProjectionTest_Installed270()
: DisplayDeviceSetProjectionTest(ui::Size(DEFAULT_DISPLAY_HEIGHT, DEFAULT_DISPLAY_WIDTH),
ui::Size(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
ui::ROTATION_270) {}
};
TEST_F(DisplayDeviceSetProjectionTest_Installed270, checkWith0OutputRotation) {
setProjectionForRotation0();
expectStateForHardwareTransform270();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed270, checkWith90OutputRotation) {
setProjectionForRotation90();
expectStateForHardwareTransform0();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed270, checkWith180OutputRotation) {
setProjectionForRotation180();
expectStateForHardwareTransform90();
}
TEST_F(DisplayDeviceSetProjectionTest_Installed270, checkWith270OutputRotation) {
setProjectionForRotation270();
expectStateForHardwareTransform180();
}
} // namespace
} // namespace android