panfrost: XML-ify the single target framebuffer descriptor
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6797>
This commit is contained in:
parent
e855698ddd
commit
95eb7d9a34
|
@ -741,7 +741,7 @@ panfrost_batch_reserve_framebuffer(struct panfrost_batch *batch)
|
|||
|
||||
if (!batch->framebuffer.gpu) {
|
||||
unsigned size = (dev->quirks & MIDGARD_SFBD) ?
|
||||
sizeof(struct mali_single_framebuffer) :
|
||||
MALI_SINGLE_TARGET_FRAMEBUFFER_LENGTH :
|
||||
sizeof(struct mali_framebuffer);
|
||||
|
||||
batch->framebuffer = panfrost_pool_alloc_aligned(&batch->pool, size, 64);
|
||||
|
|
|
@ -28,8 +28,9 @@
|
|||
|
||||
#include "util/format/u_format.h"
|
||||
|
||||
static struct mali_sfbd_format
|
||||
panfrost_sfbd_format(struct pipe_surface *surf)
|
||||
static void
|
||||
panfrost_sfbd_format(struct pipe_surface *surf,
|
||||
struct MALI_SINGLE_TARGET_FRAMEBUFFER_PARAMETERS *fb)
|
||||
{
|
||||
/* Explode details on the format */
|
||||
|
||||
|
@ -41,90 +42,77 @@ panfrost_sfbd_format(struct pipe_surface *surf)
|
|||
unsigned char swizzle[4];
|
||||
panfrost_invert_swizzle(desc->swizzle, swizzle);
|
||||
|
||||
struct mali_sfbd_format fmt = {
|
||||
.unk1 = 0x1,
|
||||
.swizzle = panfrost_translate_swizzle_4(swizzle),
|
||||
.nr_channels = MALI_POSITIVE(desc->nr_channels),
|
||||
.unk2 = 0x4,
|
||||
.unk3 = 0xb,
|
||||
};
|
||||
fb->swizzle = panfrost_translate_swizzle_4(swizzle);
|
||||
|
||||
if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
|
||||
fmt.unk2 |= MALI_SFBD_FORMAT_SRGB;
|
||||
fb->srgb = true;
|
||||
|
||||
if (util_format_is_unorm8(desc)) {
|
||||
fb->internal_format = MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A8;
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
fb->color_writeback_format = MALI_SFBD_COLOR_FORMAT_R8;
|
||||
break;
|
||||
case 2:
|
||||
fb->color_writeback_format = MALI_SFBD_COLOR_FORMAT_R8G8;
|
||||
break;
|
||||
case 3:
|
||||
fb->color_writeback_format = MALI_SFBD_COLOR_FORMAT_R8G8B8;
|
||||
break;
|
||||
case 4:
|
||||
fb->color_writeback_format = MALI_SFBD_COLOR_FORMAT_R8G8B8A8;
|
||||
break;
|
||||
default:
|
||||
unreachable("Invalid number of components");
|
||||
}
|
||||
|
||||
/* If 8b RGB variant, we're good to go */
|
||||
return;
|
||||
}
|
||||
|
||||
/* sRGB handled as a dedicated flag */
|
||||
enum pipe_format linearized = util_format_linear(surf->format);
|
||||
|
||||
/* If RGB, we're good to go */
|
||||
if (util_format_is_unorm8(desc))
|
||||
return fmt;
|
||||
|
||||
switch (linearized) {
|
||||
case PIPE_FORMAT_B5G6R5_UNORM:
|
||||
fmt.unk1 = 0x5;
|
||||
fmt.nr_channels = MALI_POSITIVE(2);
|
||||
fmt.unk2 = 0x5;
|
||||
fb->internal_format = MALI_COLOR_BUFFER_INTERNAL_FORMAT_R5G6B5A0;
|
||||
fb->color_writeback_format = MALI_SFBD_COLOR_FORMAT_R5G6B5;
|
||||
break;
|
||||
|
||||
case PIPE_FORMAT_A4B4G4R4_UNORM:
|
||||
case PIPE_FORMAT_B4G4R4A4_UNORM:
|
||||
case PIPE_FORMAT_R4G4B4A4_UNORM:
|
||||
fmt.unk1 = 0x4;
|
||||
fmt.nr_channels = MALI_POSITIVE(1);
|
||||
fmt.unk2 = 0x5;
|
||||
fb->internal_format = MALI_COLOR_BUFFER_INTERNAL_FORMAT_R4G4B4A4;
|
||||
fb->color_writeback_format = MALI_SFBD_COLOR_FORMAT_R4G4B4A4;
|
||||
break;
|
||||
|
||||
default:
|
||||
unreachable("Invalid format rendering");
|
||||
}
|
||||
|
||||
return fmt;
|
||||
}
|
||||
|
||||
static void
|
||||
panfrost_sfbd_clear(
|
||||
struct panfrost_batch *batch,
|
||||
struct mali_single_framebuffer *sfbd)
|
||||
struct MALI_SINGLE_TARGET_FRAMEBUFFER_PARAMETERS *sfbd)
|
||||
{
|
||||
if (batch->clear & PIPE_CLEAR_COLOR) {
|
||||
sfbd->clear_color_1 = batch->clear_color[0][0];
|
||||
sfbd->clear_color_2 = batch->clear_color[0][1];
|
||||
sfbd->clear_color_3 = batch->clear_color[0][2];
|
||||
sfbd->clear_color_4 = batch->clear_color[0][3];
|
||||
sfbd->clear_color_0 = batch->clear_color[0][0];
|
||||
sfbd->clear_color_1 = batch->clear_color[0][1];
|
||||
sfbd->clear_color_2 = batch->clear_color[0][2];
|
||||
sfbd->clear_color_3 = batch->clear_color[0][3];
|
||||
}
|
||||
|
||||
if (batch->clear & PIPE_CLEAR_DEPTH) {
|
||||
sfbd->clear_depth_1 = batch->clear_depth;
|
||||
sfbd->clear_depth_2 = batch->clear_depth;
|
||||
sfbd->clear_depth_3 = batch->clear_depth;
|
||||
sfbd->clear_depth_4 = batch->clear_depth;
|
||||
}
|
||||
if (batch->clear & PIPE_CLEAR_DEPTH)
|
||||
sfbd->z_clear = batch->clear_depth;
|
||||
|
||||
if (batch->clear & PIPE_CLEAR_STENCIL) {
|
||||
sfbd->clear_stencil = batch->clear_stencil;
|
||||
}
|
||||
|
||||
/* Set flags based on what has been cleared, for the SFBD case */
|
||||
/* XXX: What do these flags mean? */
|
||||
int clear_flags = 0x101100;
|
||||
|
||||
if (!(batch->clear & ~(PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
|
||||
/* On a tiler like this, it's fastest to clear all three buffers at once */
|
||||
|
||||
clear_flags |= MALI_CLEAR_FAST;
|
||||
} else {
|
||||
clear_flags |= MALI_CLEAR_SLOW;
|
||||
|
||||
if (batch->clear & PIPE_CLEAR_STENCIL)
|
||||
clear_flags |= MALI_CLEAR_SLOW_STENCIL;
|
||||
}
|
||||
|
||||
sfbd->clear_flags = clear_flags;
|
||||
if (batch->clear & PIPE_CLEAR_STENCIL)
|
||||
sfbd->s_clear = batch->clear_stencil & 0xff;
|
||||
}
|
||||
|
||||
static void
|
||||
panfrost_sfbd_set_cbuf(
|
||||
struct mali_single_framebuffer *fb,
|
||||
struct MALI_SINGLE_TARGET_FRAMEBUFFER_PARAMETERS *fb,
|
||||
struct pipe_surface *surf)
|
||||
{
|
||||
struct panfrost_resource *rsrc = pan_resource(surf->texture);
|
||||
|
@ -136,16 +124,17 @@ panfrost_sfbd_set_cbuf(
|
|||
|
||||
mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
|
||||
|
||||
fb->format = panfrost_sfbd_format(surf);
|
||||
panfrost_sfbd_format(surf, fb);
|
||||
|
||||
fb->framebuffer = base;
|
||||
fb->stride = stride;
|
||||
fb->color_write_enable = true;
|
||||
fb->color_writeback.base = base;
|
||||
fb->color_writeback.row_stride = stride;
|
||||
|
||||
if (rsrc->modifier == DRM_FORMAT_MOD_LINEAR)
|
||||
fb->format.block = MALI_BLOCK_FORMAT_LINEAR;
|
||||
fb->color_block_format = MALI_BLOCK_FORMAT_LINEAR;
|
||||
else if (rsrc->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED) {
|
||||
fb->format.block = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED;
|
||||
fb->stride *= 16;
|
||||
fb->color_block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED;
|
||||
fb->color_writeback.row_stride *= 16;
|
||||
} else {
|
||||
fprintf(stderr, "Invalid render modifier\n");
|
||||
assert(0);
|
||||
|
@ -154,11 +143,10 @@ panfrost_sfbd_set_cbuf(
|
|||
|
||||
static void
|
||||
panfrost_sfbd_set_zsbuf(
|
||||
struct mali_single_framebuffer *fb,
|
||||
struct MALI_SINGLE_TARGET_FRAMEBUFFER_PARAMETERS *fb,
|
||||
struct pipe_surface *surf)
|
||||
{
|
||||
struct panfrost_resource *rsrc = pan_resource(surf->texture);
|
||||
struct panfrost_context *ctx = pan_context(surf->context);
|
||||
|
||||
unsigned level = surf->u.tex.level;
|
||||
assert(surf->u.tex.first_layer == 0);
|
||||
|
@ -166,59 +154,47 @@ panfrost_sfbd_set_zsbuf(
|
|||
if (rsrc->modifier != DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED)
|
||||
unreachable("Invalid render modifier.");
|
||||
|
||||
fb->depth_buffer = rsrc->bo->gpu + rsrc->slices[level].offset;
|
||||
fb->depth_stride = rsrc->slices[level].stride;
|
||||
|
||||
/* No stencil? Job done. */
|
||||
if (!ctx->depth_stencil || !ctx->depth_stencil->base.stencil[0].enabled)
|
||||
return;
|
||||
|
||||
if (panfrost_is_z24s8_variant(surf->format)) {
|
||||
/* Stencil data is interleaved with depth */
|
||||
fb->stencil_buffer = fb->depth_buffer;
|
||||
fb->stencil_stride = fb->depth_stride;
|
||||
} else if (surf->format == PIPE_FORMAT_Z32_FLOAT) {
|
||||
/* No stencil, nothing to do */
|
||||
} else if (surf->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) {
|
||||
/* Stencil data in separate buffer */
|
||||
struct panfrost_resource *stencil = rsrc->separate_stencil;
|
||||
struct panfrost_slice stencil_slice = stencil->slices[level];
|
||||
|
||||
fb->stencil_buffer = stencil->bo->gpu + stencil_slice.offset;
|
||||
fb->stencil_stride = stencil_slice.stride;
|
||||
} else
|
||||
fb->zs_block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED;
|
||||
fb->zs_writeback.base = rsrc->bo->gpu + rsrc->slices[level].offset;
|
||||
fb->zs_writeback.row_stride = rsrc->slices[level].stride * 16;
|
||||
switch (surf->format) {
|
||||
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
|
||||
fb->zs_format = MALI_ZS_FORMAT_D24S8;
|
||||
break;
|
||||
case PIPE_FORMAT_Z24X8_UNORM:
|
||||
fb->zs_format = MALI_ZS_FORMAT_D24X8;
|
||||
break;
|
||||
case PIPE_FORMAT_Z32_FLOAT:
|
||||
fb->zs_format = MALI_ZS_FORMAT_D32;
|
||||
break;
|
||||
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
|
||||
fb->zs_format = MALI_ZS_FORMAT_D32_S8X24;
|
||||
break;
|
||||
default:
|
||||
unreachable("Unsupported depth/stencil format.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static struct mali_single_framebuffer
|
||||
panfrost_emit_sfbd(struct panfrost_batch *batch, unsigned vertex_count)
|
||||
static void
|
||||
panfrost_init_sfbd_params(struct panfrost_batch *batch,
|
||||
struct MALI_SINGLE_TARGET_FRAMEBUFFER_PARAMETERS *sfbd)
|
||||
{
|
||||
struct panfrost_context *ctx = batch->ctx;
|
||||
struct pipe_context *gallium = (struct pipe_context *) ctx;
|
||||
struct panfrost_device *dev = pan_device(gallium->screen);
|
||||
|
||||
unsigned width = batch->key.width;
|
||||
unsigned height = batch->key.height;
|
||||
sfbd->bound_max_x = batch->key.width - 1;
|
||||
sfbd->bound_max_y = batch->key.height - 1;
|
||||
sfbd->dithering_enable = true;
|
||||
sfbd->clean_pixel_write_enable = true;
|
||||
sfbd->tie_break_rule = MALI_TIE_BREAK_RULE_MINUS_180_IN_0_OUT;
|
||||
}
|
||||
|
||||
static void
|
||||
panfrost_emit_sfdb_local_storage(struct panfrost_batch *batch, void *sfbd,
|
||||
unsigned vertex_count)
|
||||
{
|
||||
struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
|
||||
/* TODO: Why do we need to make the stack bigger than other platforms? */
|
||||
unsigned shift = panfrost_get_stack_shift(MAX2(batch->stack_size, 512));
|
||||
|
||||
struct mali_single_framebuffer framebuffer = {
|
||||
.width = MALI_POSITIVE(width),
|
||||
.height = MALI_POSITIVE(height),
|
||||
.format = {
|
||||
.unk3 = 0x3,
|
||||
},
|
||||
.clear_flags = 0x1000,
|
||||
};
|
||||
|
||||
struct mali_midgard_tiler_packed t;
|
||||
panfrost_emit_midg_tiler(batch, &t, vertex_count);
|
||||
framebuffer.tiler = t;
|
||||
|
||||
struct mali_local_storage_packed lsp;
|
||||
pan_pack(&lsp, LOCAL_STORAGE, ls) {
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, LOCAL_STORAGE, ls) {
|
||||
ls.tls_size = shift;
|
||||
ls.wls_instances = MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM;
|
||||
ls.tls_base_pointer =
|
||||
|
@ -227,18 +203,32 @@ panfrost_emit_sfbd(struct panfrost_batch *batch, unsigned vertex_count)
|
|||
dev->thread_tls_alloc,
|
||||
dev->core_count)->gpu;
|
||||
}
|
||||
framebuffer.shared_memory = lsp;
|
||||
}
|
||||
|
||||
return framebuffer;
|
||||
static void
|
||||
panfrost_emit_sfdb_tiler(struct panfrost_batch *batch, void *sfbd,
|
||||
unsigned vertex_count)
|
||||
{
|
||||
void *tiler = pan_section_ptr(sfbd, SINGLE_TARGET_FRAMEBUFFER, TILER);
|
||||
|
||||
panfrost_emit_midg_tiler(batch, tiler, vertex_count);
|
||||
|
||||
/* All weights set to 0, nothing to do here */
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, PADDING_1, padding) {}
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, TILER_WEIGHTS, w) {}
|
||||
}
|
||||
|
||||
void
|
||||
panfrost_attach_sfbd(struct panfrost_batch *batch, unsigned vertex_count)
|
||||
{
|
||||
struct mali_single_framebuffer sfbd =
|
||||
panfrost_emit_sfbd(batch, vertex_count);
|
||||
void *sfbd = batch->framebuffer.cpu;
|
||||
|
||||
memcpy(batch->framebuffer.cpu, &sfbd, sizeof(sfbd));
|
||||
panfrost_emit_sfdb_local_storage(batch, sfbd, vertex_count);
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, PARAMETERS, params) {
|
||||
panfrost_init_sfbd_params(batch, ¶ms);
|
||||
}
|
||||
panfrost_emit_sfdb_tiler(batch, sfbd, vertex_count);
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, PADDING_2, padding) {}
|
||||
}
|
||||
|
||||
/* Creates an SFBD for the FRAGMENT section of the bound framebuffer */
|
||||
|
@ -246,35 +236,46 @@ panfrost_attach_sfbd(struct panfrost_batch *batch, unsigned vertex_count)
|
|||
mali_ptr
|
||||
panfrost_sfbd_fragment(struct panfrost_batch *batch, bool has_draws)
|
||||
{
|
||||
struct mali_single_framebuffer fb = panfrost_emit_sfbd(batch, has_draws);
|
||||
struct panfrost_transfer t =
|
||||
panfrost_pool_alloc_aligned(&batch->pool,
|
||||
MALI_SINGLE_TARGET_FRAMEBUFFER_LENGTH,
|
||||
64);
|
||||
void *sfbd = t.cpu;
|
||||
|
||||
panfrost_sfbd_clear(batch, &fb);
|
||||
panfrost_emit_sfdb_local_storage(batch, sfbd, has_draws);
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, PARAMETERS, params) {
|
||||
panfrost_init_sfbd_params(batch, ¶ms);
|
||||
panfrost_sfbd_clear(batch, ¶ms);
|
||||
|
||||
/* SFBD does not support MRT natively; sanity check */
|
||||
assert(batch->key.nr_cbufs <= 1);
|
||||
if (batch->key.nr_cbufs) {
|
||||
struct pipe_surface *surf = batch->key.cbufs[0];
|
||||
struct panfrost_resource *rsrc = pan_resource(surf->texture);
|
||||
struct panfrost_bo *bo = rsrc->bo;
|
||||
/* SFBD does not support MRT natively; sanity check */
|
||||
assert(batch->key.nr_cbufs <= 1);
|
||||
if (batch->key.nr_cbufs) {
|
||||
struct pipe_surface *surf = batch->key.cbufs[0];
|
||||
struct panfrost_resource *rsrc = pan_resource(surf->texture);
|
||||
struct panfrost_bo *bo = rsrc->bo;
|
||||
|
||||
panfrost_sfbd_set_cbuf(&fb, surf);
|
||||
panfrost_sfbd_set_cbuf(¶ms, surf);
|
||||
|
||||
if (rsrc->checksummed) {
|
||||
unsigned level = surf->u.tex.level;
|
||||
struct panfrost_slice *slice = &rsrc->slices[level];
|
||||
if (rsrc->checksummed) {
|
||||
unsigned level = surf->u.tex.level;
|
||||
struct panfrost_slice *slice = &rsrc->slices[level];
|
||||
|
||||
fb.checksum_stride = slice->checksum_stride;
|
||||
fb.checksum = bo->gpu + slice->checksum_offset;
|
||||
params.crc_buffer.row_stride = slice->checksum_stride;
|
||||
params.crc_buffer.base = bo->gpu + slice->checksum_offset;
|
||||
}
|
||||
}
|
||||
|
||||
if (batch->key.zsbuf)
|
||||
panfrost_sfbd_set_zsbuf(¶ms, batch->key.zsbuf);
|
||||
|
||||
if (batch->requirements & PAN_REQ_MSAA) {
|
||||
/* Only 4x MSAA supported right now. */
|
||||
params.sample_count = 4;
|
||||
params.msaa = MALI_MSAA_MULTIPLE;
|
||||
}
|
||||
}
|
||||
panfrost_emit_sfdb_tiler(batch, sfbd, has_draws);
|
||||
pan_section_pack(sfbd, SINGLE_TARGET_FRAMEBUFFER, PADDING_2, padding) {}
|
||||
|
||||
if (batch->key.zsbuf)
|
||||
panfrost_sfbd_set_zsbuf(&fb, batch->key.zsbuf);
|
||||
|
||||
if (batch->requirements & PAN_REQ_MSAA) {
|
||||
fb.format.unk1 |= MALI_SFBD_FORMAT_MSAA_A;
|
||||
fb.format.unk2 |= MALI_SFBD_FORMAT_MSAA_B;
|
||||
}
|
||||
|
||||
return panfrost_pool_upload_aligned(&batch->pool, &fb, sizeof(fb), 64);
|
||||
return t.gpu;
|
||||
}
|
||||
|
|
|
@ -545,41 +545,6 @@ struct mali_payload_fragment {
|
|||
mali_ptr framebuffer;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Single Framebuffer Descriptor */
|
||||
|
||||
/* Flags apply to format. With just MSAA_A and MSAA_B, the framebuffer is
|
||||
* configured for 4x. With MSAA_8, it is configured for 8x. */
|
||||
|
||||
#define MALI_SFBD_FORMAT_MSAA_8 (1 << 3)
|
||||
#define MALI_SFBD_FORMAT_MSAA_A (1 << 4)
|
||||
#define MALI_SFBD_FORMAT_MSAA_B (1 << 4)
|
||||
#define MALI_SFBD_FORMAT_SRGB (1 << 5)
|
||||
|
||||
/* Fast/slow based on whether all three buffers are cleared at once */
|
||||
|
||||
#define MALI_CLEAR_FAST (1 << 18)
|
||||
#define MALI_CLEAR_SLOW (1 << 28)
|
||||
#define MALI_CLEAR_SLOW_STENCIL (1 << 31)
|
||||
|
||||
struct mali_sfbd_format {
|
||||
/* 0x1 */
|
||||
unsigned unk1 : 6;
|
||||
|
||||
/* mali_channel_swizzle */
|
||||
unsigned swizzle : 12;
|
||||
|
||||
/* MALI_POSITIVE */
|
||||
unsigned nr_channels : 2;
|
||||
|
||||
/* 0x4 */
|
||||
unsigned unk2 : 6;
|
||||
|
||||
enum mali_block_format block : 2;
|
||||
|
||||
/* 0xb */
|
||||
unsigned unk3 : 4;
|
||||
};
|
||||
|
||||
/* Configures multisampling on Bifrost fragment jobs */
|
||||
|
||||
struct bifrost_multisampling {
|
||||
|
@ -589,72 +554,6 @@ struct bifrost_multisampling {
|
|||
u64 zero4;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct mali_single_framebuffer {
|
||||
struct mali_local_storage_packed shared_memory;
|
||||
struct mali_sfbd_format format;
|
||||
|
||||
u32 clear_flags;
|
||||
u32 zero2;
|
||||
|
||||
/* Purposeful off-by-one in these fields should be accounted for by the
|
||||
* MALI_DIMENSION macro */
|
||||
|
||||
u16 width;
|
||||
u16 height;
|
||||
|
||||
u32 zero3[4];
|
||||
mali_ptr checksum;
|
||||
u32 checksum_stride;
|
||||
u32 zero5;
|
||||
|
||||
/* By default, the framebuffer is upside down from OpenGL's
|
||||
* perspective. Set framebuffer to the end and negate the stride to
|
||||
* flip in the Y direction */
|
||||
|
||||
mali_ptr framebuffer;
|
||||
int32_t stride;
|
||||
|
||||
u32 zero4;
|
||||
|
||||
/* Depth and stencil buffers are interleaved, it appears, as they are
|
||||
* set to the same address in captures. Both fields set to zero if the
|
||||
* buffer is not being cleared. Depending on GL_ENABLE magic, you might
|
||||
* get a zero enable despite the buffer being present; that still is
|
||||
* disabled. */
|
||||
|
||||
mali_ptr depth_buffer; // not SAME_VA
|
||||
u32 depth_stride_zero : 4;
|
||||
u32 depth_stride : 28;
|
||||
u32 zero7;
|
||||
|
||||
mali_ptr stencil_buffer; // not SAME_VA
|
||||
u32 stencil_stride_zero : 4;
|
||||
u32 stencil_stride : 28;
|
||||
u32 zero8;
|
||||
|
||||
u32 clear_color_1; // RGBA8888 from glClear, actually used by hardware
|
||||
u32 clear_color_2; // always equal, but unclear function?
|
||||
u32 clear_color_3; // always equal, but unclear function?
|
||||
u32 clear_color_4; // always equal, but unclear function?
|
||||
|
||||
/* Set to zero if not cleared */
|
||||
|
||||
float clear_depth_1; // float32, ditto
|
||||
float clear_depth_2; // float32, ditto
|
||||
float clear_depth_3; // float32, ditto
|
||||
float clear_depth_4; // float32, ditto
|
||||
|
||||
u32 clear_stencil; // Exactly as it appears in OpenGL
|
||||
|
||||
u32 zero6[7];
|
||||
|
||||
struct mali_midgard_tiler_packed tiler;
|
||||
struct mali_midgard_tiler_weights_packed tiler_weights;
|
||||
|
||||
/* More below this, maybe */
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
#define MALI_MFBD_FORMAT_SRGB (1 << 0)
|
||||
|
||||
struct mali_rt_format {
|
||||
|
|
|
@ -67,6 +67,12 @@ static void pandecode_swizzle(unsigned swizzle, enum mali_format format);
|
|||
DUMP_UNPACKED(T, temp, __VA_ARGS__); \
|
||||
}
|
||||
|
||||
#define DUMP_SECTION(A, S, cl, ...) { \
|
||||
pan_section_unpack(cl, A, S, temp); \
|
||||
pandecode_log(__VA_ARGS__); \
|
||||
pan_section_print(pandecode_dump_stream, A, S, temp, (pandecode_indent + 1) * 2); \
|
||||
}
|
||||
|
||||
#define MAP_ADDR(T, addr, cl) \
|
||||
const uint8_t *cl = 0; \
|
||||
{ \
|
||||
|
@ -211,15 +217,6 @@ pandecode_log_decoded_flags(const struct pandecode_flag_info *flag_info,
|
|||
}
|
||||
}
|
||||
|
||||
#define FLAG_INFO(flag) { MALI_CLEAR_##flag, "MALI_CLEAR_" #flag }
|
||||
static const struct pandecode_flag_info clear_flag_info[] = {
|
||||
FLAG_INFO(FAST),
|
||||
FLAG_INFO(SLOW),
|
||||
FLAG_INFO(SLOW_STENCIL),
|
||||
{}
|
||||
};
|
||||
#undef FLAG_INFO
|
||||
|
||||
#define FLAG_INFO(flag) { MALI_MFBD_FORMAT_##flag, "MALI_MFBD_FORMAT_" #flag }
|
||||
static const struct pandecode_flag_info mfbd_fmt_flag_info[] = {
|
||||
FLAG_INFO(SRGB),
|
||||
|
@ -256,22 +253,6 @@ static const struct pandecode_flag_info mfbd_flag_info [] = {
|
|||
};
|
||||
#undef FLAG_INFO
|
||||
|
||||
#define FLAG_INFO(flag) { MALI_SFBD_FORMAT_##flag, "MALI_SFBD_FORMAT_" #flag }
|
||||
static const struct pandecode_flag_info sfbd_unk1_info [] = {
|
||||
FLAG_INFO(MSAA_8),
|
||||
FLAG_INFO(MSAA_A),
|
||||
{}
|
||||
};
|
||||
#undef FLAG_INFO
|
||||
|
||||
#define FLAG_INFO(flag) { MALI_SFBD_FORMAT_##flag, "MALI_SFBD_FORMAT_" #flag }
|
||||
static const struct pandecode_flag_info sfbd_unk2_info [] = {
|
||||
FLAG_INFO(MSAA_B),
|
||||
FLAG_INFO(SRGB),
|
||||
{}
|
||||
};
|
||||
#undef FLAG_INFO
|
||||
|
||||
/* Midgard's tiler descriptor is embedded within the
|
||||
* larger FBD */
|
||||
|
||||
|
@ -403,141 +384,38 @@ struct pandecode_fbd {
|
|||
bool has_extra;
|
||||
};
|
||||
|
||||
static void
|
||||
pandecode_sfbd_format(struct mali_sfbd_format format)
|
||||
{
|
||||
pandecode_log(".format = {\n");
|
||||
pandecode_indent++;
|
||||
|
||||
pandecode_log(".unk1 = ");
|
||||
pandecode_log_decoded_flags(sfbd_unk1_info, format.unk1);
|
||||
pandecode_log_cont(",\n");
|
||||
|
||||
/* TODO: Map formats so we can check swizzles and print nicely */
|
||||
pandecode_log("swizzle");
|
||||
pandecode_swizzle(format.swizzle, MALI_RGBA8_UNORM);
|
||||
pandecode_log_cont(",\n");
|
||||
|
||||
pandecode_prop("nr_channels = MALI_POSITIVE(%d)",
|
||||
(format.nr_channels + 1));
|
||||
|
||||
pandecode_log(".unk2 = ");
|
||||
pandecode_log_decoded_flags(sfbd_unk2_info, format.unk2);
|
||||
pandecode_log_cont(",\n");
|
||||
|
||||
pandecode_prop("block = %s", mali_block_format_as_str(format.block));
|
||||
|
||||
pandecode_prop("unk3 = 0x%" PRIx32, format.unk3);
|
||||
|
||||
pandecode_indent--;
|
||||
pandecode_log("},\n");
|
||||
}
|
||||
|
||||
static struct pandecode_fbd
|
||||
pandecode_sfbd(uint64_t gpu_va, int job_no, bool is_fragment, unsigned gpu_id)
|
||||
{
|
||||
struct pandecode_mapped_memory *mem = pandecode_find_mapped_gpu_mem_containing(gpu_va);
|
||||
const struct mali_single_framebuffer *PANDECODE_PTR_VAR(s, mem, (mali_ptr) gpu_va);
|
||||
const void *PANDECODE_PTR_VAR(s, mem, (mali_ptr) gpu_va);
|
||||
|
||||
struct pandecode_fbd info = {
|
||||
.has_extra = false,
|
||||
.rt_count = 1
|
||||
};
|
||||
|
||||
pandecode_log("struct mali_single_framebuffer framebuffer_%"PRIx64"_%d = {\n", gpu_va, job_no);
|
||||
pandecode_log("Single-Target Framebuffer:\n");
|
||||
pandecode_indent++;
|
||||
DUMP_CL(LOCAL_STORAGE, &s->shared_memory, "Local Storage:\n");
|
||||
pandecode_sfbd_format(s->format);
|
||||
|
||||
info.width = s->width + 1;
|
||||
info.height = s->height + 1;
|
||||
DUMP_SECTION(SINGLE_TARGET_FRAMEBUFFER, LOCAL_STORAGE, s, "Local Storage:\n");
|
||||
pan_section_unpack(s, SINGLE_TARGET_FRAMEBUFFER, PARAMETERS, p);
|
||||
DUMP_UNPACKED(SINGLE_TARGET_FRAMEBUFFER_PARAMETERS, p, "Parameters:\n");
|
||||
|
||||
pandecode_prop("width = MALI_POSITIVE(%" PRId16 ")", info.width);
|
||||
pandecode_prop("height = MALI_POSITIVE(%" PRId16 ")", info.height);
|
||||
|
||||
MEMORY_PROP(s, checksum);
|
||||
|
||||
if (s->checksum_stride)
|
||||
pandecode_prop("checksum_stride = %d", s->checksum_stride);
|
||||
|
||||
MEMORY_PROP(s, framebuffer);
|
||||
pandecode_prop("stride = %d", s->stride);
|
||||
|
||||
/* Earlier in the actual commandstream -- right before width -- but we
|
||||
* delay to flow nicer */
|
||||
|
||||
pandecode_log(".clear_flags = ");
|
||||
pandecode_log_decoded_flags(clear_flag_info, s->clear_flags);
|
||||
pandecode_log_cont(",\n");
|
||||
|
||||
if (s->depth_buffer) {
|
||||
MEMORY_PROP(s, depth_buffer);
|
||||
pandecode_prop("depth_stride = %d", s->depth_stride);
|
||||
}
|
||||
|
||||
if (s->stencil_buffer) {
|
||||
MEMORY_PROP(s, stencil_buffer);
|
||||
pandecode_prop("stencil_stride = %d", s->stencil_stride);
|
||||
}
|
||||
|
||||
if (s->depth_stride_zero ||
|
||||
s->stencil_stride_zero ||
|
||||
s->zero7 || s->zero8) {
|
||||
pandecode_msg("XXX: Depth/stencil zeros tripped\n");
|
||||
pandecode_prop("depth_stride_zero = 0x%x",
|
||||
s->depth_stride_zero);
|
||||
pandecode_prop("stencil_stride_zero = 0x%x",
|
||||
s->stencil_stride_zero);
|
||||
pandecode_prop("zero7 = 0x%" PRIx32,
|
||||
s->zero7);
|
||||
pandecode_prop("zero8 = 0x%" PRIx32,
|
||||
s->zero8);
|
||||
}
|
||||
|
||||
if (s->clear_color_1 | s->clear_color_2 | s->clear_color_3 | s->clear_color_4) {
|
||||
pandecode_prop("clear_color_1 = 0x%" PRIx32, s->clear_color_1);
|
||||
pandecode_prop("clear_color_2 = 0x%" PRIx32, s->clear_color_2);
|
||||
pandecode_prop("clear_color_3 = 0x%" PRIx32, s->clear_color_3);
|
||||
pandecode_prop("clear_color_4 = 0x%" PRIx32, s->clear_color_4);
|
||||
}
|
||||
|
||||
if (s->clear_depth_1 != 0 || s->clear_depth_2 != 0 || s->clear_depth_3 != 0 || s->clear_depth_4 != 0) {
|
||||
pandecode_prop("clear_depth_1 = %f", s->clear_depth_1);
|
||||
pandecode_prop("clear_depth_2 = %f", s->clear_depth_2);
|
||||
pandecode_prop("clear_depth_3 = %f", s->clear_depth_3);
|
||||
pandecode_prop("clear_depth_4 = %f", s->clear_depth_4);
|
||||
}
|
||||
|
||||
if (s->clear_stencil) {
|
||||
pandecode_prop("clear_stencil = 0x%x", s->clear_stencil);
|
||||
}
|
||||
|
||||
const struct mali_midgard_tiler_packed t = s->tiler;
|
||||
const struct mali_midgard_tiler_weights_packed w = s->tiler_weights;
|
||||
const void *t = pan_section_ptr(s, SINGLE_TARGET_FRAMEBUFFER, TILER);
|
||||
const void *w = pan_section_ptr(s, SINGLE_TARGET_FRAMEBUFFER, TILER_WEIGHTS);
|
||||
|
||||
bool has_hierarchy = !(gpu_id == 0x0720 || gpu_id == 0x0820 || gpu_id == 0x0830);
|
||||
pandecode_midgard_tiler_descriptor(&t, &w, s->width + 1, s->height + 1, is_fragment, has_hierarchy);
|
||||
pandecode_midgard_tiler_descriptor(t, w, p.bound_max_x + 1, p.bound_max_y + 1, is_fragment, has_hierarchy);
|
||||
|
||||
pandecode_indent--;
|
||||
pandecode_log("};\n");
|
||||
|
||||
pandecode_prop("zero2 = 0x%" PRIx32, s->zero2);
|
||||
pandecode_prop("zero4 = 0x%" PRIx32, s->zero4);
|
||||
pandecode_prop("zero5 = 0x%" PRIx32, s->zero5);
|
||||
|
||||
pandecode_log_cont(".zero3 = {");
|
||||
|
||||
for (int i = 0; i < sizeof(s->zero3) / sizeof(s->zero3[0]); ++i)
|
||||
pandecode_log_cont("%X, ", s->zero3[i]);
|
||||
|
||||
pandecode_log_cont("},\n");
|
||||
|
||||
pandecode_log_cont(".zero6 = {");
|
||||
|
||||
for (int i = 0; i < sizeof(s->zero6) / sizeof(s->zero6[0]); ++i)
|
||||
pandecode_log_cont("%X, ", s->zero6[i]);
|
||||
|
||||
pandecode_log_cont("},\n");
|
||||
/* Dummy unpack of the padding section to make sure all words are 0.
|
||||
* No need to call print here since the section is supposed to be empty.
|
||||
*/
|
||||
pan_section_unpack(s, SINGLE_TARGET_FRAMEBUFFER, PADDING_1, padding1);
|
||||
pan_section_unpack(s, SINGLE_TARGET_FRAMEBUFFER, PADDING_2, padding2);
|
||||
pandecode_log("\n");
|
||||
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -574,7 +574,7 @@
|
|||
<field name="WLS Base Pointer" size="64" start="4:0" type="address"/>
|
||||
</struct>
|
||||
|
||||
<struct name="Midgard Tiler">
|
||||
<struct name="Midgard Tiler" size="10">
|
||||
<field name="Polygon List Size" size="32" start="0:0" type="uint" prefix="MALI_MIDGARD_TILER">
|
||||
<value name="Minimum Header Size" value="512"/>
|
||||
</field>
|
||||
|
@ -599,4 +599,156 @@
|
|||
<field name="Weight6" size="32" start="6:0" type="uint"/>
|
||||
<field name="Weight7" size="32" start="7:0" type="uint"/>
|
||||
</struct>
|
||||
|
||||
<enum name="Color Buffer Internal Format">
|
||||
<value name="Raw Value" value="0"/>
|
||||
<value name="R8G8B8A8" value="1"/>
|
||||
<value name="R10G10B10A2" value="2"/>
|
||||
<value name="R8G8B8A2" value="3"/>
|
||||
<value name="R4G4B4A4" value="4"/>
|
||||
<value name="R5G6B5A0" value="5"/>
|
||||
<value name="R5G5B5A1" value="6"/>
|
||||
<value name="RAW8" value="32"/>
|
||||
<value name="RAW16" value="33"/>
|
||||
<value name="RAW32" value="34"/>
|
||||
<value name="RAW64" value="35"/>
|
||||
<value name="RAW128" value="36"/>
|
||||
</enum>
|
||||
|
||||
<enum name="SFBD Color Format">
|
||||
<value name="4_32B_CHANNELS" value="0"/>
|
||||
<value name="3_32B_CHANNELS" value="1"/>
|
||||
<value name="2_32B_CHANNELS" value="2"/>
|
||||
<value name="1_32B_CHANNEL" value="3"/>
|
||||
<value name="4_16B_CHANNELS" value="4"/>
|
||||
<value name="3_16B_CHANNELS" value="5"/>
|
||||
<value name="2_16B_CHANNELS" value="6"/>
|
||||
<value name="1_16B_CHANNEL" value="7"/>
|
||||
<value name="R8" value="16"/>
|
||||
<value name="R8G8" value="17"/>
|
||||
<value name="R8G8B8" value="18"/>
|
||||
<value name="R8G8B8A8" value="19"/>
|
||||
<value name="R4G4B4A4" value="20"/>
|
||||
<value name="R5G6B5" value="21"/>
|
||||
<value name="R8G8B8_FROM_R8G8B8A2" value="22"/>
|
||||
<value name="R10G10B10A2" value="24"/>
|
||||
<value name="A2B10G10R10" value="25"/>
|
||||
<value name="R5G5B5A1" value="28"/>
|
||||
<value name="A1B5G5R5" value="29"/>
|
||||
</enum>
|
||||
|
||||
<enum name="Downsampling Accumulation Mode">
|
||||
<value name="Unsigned normalized integer" value="0"/>
|
||||
<value name="Signed normalized integer" value="1"/>
|
||||
</enum>
|
||||
|
||||
<enum name="Sample Layout">
|
||||
<value name="Ordered 4x Grid" value="0"/>
|
||||
<value name="Rotated 4x Grid" value="1"/>
|
||||
<value name="D3D 8x Grid" value="2"/>
|
||||
<value name="D3D 16x Grid" value="3"/>
|
||||
</enum>
|
||||
|
||||
<enum name="ZS Format">
|
||||
<value name="D16" value="1"/>
|
||||
<value name="D24" value="2"/>
|
||||
<value name="D24X8" value="4"/>
|
||||
<value name="D24S8" value="5"/>
|
||||
<value name="X8D24" value="6"/>
|
||||
<value name="S8D24" value="7"/>
|
||||
<value name="D32_X8X24" value="13"/>
|
||||
<value name="D32" value="14"/>
|
||||
<value name="D32_S8X24" value="15"/>
|
||||
</enum>
|
||||
|
||||
<enum name="S Format">
|
||||
<value name="S8" value="1"/>
|
||||
<value name="S8X8" value="2"/>
|
||||
<value name="S8X24" value="3"/>
|
||||
<value name="X24S8" value="4"/>
|
||||
<value name="X8S8" value="5"/>
|
||||
<value name="X32_S8X24" value="6"/>
|
||||
</enum>
|
||||
|
||||
<enum name="Tie-Break Rule">
|
||||
<value name="0_IN_180_OUT" value="0"/>
|
||||
<value name="0_OUT_180_IN" value="1"/>
|
||||
<value name="MINUS_180_IN_0_OUT" value="2"/>
|
||||
<value name="MINUS_180_OUT_0_IN" value="3"/>
|
||||
<value name="90_IN_270_OUT" value="4"/>
|
||||
<value name="90_OUT_270_IN" value="5"/>
|
||||
<value name="MINUS_90_IN_90_OUT" value="6"/>
|
||||
<value name="MINUS_90_OUT_90_IN" value="7"/>
|
||||
</enum>
|
||||
|
||||
<struct name="RT Buffer">
|
||||
<field name="Base" size="64" start="0:0" type="address"/>
|
||||
<field name="Row Stride" size="32" start="2:0" type="uint"/>
|
||||
<field name="Surface Stride" size="32" start="3:0" type="uint"/>
|
||||
</struct>
|
||||
|
||||
<struct name="Single-Target Framebuffer Parameters" size="40">
|
||||
<field name="Internal Format" size="3" start="0:0" default="Raw Value" type="Color Buffer Internal Format"/>
|
||||
<field name="Sample Count" size="3" start="0:3" type="uint" default="1" modifier="log2"/>
|
||||
<field name="Swizzle" size="12" start="0:6" type="uint"/>
|
||||
<field name="Color Writeback Format" size="5" start="0:18" default="4_32B_CHANNELS" type="SFBD Color Format"/>
|
||||
<field name="MSAA" size="2" start="0:23" default="Single" type="MSAA"/>
|
||||
<field name="sRGB" size="1" start="0:25" type="bool"/>
|
||||
<field name="Color Block Format" size="2" start="0:26" type="Block Format"/>
|
||||
<field name="Dithering Enable" size="1" start="0:28" type="bool"/>
|
||||
<field name="Clean Pixel Write Enable" size="1" start="0:29" type="bool"/>
|
||||
<field name="Color Preload Enable" size="1" start="0:30" type="bool"/>
|
||||
<field name="Color Write Enable" size="1" start="0:31" type="bool"/>
|
||||
<field name="X Downsampling Scale" size="3" start="1:0" type="uint"/>
|
||||
<field name="Y Downsampling Scale" size="3" start="1:3" type="uint"/>
|
||||
<field name="Downsampling Accumulation Mode" size="2" start="1:6" type="Downsampling Accumulation Mode"/>
|
||||
<field name="Sample Layout" size="2" start="1:8" type="Sample Layout"/>
|
||||
<field name="Big Endian" size="1" start="1:10" type="bool"/>
|
||||
<field name="Tie-Break Rule" size="3" start="1:11" type="Tie-Break Rule"/>
|
||||
<field name="CRC Read Enable" size="1" start="1:14" type="bool"/>
|
||||
<field name="CRC Write Enable" size="1" start="1:15" type="bool"/>
|
||||
<field name="ZS Block Format" size="2" start="1:16" type="Block Format"/>
|
||||
<field name="ZS Format" size="4" start="1:18" type="ZS Format" default="D24S8"/>
|
||||
<field name="ZS Preload Enable" size="1" start="1:22" type="bool"/>
|
||||
<field name="ZS Write Enable" size="1" start="1:23" type="bool"/>
|
||||
<field name="S Block Format" size="2" start="1:24" type="Block Format"/>
|
||||
<field name="S Format" size="4" start="1:26" type="S Format"/>
|
||||
<field name="S Write Enable" size="1" start="1:31" type="bool"/>
|
||||
<field name="Bound Min X" size="16" start="2:0" type="uint"/>
|
||||
<field name="Bound Min Y" size="16" start="2:16" type="uint"/>
|
||||
<field name="Bound Max X" size="16" start="3:0" type="uint"/>
|
||||
<field name="Bound Max Y" size="16" start="3:16" type="uint"/>
|
||||
<field name="DCD Offset" size="32" start="4:0" type="uint"/>
|
||||
<field name="CRC Buffer" size="128" start="8:0" type="RT Buffer"/>
|
||||
<field name="Color Writeback" size="128" start="12:0" type="RT Buffer"/>
|
||||
<field name="ZS Writeback" size="128" start="16:0" type="RT Buffer"/>
|
||||
<field name="S Writeback" size="128" start="20:0" type="RT Buffer"/>
|
||||
<field name="Color Load Address" size="64" start="24:0" type="address"/>
|
||||
<field name="Color Load Row Stride" size="32" start="26:0" type="uint"/>
|
||||
<field name="Color Load Surface Stride" size="32" start="27:0" type="uint"/>
|
||||
<field name="Clear Color 0" size="32" start="24:0" type="uint"/>
|
||||
<field name="Clear Color 1" size="32" start="25:0" type="uint"/>
|
||||
<field name="Clear Color 2" size="32" start="26:0" type="uint"/>
|
||||
<field name="Clear Color 3" size="32" start="27:0" type="uint"/>
|
||||
<field name="ZS Load Address" size="64" start="28:0" type="address"/>
|
||||
<field name="ZS Load Row Stride" size="32" start="30:0" type="uint"/>
|
||||
<field name="ZS Load Surface Stride" size="32" start="31:0" type="uint"/>
|
||||
<field name="Z Clear" size="32" start="28:0" type="float"/>
|
||||
<field name="S Clear" size="8" start="32:0" type="uint"/>
|
||||
</struct>
|
||||
|
||||
<struct name="Single-Target Framebuffer Padding 1" size="6">
|
||||
</struct>
|
||||
|
||||
<struct name="Single-Target Framebuffer Padding 2" size="8">
|
||||
</struct>
|
||||
|
||||
<aggregate name="Single-Target Framebuffer" size="320">
|
||||
<section name="Local Storage" offset="0" type="Local Storage"/>
|
||||
<section name="Parameters" offset="32" type="Single-Target Framebuffer Parameters"/>
|
||||
<section name="Tiler" offset="192" type="Midgard Tiler"/>
|
||||
<section name="Padding 1" offset="232" type="Single-Target Framebuffer Padding 1"/>
|
||||
<section name="Tiler Weights" offset="256" type="Midgard Tiler Weights"/>
|
||||
<section name="Padding 2" offset="288" type="Single-Target Framebuffer Padding 2"/>
|
||||
</aggregate>
|
||||
</panxml>
|
||||
|
|
Loading…
Reference in New Issue