assert(texture->nr_samples <= 1);
}
- enum mali_texture_type type =
- panfrost_translate_texture_type(so->base.target);
+ enum mali_texture_dimension type =
+ panfrost_translate_texture_dimension(so->base.target);
if (device->quirks & IS_BIFROST) {
unsigned char composed_swizzle[4];
so->base.u.tex.last_layer,
texture->nr_samples,
type, prsrc->modifier);
- size += sizeof(struct mali_texture_descriptor);
+ size += MALI_MIDGARD_TEXTURE_LENGTH;
so->bo = panfrost_bo_create(device, size, 0);
format = util_format_stencil_only(format);
}
- enum mali_texture_type type =
- panfrost_translate_texture_type(rsrc->base.target);
+ enum mali_texture_dimension dim =
+ panfrost_translate_texture_dimension(rsrc->base.target);
struct pan_image img = {
.width0 = rsrc->base.width0,
.height0 = rsrc->base.height0,
.depth0 = rsrc->base.depth0,
.format = format,
- .type = type,
+ .dim = dim,
.modifier = rsrc->modifier,
.array_size = rsrc->base.array_size,
.first_level = level,
fbx->ds_afbc.padding = 0x1000;
} else {
assert(rsrc->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED || rsrc->modifier == DRM_FORMAT_MOD_LINEAR);
-
/* TODO: Z32F(S8) support, which is always linear */
int stride = rsrc->slices[level].stride;
unsigned int nrects,
const struct pipe_box *rects);
-static inline enum mali_texture_type
-panfrost_translate_texture_type(enum pipe_texture_target t) {
+static inline enum mali_texture_dimension
+panfrost_translate_texture_dimension(enum pipe_texture_target t) {
switch (t)
{
case PIPE_BUFFER:
case PIPE_TEXTURE_1D:
case PIPE_TEXTURE_1D_ARRAY:
- return MALI_TEX_1D;
+ return MALI_TEXTURE_DIMENSION_1D;
case PIPE_TEXTURE_2D:
case PIPE_TEXTURE_2D_ARRAY:
case PIPE_TEXTURE_RECT:
- return MALI_TEX_2D;
+ return MALI_TEXTURE_DIMENSION_2D;
case PIPE_TEXTURE_3D:
- return MALI_TEX_3D;
+ return MALI_TEXTURE_DIMENSION_3D;
case PIPE_TEXTURE_CUBE:
case PIPE_TEXTURE_CUBE_ARRAY:
- return MALI_TEX_CUBE;
+ return MALI_TEXTURE_DIMENSION_CUBE;
default:
unreachable("Unknown target");
#define MALI_POSITIVE(dim) (dim - 1)
-/* Shared across both command stream and Midgard, and even with Bifrost */
-
-enum mali_texture_type {
- MALI_TEX_CUBE = 0x0,
- MALI_TEX_1D = 0x1,
- MALI_TEX_2D = 0x2,
- MALI_TEX_3D = 0x3
-};
-
/* 8192x8192 */
#define MAX_MIP_LEVELS (13)
/* For each pointer, there is an address and optionally also a stride */
#define MAX_ELEMENTS (2)
-/* 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
-};
-
-/* Corresponds to the type passed to glTexImage2D and so forth */
-
-struct mali_texture_format {
- unsigned swizzle : 12;
- enum mali_format format : 8;
-
- unsigned srgb : 1;
- 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 zero : 2;
-} __attribute__((packed));
-
-struct mali_texture_descriptor {
- uint16_t width;
- uint16_t height;
- uint16_t depth;
- uint16_t array_size;
-
- struct mali_texture_format format;
-
- uint16_t unknown3;
-
- /* One for non-mipmapped, zero for mipmapped */
- uint8_t unknown3A;
-
- /* Zero for non-mipmapped, (number of levels - 1) for mipmapped */
- uint8_t levels;
-
- /* Swizzling is a single 32-bit word, broken up here for convenience.
- * Here, swizzling refers to the ES 3.0 texture parameters for channel
- * level swizzling, not the internal pixel-level swizzling which is
- * below OpenGL's reach */
-
- unsigned swizzle : 12;
- unsigned swizzle_zero : 20;
-
- uint32_t unknown5;
- uint32_t unknown6;
- uint32_t unknown7;
-} __attribute__((packed));
-
/* While Midgard texture descriptors are variable length, Bifrost descriptors
* are fixed like samplers with more pointers to expand if necessary */
struct bifrost_texture_descriptor {
unsigned format_unk : 4; /* 2 */
- enum mali_texture_type type : 2;
+ enum mali_texture_dimension type : 2;
unsigned zero : 4;
unsigned format_swizzle : 12;
enum mali_format format : 8;
static void
pandecode_texture_payload(mali_ptr payload,
- enum mali_texture_type type,
+ enum mali_texture_dimension dim,
enum mali_texture_layout layout,
bool manual_stride,
uint8_t levels,
int bitmap_count = levels + 1;
/* Miptree for each face */
- if (type == MALI_TEX_CUBE)
+ if (dim == MALI_TEXTURE_DIMENSION_CUBE)
bitmap_count *= 6;
/* Array of layers */
- bitmap_count *= (depth + 1);
+ bitmap_count *= depth;
/* Array of textures */
- bitmap_count *= (array_size + 1);
+ bitmap_count *= array_size;
/* Stride for each element */
if (manual_stride)
struct pandecode_mapped_memory *tmem,
unsigned job_no, unsigned tex)
{
- struct mali_texture_descriptor *PANDECODE_PTR_VAR(t, tmem, u);
+ struct pandecode_mapped_memory *mapped_mem = pandecode_find_mapped_gpu_mem_containing(u);
+ const uint8_t *cl = pandecode_fetch_gpu_mem(mapped_mem, u, MALI_MIDGARD_TEXTURE_LENGTH);
- pandecode_log("struct mali_texture_descriptor texture_descriptor_%"PRIx64"_%d_%d = {\n", u, job_no, tex);
- pandecode_indent++;
-
- pandecode_prop("width = %" PRId32, t->width);
- pandecode_prop("height = %" PRId32, t->height);
- pandecode_prop("depth = %" PRId32, t->depth);
- pandecode_prop("array_size = %" PRId32, t->array_size);
-
- pandecode_log("\n");
- pandecode_prop("f.swizzle = 0x%" PRIx32, t->format.swizzle);
- pandecode_prop("f.format = 0x%" PRIx32, t->format.format);
- pandecode_prop("f.srgb = 0x%" PRIx32, t->format.srgb);
- pandecode_prop("f.unknown1 = 0x%" PRIx32, t->format.unknown1);
- pandecode_prop("f.type = %" PRId32, t->format.type);
- pandecode_prop("f.layout = %" PRId32, t->format.layout);
- pandecode_prop("f.unknown2 = 0x%" PRIx32, t->format.unknown2);
- pandecode_prop("f.manual_stride = %" PRId32, t->format.manual_stride);
- pandecode_prop("f.zero = 0x%" PRIx32, t->format.zero);
- pandecode_log("\n");
-
- pandecode_prop("unknown3 = 0x%" PRIx32, t->unknown3);
- pandecode_prop("unknown3A = 0x%" PRIx32, t->unknown3A);
- pandecode_prop("levels = %" PRId32, t->levels);
- pandecode_prop("swizzle = 0x%" PRIx32, t->swizzle);
- pandecode_prop("swizzle_zero = 0x%" PRIx32, t->swizzle_zero);
-
- pandecode_prop("unknown5 = 0x%" PRIx32, t->unknown5);
- pandecode_prop("unknown6 = 0x%" PRIx32, t->unknown6);
- pandecode_prop("unknown7 = 0x%" PRIx32, t->unknown7);
- pandecode_log("\n");
-
- struct mali_texture_format f = t->format;
-
- /* See the definiton of enum mali_texture_type */
-
- bool is_cube = f.type == MALI_TEX_CUBE;
- unsigned dimension = is_cube ? 2 : f.type;
-
- pandecode_make_indent();
-
- /* Print the layout. Default is linear; a modifier can denote AFBC or
- * u-interleaved/tiled modes */
-
- if (f.layout == MALI_TEXTURE_AFBC)
- pandecode_log_cont("afbc");
- else if (f.layout == MALI_TEXTURE_TILED)
- pandecode_log_cont("tiled");
- else if (f.layout == MALI_TEXTURE_LINEAR)
- pandecode_log_cont("linear");
- else
- pandecode_msg("XXX: invalid texture layout 0x%X\n", f.layout);
-
- pandecode_swizzle(t->swizzle, f.format);
- pandecode_log_cont(" ");
-
- /* Distinguish cube/2D with modifier */
-
- if (is_cube)
- pandecode_log_cont("cube ");
-
- pandecode_format_short(f.format, f.srgb);
- pandecode_swizzle(f.swizzle, f.format);
+ struct MALI_MIDGARD_TEXTURE temp;
+ MALI_MIDGARD_TEXTURE_unpack(cl, &temp);
+ MALI_MIDGARD_TEXTURE_print(pandecode_dump_stream, &temp, 2);
- /* All four width/height/depth/array_size dimensions are present
- * regardless of the type of texture, but it is an error to have
- * non-zero dimensions for unused dimensions. Verify this. array_size
- * can always be set, as can width. Depth used for MSAA. */
-
- if (t->height && dimension < 2)
- pandecode_msg("XXX: nonzero height for <2D texture\n");
-
- /* Print only the dimensions that are actually there */
-
- pandecode_log_cont(": %d", t->width + 1);
-
- if (t->height || t->depth)
- pandecode_log_cont("x%u", t->height + 1);
-
- if (t->depth)
- pandecode_log_cont("x%u", t->depth + 1);
-
- if (t->array_size)
- pandecode_log_cont("[%u]", t->array_size + 1);
-
- if (t->levels)
- pandecode_log_cont(" mip %u", t->levels);
-
- pandecode_log_cont("\n");
-
- 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.unknown2);
- }
-
- if (t->swizzle_zero) {
- pandecode_msg("XXX: swizzle zero tripped\n");
- pandecode_prop("swizzle_zero = %d", t->swizzle_zero);
- }
-
- if (t->unknown3 | t->unknown3A | t->unknown5 | t->unknown6 | t->unknown7) {
- pandecode_msg("XXX: texture zero tripped\n");
- pandecode_prop("unknown3 = %" PRId16, t->unknown3);
- pandecode_prop("unknown3A = %" PRId8, t->unknown3A);
- pandecode_prop("unknown5 = 0x%" PRIx32, t->unknown5);
- pandecode_prop("unknown6 = 0x%" PRIx32, t->unknown6);
- pandecode_prop("unknown7 = 0x%" PRIx32, t->unknown7);
- }
-
- pandecode_texture_payload(u + sizeof(*t), f.type, f.layout, f.manual_stride, t->levels, t->depth, t->array_size, tmem);
-
- pandecode_indent--;
- pandecode_log("};\n");
+ pandecode_texture_payload(u + MALI_MIDGARD_TEXTURE_LENGTH,
+ temp.dimension, temp.texel_ordering, temp.manual_stride,
+ temp.levels, temp.depth, temp.array_size, mapped_mem);
}
static void
pandecode_prop("unk5 = 0x%" PRIx32, t->unk5);
pandecode_log("\n");
- /* See the definiton of enum mali_texture_type */
-
- bool is_cube = t->type == MALI_TEX_CUBE;
+ bool is_cube = t->type == MALI_TEXTURE_DIMENSION_CUBE;
unsigned dimension = is_cube ? 2 : t->type;
/* Print the layout. Default is linear; a modifier can denote AFBC or
* u-interleaved/tiled modes */
- if (t->layout == MALI_TEXTURE_AFBC)
+ if (t->layout == MALI_TEXTURE_LAYOUT_AFBC)
pandecode_log_cont("afbc");
- else if (t->layout == MALI_TEXTURE_TILED)
+ else if (t->layout == MALI_TEXTURE_LAYOUT_TILED)
pandecode_log_cont("tiled");
- else if (t->layout == MALI_TEXTURE_LINEAR)
+ else if (t->layout == MALI_TEXTURE_LAYOUT_LINEAR)
pandecode_log_cont("linear");
else
pandecode_msg("XXX: invalid texture layout 0x%X\n", t->layout);
<value name="Decr Sat" value="7"/>
</enum>
+ <enum name="Texture Dimension">
+ <value name="Cube" value="0"/>
+ <value name="1D" value="1"/>
+ <value name="2D" value="2"/>
+ <value name="3D" value="3"/>
+ </enum>
+
+ <enum name="Texture Layout">
+ <!--- 16x16 block u-interleaved -->
+ <value name="Tiled" value="1"/>
+ <value name="Linear" value="2"/>
+ <value name="AFBC" value="12"/>
+ </enum>
+
<enum name="Wrap Mode">
<value name="Repeat" value="8"/>
<value name="Clamp to Edge" value="9"/>
<field name="Border Color A" size="32" start="7:0" type="float" default="0.0"/>
</struct>
+ <struct name="Midgard Texture" size="8">
+ <field name="Width" size="16" start="0:0" type="uint" modifier="minus(1)"/>
+ <field name="Height" size="16" start="0:16" type="uint" modifier="minus(1)"/>
+ <field name="Depth" size="16" start="1:0" type="uint" modifier="minus(1)"/>
+ <field name="Array size" size="16" start="1:16" type="uint" modifier="minus(1)"/>
+ <field name="Format" size="22" start="2:0" type="uint"/>
+ <field name="Dimension" size="2" start="2:22" type="Texture Dimension"/>
+ <field name="Texel ordering" size="4" start="2:24" type="Texture Layout"/>
+ <field name="Unknown" size="1" start="2:28" type="bool" default="true"/>
+ <field name="Manual stride" size="1" start="2:29" type="bool" default="false"/>
+ <field name="Levels" size="8" start="3:24" type="uint"/>
+ <field name="Swizzle" size="12" start="4:0" type="uint"/>
+ </struct>
+
<struct name="Bifrost Sampler" size="8">
<field name="Type" size="4" start="0:0" type="uint" default="1"/>
<field name="Wrap Mode R" size="4" start="0:8" type="Wrap Mode" default="Clamp to Edge"/>
* textures, removing the need to separately key the blit shaders for
* 2D and 3D variants */
- struct panfrost_transfer texture_t = panfrost_pool_alloc(pool, sizeof(struct mali_texture_descriptor) + sizeof(mali_ptr) * 2 * MAX2(image->nr_samples, 1));
+ struct panfrost_transfer texture_t = panfrost_pool_alloc(pool, MALI_MIDGARD_TEXTURE_LENGTH + sizeof(mali_ptr) * 2 * MAX2(image->nr_samples, 1));
panfrost_new_texture(texture_t.cpu,
image->width0, image->height0,
MAX2(image->nr_samples, 1), 1,
- image->format, MALI_TEX_2D,
+ image->format, MALI_TEXTURE_DIMENSION_2D,
image->modifier,
image->first_level, image->last_level,
0, 0,
(MALI_CHANNEL_RED << 0) | (MALI_CHANNEL_GREEN << 3) | (MALI_CHANNEL_BLUE << 6) | (MALI_CHANNEL_ALPHA << 9),
image->bo->gpu + image->first_layer *
panfrost_get_layer_stride(image->slices,
- image->type == MALI_TEX_3D,
+ image->dim == MALI_TEXTURE_DIMENSION_3D,
image->cubemap_stride, image->first_level),
image->slices);
* dedicated BO and not have to worry. In practice there are some minor gotchas
* with this (the driver sometimes will change the format of a texture on the
* fly for compression) but it's fast enough to just regenerate the descriptor
- * in those cases, rather than monkeypatching at drawtime.
- *
- * A texture descriptor consists of a 32-byte mali_texture_descriptor structure
- * followed by a variable number of pointers. Due to this variance and
- * potentially large size, we actually upload directly rather than returning
- * the descriptor. Whether the user does a copy themselves or not is irrelevant
- * to us here.
+ * in those cases, rather than monkeypatching at drawtime. A texture descriptor
+ * consists of a 32-byte header followed by pointers.
*/
/* List of supported modifiers, in descending order of preference. AFBC is
panfrost_modifier_to_layout(uint64_t modifier)
{
if (drm_is_afbc(modifier))
- return MALI_TEXTURE_AFBC;
+ return MALI_TEXTURE_LAYOUT_AFBC;
else if (modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED)
- return MALI_TEXTURE_TILED;
+ return MALI_TEXTURE_LAYOUT_TILED;
else if (modifier == DRM_FORMAT_MOD_LINEAR)
- return MALI_TEXTURE_LINEAR;
+ return MALI_TEXTURE_LAYOUT_LINEAR;
else
unreachable("Invalid modifer");
}
unsigned first_level, unsigned last_level,
unsigned first_layer, unsigned last_layer,
unsigned nr_samples,
- enum mali_texture_type type, uint64_t modifier)
+ enum mali_texture_dimension dim, uint64_t modifier)
{
/* Assume worst case */
unsigned manual_stride = (modifier == DRM_FORMAT_MOD_LINEAR);
first_level, last_level,
first_layer, last_layer,
nr_samples,
- type == MALI_TEX_CUBE, manual_stride);
+ dim == MALI_TEXTURE_DIMENSION_CUBE, manual_stride);
return sizeof(mali_ptr) * elements;
}
mali_ptr *payload,
const struct util_format_description *desc,
enum mali_format mali_format,
- enum mali_texture_type type,
+ enum mali_texture_dimension dim,
uint64_t modifier,
unsigned width, unsigned height,
unsigned first_level, unsigned last_level,
unsigned first_face = 0, last_face = 0, face_mult = 1;
- if (type == MALI_TEX_CUBE) {
+ if (dim == MALI_TEXTURE_DIMENSION_CUBE) {
face_mult = 6;
panfrost_adjust_cube_dimensions(&first_face, &last_face, &first_layer, &last_layer);
}
for (unsigned f = first_face; f <= last_face; ++f) {
for (unsigned s = 0; s < nr_samples; ++s) {
payload[idx++] = base + panfrost_texture_offset(
- slices, type == MALI_TEX_3D,
+ slices, dim == MALI_TEXTURE_DIMENSION_3D,
cube_stride, l, w * face_mult + f, s);
if (manual_stride) {
uint16_t width, uint16_t height,
uint16_t depth, uint16_t array_size,
enum pipe_format format,
- enum mali_texture_type type,
+ enum mali_texture_dimension dim,
uint64_t modifier,
unsigned first_level, unsigned last_level,
unsigned first_layer, unsigned last_layer,
&& panfrost_needs_explicit_stride(slices, width,
first_level, last_level, bytes_per_pixel);
- struct mali_texture_descriptor descriptor = {
- .width = MALI_POSITIVE(u_minify(width, first_level)),
- .height = MALI_POSITIVE(u_minify(height, first_level)),
- .depth = MALI_POSITIVE(u_minify(depth, first_level)),
- .array_size = MALI_POSITIVE(array_size),
- .format = {
- .swizzle = (format == PIPE_FORMAT_X24S8_UINT) ?
+ unsigned format_swizzle = (format == PIPE_FORMAT_X24S8_UINT) ?
MALI_SWIZZLE_A001 :
(format == PIPE_FORMAT_S8_UINT) ?
MALI_SWIZZLE_R001 :
- panfrost_translate_swizzle_4(desc->swizzle),
- .format = mali_format,
- .srgb = (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB),
- .type = type,
- .layout = panfrost_modifier_to_layout(modifier),
- .manual_stride = manual_stride,
- .unknown2 = 1,
- },
- .levels = last_level - first_level,
- .swizzle = swizzle
+ panfrost_translate_swizzle_4(desc->swizzle);
+
+ bool srgb = (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB);
+
+ pan_pack(out, MIDGARD_TEXTURE, cfg) {
+ cfg.width = u_minify(width, first_level);
+ cfg.height = u_minify(height, first_level);
+ cfg.depth = u_minify(depth, first_level);
+ cfg.array_size = array_size;
+ cfg.format = format_swizzle | (mali_format << 12) | (srgb << 20);
+ cfg.dimension = dim;
+ cfg.texel_ordering = panfrost_modifier_to_layout(modifier);
+ cfg.manual_stride = manual_stride;
+ cfg.levels = last_level - first_level;
+ cfg.swizzle = swizzle;
};
- memcpy(out, &descriptor, sizeof(descriptor));
-
- mali_ptr *payload = (mali_ptr *) (out + sizeof(struct mali_texture_descriptor));
panfrost_emit_texture_payload(
- payload,
+ (mali_ptr *) (out + MALI_MIDGARD_TEXTURE_LENGTH),
desc,
mali_format,
- type,
+ dim,
modifier,
width, height,
first_level, last_level,
uint16_t width, uint16_t height,
uint16_t depth, uint16_t array_size,
enum pipe_format format,
- enum mali_texture_type type,
+ enum mali_texture_dimension dim,
uint64_t modifier,
unsigned first_level, unsigned last_level,
unsigned first_layer, unsigned last_layer,
(mali_ptr *) payload->cpu,
desc,
mali_format,
- type,
+ dim,
modifier,
width, height,
first_level, last_level,
slices);
descriptor->format_unk = 0x2;
- descriptor->type = type;
+ descriptor->type = dim;
descriptor->format = mali_format;
descriptor->srgb = (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB);
descriptor->format_unk3 = 0x0;
/* Format and size */
uint16_t width0, height0, depth0, array_size;
enum pipe_format format;
- enum mali_texture_type type;
+ enum mali_texture_dimension dim;
unsigned first_level, last_level;
unsigned first_layer, last_layer;
unsigned nr_samples;
bool
panfrost_afbc_can_ytr(enum pipe_format format);
-/* mali_texture_descriptor */
-
unsigned
panfrost_estimate_texture_payload_size(
unsigned first_level, unsigned last_level,
unsigned first_layer, unsigned last_layer,
unsigned nr_samples,
- enum mali_texture_type type, uint64_t modifier);
+ enum mali_texture_dimension dim, uint64_t modifier);
void
panfrost_new_texture(
uint16_t width, uint16_t height,
uint16_t depth, uint16_t array_size,
enum pipe_format format,
- enum mali_texture_type type,
+ enum mali_texture_dimension dim,
uint64_t modifier,
unsigned first_level, unsigned last_level,
unsigned first_layer, unsigned last_layer,
uint16_t width, uint16_t height,
uint16_t depth, uint16_t array_size,
enum pipe_format format,
- enum mali_texture_type type,
+ enum mali_texture_dimension dim,
uint64_t modifier,
unsigned first_level, unsigned last_level,
unsigned first_layer, unsigned last_layer,