| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "test.h" |
| |
| namespace { |
| |
| uint32_t interpolate(uint32_t val, uint32_t cur_limit, uint32_t new_limit) { |
| // Interploates from [0, cur_limit) to [0, new_limit) |
| return ((val * (new_limit - 1)) + cur_limit - 2) / (cur_limit - 1); |
| } |
| |
| } // namespace |
| |
| namespace display_test { |
| |
| DISPLAY_TEST(two_layer_test_dest_frame, [](Context* context) { |
| auto layer1 = context->CreatePrimaryLayer(context->display_width(), |
| context->display_height()); |
| auto image1 = |
| context->CreateImage(context->display_width(), context->display_height()); |
| layer1->SetImage(image1); |
| |
| auto layer2 = context->CreatePrimaryLayer(context->display_width(), |
| context->display_height() / 2); |
| auto image2 = context->CreateImage(context->display_width(), |
| context->display_height() / 2); |
| layer2->SetPosition( |
| fuchsia::hardware::display::Transform::IDENTITY, |
| {0, 0, image2->width(), image2->height()}, |
| {0, context->display_height() / 4, image2->width(), image2->height()}); |
| layer2->SetImage(image2); |
| |
| context->SetLayers(std::vector<Layer*>({layer1, layer2})); |
| context->ApplyConfig(); |
| }); |
| |
| DISPLAY_TEST(two_layer_test_dest_frame_progressive, [](Context* context) { |
| auto layer1 = context->CreatePrimaryLayer(context->display_width(), |
| context->display_height()); |
| auto image1 = |
| context->CreateImage(context->display_width(), context->display_height()); |
| layer1->SetImage(image1); |
| |
| auto layer2 = context->CreatePrimaryLayer(context->display_width() / 2, |
| context->display_height() / 2); |
| auto image2 = context->CreateImage(context->display_width() / 2, |
| context->display_height() / 2); |
| layer2->SetImage(image2); |
| |
| context->SetLayers(std::vector<Layer*>({layer1, layer2})); |
| |
| constexpr uint32_t kIterCount = 8; |
| uint32_t width_limit = context->display_width() - image2->width(); |
| uint32_t height_limit = context->display_height() - image2->height(); |
| for (unsigned i = 0; i < kIterCount; i++) { |
| uint32_t x = interpolate(i, kIterCount, width_limit); |
| uint32_t y = interpolate(i, kIterCount, height_limit); |
| layer2->SetPosition(fuchsia::hardware::display::Transform::IDENTITY, |
| {0, 0, image2->width(), image2->height()}, |
| {x, y, image2->width(), image2->height()}); |
| context->ApplyConfig(); |
| } |
| }); |
| |
| DISPLAY_TEST(single_layer_src_frame, [](Context* context) { |
| static const uint32_t offset = 10; |
| auto layer = context->CreatePrimaryLayer(context->display_width() + offset, |
| context->display_height() + offset); |
| auto image = context->CreateImage(context->display_width() + offset, |
| context->display_height() + offset); |
| layer->SetPosition( |
| fuchsia::hardware::display::Transform::IDENTITY, |
| {offset, offset, context->display_width(), context->display_height()}, |
| {0, 0, context->display_width(), context->display_height()}); |
| layer->SetImage(image); |
| |
| context->SetLayers(std::vector<Layer*>({layer})); |
| context->ApplyConfig(); |
| }); |
| |
| DISPLAY_TEST(single_layer_src_frame_progressive, [](Context* context) { |
| constexpr uint32_t kNumIters = 8; |
| constexpr uint32_t kStepSize = 10; |
| constexpr uint32_t kExtraSize = (kNumIters - 1) * kStepSize; |
| |
| auto layer = |
| context->CreatePrimaryLayer(context->display_width() + kExtraSize, |
| context->display_height() + kExtraSize); |
| auto image = context->CreateImage(context->display_width() + kExtraSize, |
| context->display_height() + kExtraSize); |
| layer->SetImage(image); |
| context->SetLayers(std::vector<Layer*>({layer})); |
| |
| for (unsigned i = 0; i < kNumIters; i++) { |
| uint32_t offset = i * kStepSize; |
| layer->SetPosition( |
| fuchsia::hardware::display::Transform::IDENTITY, |
| {offset, offset, context->display_width(), context->display_height()}, |
| {0, 0, context->display_width(), context->display_height()}); |
| context->ApplyConfig(); |
| } |
| }); |
| |
| Test rotation_test(fuchsia::hardware::display::Transform mode) { |
| return [mode](Context* context) { |
| auto layer = context->CreatePrimaryLayer(context->display_width(), |
| context->display_height()); |
| auto image = context->CreateImage(context->display_width(), |
| context->display_height()); |
| layer->SetPosition( |
| mode, {0, 0, context->display_width(), context->display_height()}, |
| {0, 0, context->display_width(), context->display_height()}); |
| layer->SetImage(image); |
| |
| context->SetLayers(std::vector<Layer*>({layer})); |
| context->ApplyConfig(); |
| }; |
| } |
| |
| DISPLAY_TEST(rotate_90_test, |
| rotation_test(fuchsia::hardware::display::Transform::ROT_90)); |
| DISPLAY_TEST(rotate_180_test, |
| rotation_test(fuchsia::hardware::display::Transform::ROT_180)); |
| DISPLAY_TEST(rotate_270_test, |
| rotation_test(fuchsia::hardware::display::Transform::ROT_270)); |
| DISPLAY_TEST( |
| rotate_90_reflectx_test, |
| rotation_test(fuchsia::hardware::display::Transform::ROT_90_REFLECT_X)); |
| DISPLAY_TEST( |
| rotate_90_reflecty_test, |
| rotation_test(fuchsia::hardware::display::Transform::ROT_90_REFLECT_Y)); |
| DISPLAY_TEST(rotate_reflectx_test, |
| rotation_test(fuchsia::hardware::display::Transform::REFLECT_X)); |
| DISPLAY_TEST(rotate_reflecty_test, |
| rotation_test(fuchsia::hardware::display::Transform::REFLECT_Y)); |
| |
| DISPLAY_TEST(scale_up_test, [](Context* context) { |
| auto layer = context->CreatePrimaryLayer(context->display_width() / 2, |
| context->display_height() / 2); |
| auto image = context->CreateScalableImage(context->display_width() / 2, |
| context->display_height() / 2); |
| layer->SetPosition( |
| fuchsia::hardware::display::Transform::IDENTITY, |
| {0, 0, image->width(), image->height()}, |
| {0, 0, context->display_width(), context->display_height()}); |
| layer->SetImage(image); |
| |
| context->SetLayers(std::vector<Layer*>({layer})); |
| context->ApplyConfig(); |
| }); |
| |
| DISPLAY_TEST(scale_down_test, [](Context* context) { |
| auto layer = context->CreatePrimaryLayer(context->display_width() * 2, |
| context->display_height() * 2); |
| auto image = context->CreateScalableImage(context->display_width() * 2, |
| context->display_height() * 2); |
| layer->SetPosition( |
| fuchsia::hardware::display::Transform::IDENTITY, |
| {0, 0, image->width(), image->height()}, |
| {0, 0, context->display_width(), context->display_height()}); |
| layer->SetImage(image); |
| |
| context->SetLayers(std::vector<Layer*>({layer})); |
| context->ApplyConfig(); |
| }); |
| |
| DISPLAY_TEST(variable_scale_test, [](Context* context) { |
| auto layer1 = context->CreatePrimaryLayer(context->display_width(), |
| context->display_height()); |
| auto image1 = |
| context->CreateImage(context->display_width(), context->display_height()); |
| layer1->SetImage(image1); |
| |
| auto layer2 = context->CreatePrimaryLayer(context->display_width() / 2, |
| context->display_height() / 2); |
| auto image2 = context->CreateScalableImage(context->display_width() / 2, |
| context->display_height() / 2); |
| layer2->SetImage(image2); |
| context->SetLayers(std::vector<Layer*>({layer1, layer2})); |
| |
| // Scale from .5 to 2x |
| constexpr uint32_t kIterCount = 8; |
| uint32_t min_width = context->display_width() / 4; |
| uint32_t min_height = context->display_height() / 4; |
| uint32_t width_range = context->display_width() - min_width + 1; |
| uint32_t height_range = context->display_height() - min_height + 1; |
| for (unsigned i = 0; i < kIterCount; i++) { |
| uint32_t width = interpolate(i, kIterCount, width_range) + min_width; |
| uint32_t height = interpolate(i, kIterCount, height_range) + min_height; |
| layer2->SetPosition(fuchsia::hardware::display::Transform::IDENTITY, |
| {0, 0, image2->width(), image2->height()}, |
| {0, 0, width, height}); |
| context->ApplyConfig(); |
| } |
| }); |
| |
| // TODO(stevensd): test composition of motion and scaling |
| |
| } // namespace display_test |