summaryrefslogtreecommitdiff
path: root/src/amd/common/ac_surface_modifier_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/amd/common/ac_surface_modifier_test.c')
-rw-r--r--src/amd/common/ac_surface_modifier_test.c64
1 files changed, 33 insertions, 31 deletions
diff --git a/src/amd/common/ac_surface_modifier_test.c b/src/amd/common/ac_surface_modifier_test.c
index 91bdc8f5bba..82d2d4d6f50 100644
--- a/src/amd/common/ac_surface_modifier_test.c
+++ b/src/amd/common/ac_surface_modifier_test.c
@@ -66,9 +66,9 @@ block_count(unsigned w, unsigned h, unsigned elem_bits, unsigned block_bits,
static ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT
-get_addr_from_coord_base(ADDR_HANDLE addrlib, const struct radeon_surf *surf,
- unsigned w, unsigned h, enum pipe_format format,
- bool rb_aligned, bool pipe_aligned)
+gfx9_get_addr_from_coord_base(ADDR_HANDLE addrlib, const struct radeon_surf *surf,
+ unsigned w, unsigned h, enum pipe_format format,
+ bool rb_aligned, bool pipe_aligned)
{
ADDR2_COMPUTE_DCCINFO_INPUT din = {0};
ADDR2_COMPUTE_DCCINFO_OUTPUT dout = {0};
@@ -111,10 +111,9 @@ get_addr_from_coord_base(ADDR_HANDLE addrlib, const struct radeon_surf *surf,
return dcc_input;
}
-static
-void generate_hash(struct ac_addrlib *ac_addrlib,
- struct test_entry *entry,
- const struct radeon_surf *surf)
+static void gfx9_generate_hash(struct ac_addrlib *ac_addrlib,
+ struct test_entry *entry,
+ const struct radeon_surf *surf)
{
ADDR_HANDLE addrlib = ac_addrlib_get_handle(ac_addrlib);
@@ -143,17 +142,17 @@ void generate_hash(struct ac_addrlib *ac_addrlib,
ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT dcc_input = {0};
if (surf->meta_offset) {
- dcc_input = get_addr_from_coord_base(addrlib, surf, entry->w,
- entry->h, entry->format,
- surf->u.gfx9.color.dcc.rb_aligned,
- surf->u.gfx9.color.dcc.pipe_aligned);
+ dcc_input = gfx9_get_addr_from_coord_base(addrlib, surf, entry->w,
+ entry->h, entry->format,
+ surf->u.gfx9.color.dcc.rb_aligned,
+ surf->u.gfx9.color.dcc.pipe_aligned);
}
ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT display_dcc_input = {0};
if (surf->display_dcc_offset) {
- display_dcc_input = get_addr_from_coord_base(addrlib, surf, entry->w,
- entry->h, entry->format,
- false, false);
+ display_dcc_input = gfx9_get_addr_from_coord_base(addrlib, surf, entry->w,
+ entry->h, entry->format,
+ false, false);
}
for (unsigned i = 0; i < 1000; ++i) {
@@ -203,10 +202,10 @@ void generate_hash(struct ac_addrlib *ac_addrlib,
}
static void test_modifier(const struct radeon_info *info,
- const char *name,
+ const char *name,
struct ac_addrlib *addrlib,
uint64_t modifier,
- enum pipe_format format,
+ enum pipe_format format,
struct u_vector *test_entries)
{
unsigned elem_bits = util_logbase2(util_format_get_blocksize(format));
@@ -241,8 +240,8 @@ static void test_modifier(const struct radeon_info *info,
.rb = G_0098F8_NUM_RB_PER_SE(info->gb_addr_config) +
G_0098F8_NUM_SHADER_ENGINES_GFX9(info->gb_addr_config),
.se = G_0098F8_NUM_SHADER_ENGINES_GFX9(info->gb_addr_config),
- .banks_or_pkrs = info->chip_class >= GFX10 ?
- (info->gb_addr_config) : G_0098F8_NUM_BANKS(info->gb_addr_config)
+ .banks_or_pkrs = info->gfx_level >= GFX10 ?
+ G_0098F8_NUM_PKRS(info->gb_addr_config) : G_0098F8_NUM_BANKS(info->gb_addr_config)
};
struct radeon_surf surf = (struct radeon_surf) {
@@ -261,23 +260,27 @@ static void test_modifier(const struct radeon_info *info,
uint64_t surf_size;
unsigned aligned_pitch, aligned_height;
if (modifier != DRM_FORMAT_MOD_LINEAR) {
+ unsigned block_size_bits =
+ surf.u.gfx9.swizzle_mode >= ADDR_SW_256KB_Z_X ? 18 : 16;
+
surf_size = block_count(dims[i][0], dims[i][1],
- elem_bits, 16, &aligned_pitch,
- &aligned_height) << 16;
+ elem_bits, block_size_bits, &aligned_pitch,
+ &aligned_height) << block_size_bits;
} else {
- aligned_pitch = align(dims[i][0], 256 / util_format_get_blocksize(format));
+ unsigned alignment = 256;
+
+ aligned_pitch = align(dims[i][0], alignment / util_format_get_blocksize(format));
aligned_height = dims[i][1];
- surf_size = align(dims[i][0] * util_format_get_blocksize(format), 256) * dims[i][1];
+ surf_size = align(dims[i][0] * util_format_get_blocksize(format), alignment) * dims[i][1];
}
-
assert(surf.u.gfx9.surf_pitch == aligned_pitch);
assert(surf.u.gfx9.surf_height == aligned_height);
assert(surf.surf_size == surf_size);
uint64_t expected_offset = surf_size;
if (ac_modifier_has_dcc_retile(modifier)) {
- unsigned dcc_align = info->chip_class >= GFX10 ? 4096 : 65536;
+ unsigned dcc_align = info->gfx_level >= GFX10 ? 4096 : 65536;
unsigned dcc_pitch;
uint64_t dcc_size = block_count(dims[i][0], dims[i][1],
elem_bits, 20, &dcc_pitch,
@@ -294,9 +297,9 @@ static void test_modifier(const struct radeon_info *info,
if (ac_modifier_has_dcc(modifier)) {
uint64_t dcc_align = 1;
unsigned block_bits;
- if (info->chip_class >= GFX10) {
+ if (info->gfx_level >= GFX10) {
unsigned num_pipes = G_0098F8_NUM_PIPES(info->gb_addr_config);
- if (info->chip_class == GFX10_3 &&
+ if (info->gfx_level >= GFX10_3 &&
G_0098F8_NUM_PKRS(info->gb_addr_config) == num_pipes && num_pipes > 1)
++num_pipes;
block_bits = 16 +
@@ -329,10 +332,9 @@ static void test_modifier(const struct radeon_info *info,
assert(surf.total_size == expected_offset);
- generate_hash(addrlib, &entry, &surf);
+ gfx9_generate_hash(addrlib, &entry, &surf);
*(struct test_entry*)u_vector_add(test_entries) = entry;
}
-
}
static void run_modifier_test(struct u_vector *test_entries, const char *name,
@@ -388,8 +390,8 @@ static bool test_entry_value_equal(const struct test_entry *a, const struct test
static void print_test_entry(const struct test_entry *e)
{
- printf("%.16" PRIx64 " %.4d %.4d %.2d %s %d %d %d %d\n", e->modifier, e->w, e->h,
- util_format_get_blocksize(e->format), e->name, e->pipes, e->rb, e->se, e->banks_or_pkrs);
+ fprintf(stderr, "%.16" PRIx64 " %.4d %.4d %.2d %s %d %d %d %d\n", e->modifier, e->w, e->h,
+ util_format_get_blocksize(e->format), e->name, e->pipes, e->rb, e->se, e->banks_or_pkrs);
}
int main()
@@ -397,7 +399,7 @@ int main()
STATIC_ASSERT(sizeof(struct test_entry) == 64);
struct u_vector test_entries;
- u_vector_init(&test_entries, sizeof(struct test_entry), 4096);
+ u_vector_init_pow2(&test_entries, 64, sizeof(struct test_entry));
for (unsigned i = 0; i < ARRAY_SIZE(testcases); ++i) {
struct radeon_info info = get_radeon_info(&testcases[i]);