| // Copyright 2021 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 "magma_image.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include "drm_fourcc.h" |
| |
| class MagmaImageTesting : public ::testing::Test {}; |
| |
| constexpr uint64_t kWidth = 1920; |
| constexpr uint64_t kHeight = 1080; |
| constexpr uint32_t kFormat = DRM_FORMAT_ARGB8888; |
| |
| TEST_F(MagmaImageTesting, SpecifyLinear) { |
| uint32_t physical_device_index = 0; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {DRM_FORMAT_MOD_LINEAR, DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = 0, |
| }; |
| |
| magma_image_info_t image_info = {}; |
| ASSERT_EQ(MAGMA_STATUS_OK, magma_image::CreateDrmImage(physical_device_index, &create_info, |
| &image_info, &buffer, &token)); |
| |
| EXPECT_EQ(DRM_FORMAT_MOD_LINEAR, image_info.drm_format_modifier); |
| EXPECT_EQ(kWidth * 4u, image_info.plane_strides[0]); |
| EXPECT_EQ(0u, image_info.plane_offsets[0]); |
| EXPECT_FALSE(token); |
| } |
| |
| TEST_F(MagmaImageTesting, SpecifyIntelX) { |
| uint32_t physical_device_index = 0; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {I915_FORMAT_MOD_X_TILED, DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = 0, |
| }; |
| |
| magma_image_info_t image_info = {}; |
| ASSERT_EQ(MAGMA_STATUS_OK, magma_image::CreateDrmImage(physical_device_index, &create_info, |
| &image_info, &buffer, &token)); |
| |
| EXPECT_EQ(I915_FORMAT_MOD_X_TILED, image_info.drm_format_modifier); |
| EXPECT_EQ(0u, image_info.plane_strides[0]); |
| EXPECT_EQ(0u, image_info.plane_offsets[0]); |
| EXPECT_FALSE(token); |
| } |
| |
| TEST_F(MagmaImageTesting, SpecifyIntelY) { |
| uint32_t physical_device_index = 0; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {I915_FORMAT_MOD_Y_TILED, DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = 0, |
| }; |
| |
| magma_image_info_t image_info = {}; |
| ASSERT_EQ(MAGMA_STATUS_OK, magma_image::CreateDrmImage(physical_device_index, &create_info, |
| &image_info, &buffer, &token)); |
| |
| EXPECT_EQ(I915_FORMAT_MOD_Y_TILED, image_info.drm_format_modifier); |
| EXPECT_EQ(0u, image_info.plane_strides[0]); |
| EXPECT_EQ(0u, image_info.plane_offsets[0]); |
| EXPECT_FALSE(token); |
| } |
| |
| TEST_F(MagmaImageTesting, SpecifyIntelYf) { |
| uint32_t physical_device_index = 0; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {I915_FORMAT_MOD_Yf_TILED, DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = 0, |
| }; |
| |
| magma_image_info_t image_info = {}; |
| ASSERT_EQ(MAGMA_STATUS_INVALID_ARGS, |
| magma_image::CreateDrmImage(physical_device_index, &create_info, &image_info, &buffer, |
| &token)); |
| EXPECT_FALSE(token); |
| } |
| |
| TEST_F(MagmaImageTesting, IntelMany) { |
| uint32_t physical_device_index = 0; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {DRM_FORMAT_MOD_LINEAR, I915_FORMAT_MOD_X_TILED, |
| I915_FORMAT_MOD_Y_TILED, I915_FORMAT_MOD_Yf_TILED, |
| DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = 0, |
| }; |
| |
| magma_image_info_t image_info = {}; |
| ASSERT_EQ(MAGMA_STATUS_OK, magma_image::CreateDrmImage(physical_device_index, &create_info, |
| &image_info, &buffer, &token)); |
| |
| EXPECT_EQ(I915_FORMAT_MOD_Y_TILED, image_info.drm_format_modifier); |
| EXPECT_EQ(0u, image_info.plane_strides[0]); |
| EXPECT_EQ(0u, image_info.plane_offsets[0]); |
| EXPECT_FALSE(token); |
| } |
| |
| TEST_F(MagmaImageTesting, IntelNone) { |
| uint32_t physical_device_index = 0; |
| magma_image_info_t image_info = {}; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = 0, |
| }; |
| |
| ASSERT_EQ(MAGMA_STATUS_OK, magma_image::CreateDrmImage(physical_device_index, &create_info, |
| &image_info, &buffer, &token)); |
| |
| EXPECT_EQ(I915_FORMAT_MOD_Y_TILED, image_info.drm_format_modifier); |
| EXPECT_EQ(0u, image_info.plane_strides[0]); |
| EXPECT_EQ(0u, image_info.plane_offsets[0]); |
| EXPECT_FALSE(token); |
| } |
| |
| TEST_F(MagmaImageTesting, IntelNonePresentable) { |
| uint32_t physical_device_index = 0; |
| magma_image_info_t image_info = {}; |
| zx::vmo buffer; |
| zx::eventpair token; |
| |
| magma_image_create_info_t create_info = { |
| .drm_format = kFormat, |
| .drm_format_modifiers = {DRM_FORMAT_MOD_INVALID}, |
| .width = kWidth, |
| .height = kHeight, |
| .flags = MAGMA_IMAGE_CREATE_FLAGS_PRESENTABLE, |
| }; |
| |
| ASSERT_EQ(MAGMA_STATUS_OK, magma_image::CreateDrmImage(physical_device_index, &create_info, |
| &image_info, &buffer, &token)); |
| |
| if (image_info.drm_format_modifier != I915_FORMAT_MOD_Y_TILED) |
| EXPECT_EQ(image_info.drm_format_modifier, I915_FORMAT_MOD_X_TILED); |
| EXPECT_EQ(0u, image_info.plane_strides[0]); |
| EXPECT_EQ(0u, image_info.plane_offsets[0]); |
| EXPECT_TRUE(token); |
| } |