From cea935205919d825a3ff5287acd08f9832381168 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 14 May 2019 22:42:47 +0000 Subject: [PATCH] panfrost/decode: Stride decoding With a special flag, texture descriptors can include custom stride(s). We haven't seen a case of this used for mipmaps/cubemaps, so it's not clear how that will be encoded, but this dumps correctly for single one-level 2D textures. Signed-off-by: Alyssa Rosenzweig --- .../drivers/panfrost/include/panfrost-job.h | 3 ++ .../drivers/panfrost/pandecode/decode.c | 33 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/panfrost/include/panfrost-job.h b/src/gallium/drivers/panfrost/include/panfrost-job.h index 71ac054f7c3..96c2d07ef4d 100644 --- a/src/gallium/drivers/panfrost/include/panfrost-job.h +++ b/src/gallium/drivers/panfrost/include/panfrost-job.h @@ -1106,6 +1106,9 @@ enum mali_wrap_mode { /* Corresponds to the type passed to glTexImage2D and so forth */ +/* Flags for usage2 */ +#define MALI_TEX_MANUAL_STRIDE (0x20) + struct mali_texture_format { unsigned swizzle : 12; enum mali_format format : 8; diff --git a/src/gallium/drivers/panfrost/pandecode/decode.c b/src/gallium/drivers/panfrost/pandecode/decode.c index 5a1fcf75ead..f8f49f69e42 100644 --- a/src/gallium/drivers/panfrost/pandecode/decode.c +++ b/src/gallium/drivers/panfrost/pandecode/decode.c @@ -1507,6 +1507,20 @@ pandecode_replay_vertex_tiler_postfix_pre(const struct mali_vertex_tiler_postfix bitmap_count *= 6; } + if (f.usage2 & MALI_TEX_MANUAL_STRIDE) { + /* Stride for each... what exactly? TODO More traces */ + + if (bitmap_count > 1) { + pandecode_msg("Manual stride with mip/cubemaps, decode uncertain"); + } + + /* This is a guess, we've only + * seen for 1-level non-mip 2D + * */ + + bitmap_count += 1; + } + int max_count = sizeof(t->swizzled_bitmaps) / sizeof(t->swizzled_bitmaps[0]); if (bitmap_count > max_count) { @@ -1518,9 +1532,22 @@ pandecode_replay_vertex_tiler_postfix_pre(const struct mali_vertex_tiler_postfix int safe_count = MIN2(bitmap_count * 2, max_count); for (int i = 0; i < safe_count; ++i) { - char *a = pointer_as_memory_reference(t->swizzled_bitmaps[i]); - pandecode_log("%s%s, \n", (i >= bitmap_count) ? "// " : "", a); - free(a); + char *prefix = (i >= bitmap_count) ? "// " : ""; + + /* How we dump depends if this is a stride or a pointer */ + + if ((f.usage2 & MALI_TEX_MANUAL_STRIDE) && ((i + 1) == bitmap_count)) { + /* signed 32-bit snuck in as a 64-bit pointer */ + uint64_t stride_set = t->swizzled_bitmaps[i]; + uint32_t clamped_stride = stride_set; + int32_t stride = clamped_stride; + assert(stride_set == clamped_stride); + pandecode_log("%s(mali_ptr) %d /* stride */, \n", prefix, stride); + } else { + char *a = pointer_as_memory_reference(t->swizzled_bitmaps[i]); + pandecode_log("%s%s, \n", prefix, a); + free(a); + } } pandecode_indent--;