| /* |
| * Copyright 2022 Alyssa Rosenzweig |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "util/format/u_format.h" |
| #include "agx_tilebuffer.h" |
| |
| #include <gtest/gtest.h> |
| |
| 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; |
| } |
| } |