return batch->tiler_heap;
}
+/* TODO: Figure out how to remove the hardcoded values */
+mali_ptr
+panfrost_batch_get_tiler_meta(struct panfrost_batch *batch, unsigned vertex_count)
+{
+ if (!vertex_count)
+ return 0;
+
+ if (batch->tiler_meta)
+ return batch->tiler_meta;
+
+ struct panfrost_bo *tiler_heap;
+ tiler_heap = panfrost_batch_get_tiler_heap(batch);
+
+ struct bifrost_tiler_heap_meta tiler_heap_meta = {
+ .heap_size = tiler_heap->size,
+ .tiler_heap_start = tiler_heap->gpu,
+ .tiler_heap_free = tiler_heap->gpu,
+ .tiler_heap_end = tiler_heap->gpu + tiler_heap->size,
+ };
+
+ tiler_heap_meta.zeros[10] = 0x1;
+ tiler_heap_meta.zeros[11] = 0x7e007e;
+
+ struct bifrost_tiler_meta tiler_meta = {
+ .hierarchy_mask = 0xf0,
+ .flags = 0x0,
+ .width = MALI_POSITIVE(batch->key.width),
+ .height = MALI_POSITIVE(batch->key.height),
+ .tiler_heap_meta = panfrost_upload_transient(batch, &tiler_heap_meta, sizeof(tiler_heap_meta)),
+ };
+
+ batch->tiler_meta = panfrost_upload_transient(batch, &tiler_meta, sizeof(tiler_meta));
+ return batch->tiler_meta;
+}
+
struct panfrost_bo *
panfrost_batch_get_tiler_dummy(struct panfrost_batch *batch)
{
#include "pan_bo.h"
#include "pan_context.h"
#include "pan_util.h"
+#include "panfrost-quirks.h"
static struct mali_rt_format
panfrost_mfbd_format(struct pipe_surface *surf)
.rt_count_1 = MALI_POSITIVE(batch->key.nr_cbufs),
.rt_count_2 = 4,
- .tiler = panfrost_emit_midg_tiler(batch, vertex_count),
-
.shared_memory = {
.stack_shift = shift,
.scratchpad = panfrost_batch_get_scratchpad(batch, shift, dev->thread_tls_alloc, dev->core_count)->gpu,
}
};
+ if (dev->quirks & IS_BIFROST)
+ framebuffer.tiler_meta = panfrost_batch_get_tiler_meta(batch, vertex_count);
+ else
+ framebuffer.tiler = panfrost_emit_midg_tiler(batch, vertex_count);
+
return framebuffer;
}
/* TODO: The Bifrost tiler is not understood at all yet */
static void
-pandecode_bifrost_tiler_descriptor(const struct midgard_tiler_descriptor *t)
+pandecode_bifrost_tiler_descriptor(const struct mali_framebuffer *fb)
{
pandecode_log(".tiler = {\n");
pandecode_indent++;
- pandecode_prop("polygon_list_size = 0x%" PRIx32, t->polygon_list_size);
- pandecode_prop("hierarchy_mask = 0x%" PRIx16, t->hierarchy_mask);
- pandecode_prop("flags = 0x%" PRIx16, t->flags);
+ MEMORY_PROP(fb, tiler_meta);
- MEMORY_PROP(t, polygon_list);
- MEMORY_PROP(t, polygon_list_body);
- MEMORY_PROP(t, heap_start);
- MEMORY_PROP(t, heap_end);
-
- pandecode_log(".weights = { ");
-
- for (unsigned w = 0; w < ARRAY_SIZE(t->weights); ++w) {
- pandecode_log_cont("%d, ", t->weights[w]);
+ for (int i = 0; i < 16; i++) {
+ if (fb->zeros[i] != 0) {
+ pandecode_msg("XXX: tiler descriptor zero %d tripped, value %x\n",
+ i, fb->zeros[i]);
+ }
}
pandecode_log("},\n");
if (fb->clear_depth)
pandecode_prop("clear_depth = %f", fb->clear_depth);
- const struct midgard_tiler_descriptor t = fb->tiler;
if (!is_compute)
if (is_bifrost)
- pandecode_bifrost_tiler_descriptor(&t);
+ pandecode_bifrost_tiler_descriptor(fb);
else
- pandecode_midgard_tiler_descriptor(&t, fb->width1 + 1, fb->height1 + 1, is_fragment, true);
+ pandecode_midgard_tiler_descriptor(&fb->tiler, fb->width1 + 1, fb->height1 + 1, is_fragment, true);
else
pandecode_msg("XXX: skipping compute MFBD, fixme\n");
static void
pandecode_tiler_heap_meta(mali_ptr gpu_va, int job_no)
{
-
struct pandecode_mapped_memory *mem = pandecode_find_mapped_gpu_mem_containing(gpu_va);
-
- if (gpu_va == 0) {
- pandecode_msg("XXX: bifrost_tiler_heap_meta is NULL!!\n");
- return;
- }
-
const struct bifrost_tiler_heap_meta *PANDECODE_PTR_VAR(h, mem, gpu_va);
- pandecode_log("struct mali_tiler_heap_meta tiler_heap_meta_%d = {\n", job_no);
+ pandecode_log("struct bifrost_tiler_heap_meta tiler_heap_meta_%"PRIx64"_%d = {\n", gpu_va, job_no);
pandecode_indent++;
if (h->zero) {
pandecode_tiler_heap_meta(t->tiler_heap_meta, job_no);
- pandecode_log("struct bifrost_tiler_meta tiler_meta_%d = {\n", job_no);
+ pandecode_log("struct bifrost_tiler_meta tiler_meta_%"PRIx64"_%d = {\n", gpu_va, job_no);
pandecode_indent++;
if (t->zero0 || t->zero1) {
pandecode_vertex_tiler_postfix_pre(&t->postfix, job_no, h->job_type, "", true, gpu_id);
pandecode_tiler_meta(t->tiler.tiler_meta, job_no);
- pandecode_log("struct bifrost_payload_tiler payload_%d = {\n", job_no);
+ pandecode_log("struct bifrost_payload_tiler payload_%"PRIx64"_%d = {\n", payload, job_no);
pandecode_indent++;
pandecode_vertex_tiler_prefix(&t->prefix, job_no, false);