/* * Copyright 2022 Alyssa Rosenzweig * SPDX-License-Identifier: MIT */ #include "util/format/u_format.h" #include "agx_tilebuffer.h" #include struct test { const char *name; uint8_t nr_samples; enum pipe_format formats[8]; struct agx_tilebuffer_layout layout; uint32_t total_size; }; /* clang-format off */ struct test tests[] = { { "Simple test", 1, { PIPE_FORMAT_R8G8B8A8_UNORM }, { ._offset_B = { 0 }, .sample_size_B = 8, .nr_samples = 1, .tile_size = { 32, 32 }, }, 8192 }, { "MSAA 2x", 2, { PIPE_FORMAT_R8G8B8A8_UNORM }, { ._offset_B = { 0 }, .sample_size_B = 8, .nr_samples = 2, .tile_size = { 32, 32 }, }, 16384 }, { "MSAA 4x", 4, { PIPE_FORMAT_R8G8B8A8_UNORM }, { ._offset_B = { 0 }, .sample_size_B = 8, .nr_samples = 4, .tile_size = { 32, 16 }, }, 16384 }, { "MRT", 1, { PIPE_FORMAT_R16_SINT, PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R8_SINT, PIPE_FORMAT_R32G32_SINT, }, { ._offset_B = { 0, 4, 12, 16 }, .sample_size_B = 24, .nr_samples = 1, .tile_size = { 32, 32 }, }, 24576 }, { "MRT with MSAA 2x", 2, { PIPE_FORMAT_R16_SINT, PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R8_SINT, PIPE_FORMAT_R32G32_SINT, }, { ._offset_B = { 0, 4, 12, 16 }, .sample_size_B = 24, .nr_samples = 2, .tile_size = { 32, 16 }, }, 24576 }, { "MRT with MSAA 4x", 4, { PIPE_FORMAT_R16_SINT, PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R8_SINT, PIPE_FORMAT_R32G32_SINT, }, { ._offset_B = { 0, 4, 12, 16 }, .sample_size_B = 24, .nr_samples = 4, .tile_size = { 16, 16 }, }, 24576 }, { "MRT test requiring 2 alignment on the second RT", 1, { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R16G16_SNORM }, { ._offset_B = { 0, 2 }, .sample_size_B = 8, .nr_samples = 1, .tile_size = { 32, 32 }, }, 8192 }, { "Simple MRT test requiring 4 alignment on the second RT", 1, { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R10G10B10A2_UNORM }, { ._offset_B = { 0, 4 }, .sample_size_B = 8, .nr_samples = 1, .tile_size = { 32, 32 }, }, 8192 }, { "MRT test that requires spilling to consider alignment requirements", 4, { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32_FLOAT, }, { .spilled = { false, false, false, false, false, false, true, true }, ._offset_B = { 0, 4, 8, 12, 16, 20, 0, 0}, .sample_size_B = 24, .nr_samples = 4, .tile_size = { 16, 16 }, }, 24576 }, }; /* clang-format on */ TEST(Tilebuffer, Layouts) { for (unsigned i = 0; i < ARRAY_SIZE(tests); ++i) { unsigned nr_cbufs; for (nr_cbufs = 0; nr_cbufs < ARRAY_SIZE(tests[i].formats) && tests[i].formats[nr_cbufs] != PIPE_FORMAT_NONE; ++nr_cbufs) ; struct agx_tilebuffer_layout actual = agx_build_tilebuffer_layout( tests[i].formats, nr_cbufs, tests[i].nr_samples, false); ASSERT_EQ(tests[i].layout.sample_size_B, actual.sample_size_B) << tests[i].name; ASSERT_EQ(tests[i].layout.nr_samples, actual.nr_samples) << tests[i].name; ASSERT_EQ(tests[i].layout.tile_size.width, actual.tile_size.width) << tests[i].name; ASSERT_EQ(tests[i].layout.tile_size.height, actual.tile_size.height) << tests[i].name; ASSERT_EQ(tests[i].total_size, agx_tilebuffer_total_size(&tests[i].layout)) << tests[i].name; } }