It's not vertex data... it's an attribute
authorCafe <cafe@not.applicable>
Mon, 31 Jul 2017 00:00:00 +0000 (00:00 +0000)
committerCafe <cafe@not.applicable>
Mon, 31 Jul 2017 18:13:54 +0000 (18:13 +0000)
src/chai-notes.h
src/ktrace.c

index 96b5a34fdc06b6c998eab3f6e84edcfa063f1d7f..92e4f49e017ad03a16ef909639da5669bfb0a4d1 100644 (file)
@@ -77,6 +77,8 @@ struct payload_vertex_tiler32 {
        uint32_t block2[36];
 };
 
+/* FIXME: This is very clearly wrong */
+
 #define SHADER (1 << 0)
 #define SHADER_VERTEX (1 << 2)
 #define SHADER_FRAGMENT (1 << 3)
@@ -87,10 +89,10 @@ struct shader_meta {
        uint64_t unknown2;
 };
 
-struct vertex_buffer {
-       uint64_t vertices;
-       size_t vertex_size;
-       size_t size;
+struct attribute_buffer {
+       uint64_t elements;
+       size_t element_size;
+       size_t total_size;
 };
 
 /* Synthesis of fragment_job from mali_kbase_reply.c with #defines from
index 51b2472e7fdbd6e808ad069eee65ebf5459332bd..4043e75190ed77dc2114ec7c656bad54f8e058fb 100644 (file)
@@ -420,46 +420,54 @@ static void kbase_trace_fbd(struct kbase_context *kctx, uint32_t fbd)
        kfree(mfbd);
 }
 
-static void kbase_trace_vertices(struct kbase_context *kctx, uint64_t address)
+static void kbase_trace_vecN_as_uint32_hex(uint32_t *p, size_t count)
 {
-       uint64_t raw, flags;
+       if(count == 1) 
+               printk("\t<%X>,", p[0]);
+       else if(count == 2)
+               printk("\t<%X, %X>,", p[0], p[1]);
+       else if(count == 3)
+               printk("\t<%X, %X, %X>,", p[0], p[1], p[2]);
+       else if(count == 4)
+               printk("\t<%X, %X, %X, %X>,", p[0], p[1], p[2], p[3]);
+       else
+               printk("Cannot print vec%d", count);
+}
+
+static void kbase_trace_attribute(struct kbase_context *kctx, uint64_t address)
+{
+       uint64_t raw;
+       uint64_t flags;
        int vertex_count;
+       int component_count;
        uint32_t *v;
+       uint32_t *p;
        int i;
 
-       struct vertex_buffer *vb =
-               (struct vertex_buffer *) kbase_fetch_gpu(
+       struct attribute_buffer *vb =
+               (struct attribute_buffer *) kbase_fetch_gpu(
                                kctx, address,
-                               NULL, sizeof(struct vertex_buffer));
+                               NULL, sizeof(struct attribute_buffer));
        if (!vb) return;
 
-       raw = vb->vertices & ~3;
-       flags = vb->vertices ^ raw;
+       vertex_count = vb->total_size / vb->element_size;
+       component_count = vb->element_size / sizeof(float);
 
-       v = kbase_fetch_gpu(kctx, raw, NULL, vb->size);
+       raw = vb->elements & ~3;
+       flags = vb->elements ^ raw;
 
-       if (vb->vertex_size != 3 * sizeof(float)) {
-               printk("Bad vertex size %x", vb->vertex_size);
-               return;
-       }
+       p = v = kbase_fetch_gpu(kctx, raw, NULL, vb->total_size);
 
-       vertex_count = vb->size / vb->vertex_size;
+       printk("attribute vec%d mem%LXflag%LX = {", component_count, raw, flags);
 
-       kfree(vb);
+       for (i = 0; i < vertex_count; i++, p += component_count)
+               kbase_trace_vecN_as_uint32_hex(p, component_count);
 
-       printk("Vertices at %LX (flag %LX):", raw, flags);
+       printk("}");
 
-       for (i = 0; i < vertex_count * 3; i += 3) {
-               printk("<%X, %X, %X>", v[i], v[i + 1], v[i + 2]);
+       kbase_push_gpu(kctx, v, raw, vb->total_size);
 
-               /* Interfere for fun */
-               if(i == 3) {
-                       printk("Interfering for fun");
-                       v[i + 0] = v[i + 1] = 0x3F800000;
-               }
-       }
-
-       kbase_push_gpu(kctx, v, raw, vb->size);
+       kfree(vb);
 }
 
 static void kbase_trace_hw_chain(struct kbase_context *kctx, uint64_t chain)
@@ -529,7 +537,7 @@ static void kbase_trace_hw_chain(struct kbase_context *kctx, uint64_t chain)
                kfree(shader);
                kfree(i_shader);
 
-               kbase_trace_vertices(kctx, v->vertices);
+               kbase_trace_attribute(kctx, v->vertices);
 
                if (h->job_type == JOB_TYPE_TILER)
                        printk("Drawing in %s", kbase_gl_mode_name(((uint8_t *) v->block1)[8]));
@@ -552,7 +560,7 @@ static void kbase_trace_hw_chain(struct kbase_context *kctx, uint64_t chain)
                        /* Structure known. Skip hex dump */
                        if (addr == 2) continue;
                        if (addr == 3) continue;
-                       //if (addr == 6) continue;
+                       if (addr == 6) continue;
                        if (addr == 10 && h->job_type == JOB_TYPE_VERTEX) continue;
                        if (addr == 11) continue;
                        if (addr == 12) continue;
@@ -565,8 +573,6 @@ static void kbase_trace_hw_chain(struct kbase_context *kctx, uint64_t chain)
                        if (addr == 7) sz = 0x10;
                        if (addr == 8) sz = 0x20;
 
-                       if (addr == 6) sz = 0x80;
-
                        printk("Addr %d %X", addr, address);
 
                        if (!address) continue;