| // Copyright 2019 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 <fidl/fuchsia.sysmem2/cpp/fidl.h> |
| #include <fidl/fuchsia.sysmem2/cpp/wire.h> |
| #include <lib/ddk/platform-defs.h> |
| |
| #include <zxtest/zxtest.h> |
| |
| #include "usage_pixel_format_cost.h" |
| |
| namespace sysmem_driver { |
| namespace { |
| |
| TEST(PixelFormatCost, Afbc) { |
| for (uint32_t is_x = 0; is_x < 2; ++is_x) { |
| fuchsia_sysmem2::BufferCollectionConstraints constraints; |
| constraints.image_format_constraints().emplace(2); |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format().emplace(std::move(pixel_format)); |
| } |
| constraints.image_format_constraints()->at(0) = std::move(image_format_constraints); |
| } |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = |
| fuchsia_images2::PixelFormatModifier::kArmAfbc32X8; |
| } |
| constraints.image_format_constraints()->at(1) = std::move(image_format_constraints); |
| } |
| |
| uint32_t amlogic_pids[] = { |
| PDEV_PID_AMLOGIC_S912, |
| PDEV_PID_AMLOGIC_S905D2, |
| PDEV_PID_AMLOGIC_T931, |
| PDEV_PID_AMLOGIC_A311D, |
| }; |
| for (uint32_t pid : amlogic_pids) { |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, pid, constraints, 0, 1)); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, pid, constraints, 1, 0)); |
| } |
| EXPECT_EQ(0, UsagePixelFormatCost::Compare(0u, PDEV_PID_AMLOGIC_S912, constraints, 0, 1)); |
| EXPECT_EQ(0, UsagePixelFormatCost::Compare(0u, PDEV_PID_AMLOGIC_S912, constraints, 1, 0)); |
| } |
| } |
| |
| TEST(PixelFormatCost, IntelTiling) { |
| constexpr uint32_t kUnknownPid = 0; |
| constexpr uint32_t kUnknownVid = 0; |
| |
| for (uint32_t is_x = 0; is_x < 2; ++is_x) { |
| fuchsia_sysmem2::BufferCollectionConstraints constraints; |
| |
| constraints.image_format_constraints().emplace(2); |
| fuchsia_images2::PixelFormatModifier tiling_types[] = { |
| fuchsia_images2::PixelFormatModifier::kIntelI915XTiled, |
| fuchsia_images2::PixelFormatModifier::kIntelI915YfTiled, |
| fuchsia_images2::PixelFormatModifier::kIntelI915YTiled}; |
| for (auto modifier : tiling_types) { |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = |
| fuchsia_images2::PixelFormatModifier::kLinear; |
| } |
| constraints.image_format_constraints()->at(0) = std::move(image_format_constraints); |
| } |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = modifier; |
| } |
| constraints.image_format_constraints()->at(1) = std::move(image_format_constraints); |
| } |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, 0, 1)); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, 1, 0)); |
| // Intel tiled formats aren't necessarily useful on AMLOGIC, but if some hardware supported |
| // them they should probably be used anyway. |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, PDEV_PID_AMLOGIC_S912, |
| constraints, 0, 1)); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, PDEV_PID_AMLOGIC_S912, |
| constraints, 1, 0)); |
| |
| // Explicit linear should be treated the same as no format modifier value. |
| constraints.image_format_constraints()->at(0).pixel_format_modifier() = |
| fuchsia_images2::PixelFormatModifier::kLinear; |
| |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, 0, 1)); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, 1, 0)); |
| |
| // Explicit linear should be treated the same as no format modifier value. |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| constraints.image_format_constraints()->at(0).pixel_format() = pixel_format; |
| } |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, 0, 1)); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, 1, 0)); |
| } |
| |
| // Formats are in ascending preference order (descending cost order). |
| std::array modifier_list = { |
| fuchsia_images2::PixelFormatModifier::kLinear, |
| fuchsia_images2::PixelFormatModifier::kIntelI915XTiled, |
| fuchsia_images2::PixelFormatModifier::kIntelI915YTiled, |
| fuchsia_images2::PixelFormatModifier::kIntelI915YfTiled, |
| fuchsia_images2::PixelFormatModifier::kIntelI915YTiledCcs, |
| fuchsia_images2::PixelFormatModifier::kIntelI915YfTiledCcs, |
| }; |
| constraints.image_format_constraints().emplace(modifier_list.size()); |
| |
| for (uint32_t i = 0; i < modifier_list.size(); ++i) { |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = modifier_list[i]; |
| } |
| constraints.image_format_constraints()->at(i) = std::move(image_format_constraints); |
| } |
| } |
| |
| for (uint32_t i = 1; i < modifier_list.size(); ++i) { |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, i - 1, i), |
| "i=%d", i); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(kUnknownVid, kUnknownPid, constraints, i, i - 1), |
| "i=%d", i); |
| } |
| } |
| } |
| |
| TEST(PixelFormatCost, ArmTransactionElimination) { |
| for (uint32_t is_x = 0; is_x < 2; ++is_x) { |
| fuchsia_sysmem2::BufferCollectionConstraints constraints; |
| constraints.image_format_constraints().emplace(2); |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = |
| fuchsia_images2::PixelFormatModifier::kArmAfbc32X8; |
| } |
| constraints.image_format_constraints()->at(0) = std::move(image_format_constraints); |
| } |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = |
| fuchsia_images2::PixelFormatModifier::kArmAfbc32X8Te; |
| } |
| constraints.image_format_constraints()->at(1) = std::move(image_format_constraints); |
| } |
| |
| EXPECT_LT(0, UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, PDEV_PID_AMLOGIC_S912, constraints, |
| 0, 1)); |
| EXPECT_GT(0, UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, PDEV_PID_AMLOGIC_S912, constraints, |
| 1, 0)); |
| EXPECT_EQ(0, UsagePixelFormatCost::Compare(0u, PDEV_PID_AMLOGIC_S912, constraints, 0, 1)); |
| EXPECT_EQ(0, UsagePixelFormatCost::Compare(0u, PDEV_PID_AMLOGIC_S912, constraints, 1, 0)); |
| } |
| } |
| |
| TEST(PixelFormatCost, AfbcWithFlags) { |
| for (uint32_t is_x = 0; is_x < 2; ++is_x) { |
| // Formats are in ascending preference order (descending cost order). |
| std::array modifier_list = { |
| fuchsia_images2::PixelFormatModifier::kLinear, |
| fuchsia_images2::PixelFormatModifier::kArmAfbc16X16, |
| fuchsia_images2::PixelFormatModifier::kArmAfbc16X16SplitBlockSparseYuv, |
| fuchsia_images2::PixelFormatModifier::kArmAfbc16X16SplitBlockSparseYuvTiledHeader, |
| fuchsia_images2::PixelFormatModifier::kArmAfbc16X16Te, |
| fuchsia_images2::PixelFormatModifier::kArmAfbc16X16SplitBlockSparseYuvTe, |
| fuchsia_images2::PixelFormatModifier::kArmAfbc16X16SplitBlockSparseYuvTeTiledHeader, |
| }; |
| fuchsia_sysmem2::BufferCollectionConstraints constraints; |
| constraints.image_format_constraints().emplace(modifier_list.size()); |
| |
| for (uint32_t i = 0; i < modifier_list.size(); ++i) { |
| { |
| fuchsia_sysmem2::ImageFormatConstraints image_format_constraints; |
| { |
| fuchsia_images2::PixelFormat pixel_format; |
| pixel_format = is_x ? fuchsia_images2::PixelFormat::kB8G8R8X8 |
| : fuchsia_images2::PixelFormat::kB8G8R8A8; |
| image_format_constraints.pixel_format() = pixel_format; |
| image_format_constraints.pixel_format_modifier() = modifier_list[i]; |
| } |
| constraints.image_format_constraints()->at(i) = std::move(image_format_constraints); |
| } |
| } |
| |
| for (uint32_t i = 1; i < modifier_list.size(); ++i) { |
| EXPECT_LT(0, |
| UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, PDEV_PID_AMLOGIC_S912, constraints, |
| i - 1, i), |
| "i=%d", i); |
| EXPECT_GT(0, |
| UsagePixelFormatCost::Compare(PDEV_VID_AMLOGIC, PDEV_PID_AMLOGIC_S912, constraints, |
| i, i - 1), |
| "i=%d", i); |
| EXPECT_EQ(0, UsagePixelFormatCost::Compare(0u, PDEV_PID_AMLOGIC_S912, constraints, i - 1, i)); |
| EXPECT_EQ(0, UsagePixelFormatCost::Compare(0u, PDEV_PID_AMLOGIC_S912, constraints, i, i - 1)); |
| } |
| } |
| } |
| |
| } // namespace |
| } // namespace sysmem_driver |