diff options
author | Alyssa Rosenzweig <[email protected]> | 2019-08-20 15:36:00 -0700 |
---|---|---|
committer | Alyssa Rosenzweig <[email protected]> | 2019-08-21 08:40:55 -0700 |
commit | 9f15f4d8e91194ee02c041647fda54bf726e6bbc (patch) | |
tree | 671f3ec9315ba46a8e0982a8537c79ad577cd621 | |
parent | 9b203950ec6480d38925a0b81e0066766268b126 (diff) |
panfrost: Break up usage2 field
This is another bit field describing layout.
Signed-off-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r-- | src/gallium/drivers/panfrost/pan_context.c | 29 | ||||
-rw-r--r-- | src/panfrost/include/panfrost-job.h | 26 | ||||
-rw-r--r-- | src/panfrost/pandecode/decode.c | 15 |
3 files changed, 42 insertions, 28 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 689aeae5419..63929890c02 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -569,33 +569,23 @@ panfrost_upload_sampler_descriptors(struct panfrost_context *ctx) } } -static unsigned -panfrost_layout_for_texture(struct panfrost_resource *rsrc, bool manual_stride) +static enum mali_texture_layout +panfrost_layout_for_texture(struct panfrost_resource *rsrc) { /* TODO: other linear depth textures */ bool is_depth = rsrc->base.format == PIPE_FORMAT_Z32_UNORM; - unsigned usage2_layout = 0x10; - switch (rsrc->layout) { case PAN_AFBC: - usage2_layout |= 0x8 | 0x4; - break; + return MALI_TEXTURE_AFBC; case PAN_TILED: - usage2_layout |= 0x1; - break; + assert(!is_depth); + return MALI_TEXTURE_TILED; case PAN_LINEAR: - usage2_layout |= is_depth ? 0x1 : 0x2; - break; + return is_depth ? MALI_TEXTURE_TILED : MALI_TEXTURE_LINEAR; default: - assert(0); - break; + unreachable("Invalid texture layout"); } - - if (manual_stride) - usage2_layout |= MALI_TEX_MANUAL_STRIDE; - - return usage2_layout; } static mali_ptr @@ -633,7 +623,8 @@ panfrost_upload_tex( /* Add the usage flags in, since they can change across the CSO * lifetime due to layout switches */ - view->hw.format.usage2 = panfrost_layout_for_texture(rsrc, has_manual_stride); + view->hw.format.layout = panfrost_layout_for_texture(rsrc); + view->hw.format.manual_stride = has_manual_stride; /* Inject the addresses in, interleaving mip levels, cube faces, and * strides in that order */ @@ -2254,7 +2245,6 @@ panfrost_create_sampler_view( * (data) itself. So, we serialise the descriptor here and cache it for * later. */ - /* TODO: Detect from format better */ const struct util_format_description *desc = util_format_description(prsrc->base.format); unsigned char user_swizzle[4] = { @@ -2309,6 +2299,7 @@ panfrost_create_sampler_view( .format = format, .srgb = desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB, .type = panfrost_translate_texture_type(template->target), + .unknown2 = 0x1, }, .swizzle = panfrost_translate_swizzle_4(user_swizzle) diff --git a/src/panfrost/include/panfrost-job.h b/src/panfrost/include/panfrost-job.h index 43c7c3763d0..694680a778f 100644 --- a/src/panfrost/include/panfrost-job.h +++ b/src/panfrost/include/panfrost-job.h @@ -1179,10 +1179,21 @@ enum mali_texture_type { /* For each pointer, there is an address and optionally also a stride */ #define MAX_ELEMENTS (2) -/* Corresponds to the type passed to glTexImage2D and so forth */ +/* It's not known why there are 4-bits allocated -- this enum is almost + * certainly incomplete */ + +enum mali_texture_layout { + /* For a Z/S texture, this is linear */ + MALI_TEXTURE_TILED = 0x1, + + /* Z/S textures cannot be tiled */ + MALI_TEXTURE_LINEAR = 0x2, + + /* 16x16 sparse */ + MALI_TEXTURE_AFBC = 0xC +}; -/* Flags for usage2 */ -#define MALI_TEX_MANUAL_STRIDE (0x20) +/* Corresponds to the type passed to glTexImage2D and so forth */ struct mali_texture_format { unsigned swizzle : 12; @@ -1192,8 +1203,15 @@ struct mali_texture_format { unsigned unknown1 : 1; enum mali_texture_type type : 2; + enum mali_texture_layout layout : 4; + + /* Always set */ + unsigned unknown2 : 1; + + /* Set to allow packing an explicit stride */ + unsigned manual_stride : 1; - unsigned usage2 : 8; + unsigned zero : 2; } __attribute__((packed)); struct mali_texture_descriptor { diff --git a/src/panfrost/pandecode/decode.c b/src/panfrost/pandecode/decode.c index f14cc805406..9918ba62262 100644 --- a/src/panfrost/pandecode/decode.c +++ b/src/panfrost/pandecode/decode.c @@ -1812,11 +1812,17 @@ pandecode_texture(mali_ptr u, pandecode_log_cont(",\n"); pandecode_prop("type = %s", pandecode_texture_type(f.type)); - pandecode_prop("usage2 = 0x%" PRIx32, f.usage2); + pandecode_prop("layout = %" PRId32, f.layout); - if (f.unknown1) { + if (f.unknown1 | f.zero) { pandecode_msg("XXX: texture format zero tripped\n"); pandecode_prop("unknown1 = %" PRId32, f.unknown1); + pandecode_prop("zero = %" PRId32, f.zero); + } + + if (!f.unknown2) { + pandecode_msg("XXX: expected unknown texture bit set\n"); + pandecode_prop("unknown2 = %" PRId32, f.unknown1); } pandecode_indent--; @@ -1846,7 +1852,6 @@ pandecode_texture(mali_ptr u, * possibilities to futureproof */ int bitmap_count = MALI_NEGATIVE(t->levels); - bool manual_stride = f.usage2 & MALI_TEX_MANUAL_STRIDE; /* Miptree for each face */ if (f.type == MALI_TEX_CUBE) @@ -1856,7 +1861,7 @@ pandecode_texture(mali_ptr u, bitmap_count *= MALI_NEGATIVE(t->array_size); /* Stride for each element */ - if (manual_stride) + if (f.manual_stride) bitmap_count *= 2; /* Sanity check the size */ @@ -1866,7 +1871,7 @@ pandecode_texture(mali_ptr u, for (int i = 0; i < bitmap_count; ++i) { /* How we dump depends if this is a stride or a pointer */ - if ((f.usage2 & MALI_TEX_MANUAL_STRIDE) && (i & 1)) { + if (f.manual_stride && (i & 1)) { /* signed 32-bit snuck in as a 64-bit pointer */ uint64_t stride_set = t->payload[i]; uint32_t clamped_stride = stride_set; |