|
@@ -136,7 +136,13 @@ static void chai_trace_fbd(uintptr_t fbd)
|
|
|
assert_gpu_zeroes(mfbd->block2[0], 64);
|
|
|
assert_gpu_zeroes(mfbd->block2[1], 64);
|
|
|
assert_gpu_zeroes(mfbd->ugaT, 64);
|
|
|
- assert_gpu_zeroes(mfbd->unknown_gpu_address, 64);
|
|
|
+
|
|
|
+ if (mfbd->unknown_gpu_address) {
|
|
|
+ printf("Nonzero uga?\n");
|
|
|
+ assert_gpu_zeroes(mfbd->unknown_gpu_address, 64);
|
|
|
+ } else {
|
|
|
+ printf("No uga\n");
|
|
|
+ }
|
|
|
|
|
|
/* Somehow maybe sort of kind of framebufferish?
|
|
|
* It changes predictably in the same way as the FB.
|
|
@@ -159,9 +165,14 @@ static void chai_trace_fbd(uintptr_t fbd)
|
|
|
|
|
|
panwrap_log("ugaT %llX, uga %llX\n",
|
|
|
mfbd->ugaT, mfbd->unknown_gpu_address);
|
|
|
- panwrap_log("ugan %llX\n", mfbd->unknown_gpu_addressN);
|
|
|
- buf = fetch_mapped_gpu(mfbd->unknown_gpu_addressN, 64);
|
|
|
- panwrap_log_hexdump_trimmed(buf, 64, "\t\t");
|
|
|
+
|
|
|
+ if (mfbd->unknown_gpu_addressN) {
|
|
|
+ panwrap_log("ugan %llX\n", mfbd->unknown_gpu_addressN);
|
|
|
+ buf = fetch_mapped_gpu(mfbd->unknown_gpu_addressN, 64);
|
|
|
+ panwrap_log_hexdump_trimmed(buf, 64, "\t\t");
|
|
|
+ } else {
|
|
|
+ printf("No ugan\n");
|
|
|
+ }
|
|
|
|
|
|
panwrap_log("unk1 %X, b1 %llX, b2 %llX, unk2 %llX, unk3 %llX, blah %llX\n",
|
|
|
mfbd->unknown1,
|
|
@@ -250,9 +261,9 @@ static void chai_trace_attribute(uint64_t address)
|
|
|
|
|
|
/* I don't like these verts... let's add some flare! */
|
|
|
|
|
|
- p[0] += (float) (rand() & 0xFF) / 1024.0f;
|
|
|
+ /*p[0] += (float) (rand() & 0xFF) / 1024.0f;
|
|
|
p[1] += (float) (rand() & 0xFF) / 1024.0f;
|
|
|
- p[2] += (float) (rand() & 0xFF) / 1024.0f;
|
|
|
+ p[2] += (float) (rand() & 0xFF) / 1024.0f;*/
|
|
|
}
|
|
|
|
|
|
panwrap_log("}\n");
|
|
@@ -273,10 +284,43 @@ static void chai_dump_texture(uint64_t addresses, uint64_t metadata)
|
|
|
|
|
|
uint64_t* region = fetch_mapped_gpu(*texture, sizeof(region));
|
|
|
|
|
|
+ if (!region) {
|
|
|
+ printf("Bad region\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
uint64_t int_addr = region[4];
|
|
|
printf("Next address: %llx\n", int_addr);
|
|
|
|
|
|
- quick_dump_gpu(int_addr, 0x200);
|
|
|
+ /* Bitmap data itself present, swizzled in an unknown fashion */
|
|
|
+ /* TODO: Compute size */
|
|
|
+
|
|
|
+#define ANTISWIZZLE_SIZE 64
|
|
|
+
|
|
|
+ uint8_t *bitmap = fetch_mapped_gpu(int_addr, ANTISWIZZLE_SIZE * ANTISWIZZLE_SIZE * 3);
|
|
|
+ if (!bitmap) {
|
|
|
+ printf("Missing bitmap\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ FILE *fp = fopen("swizzled.bin", "wb");
|
|
|
+ fwrite(bitmap, 1, ANTISWIZZLE_SIZE * ANTISWIZZLE_SIZE * 3, fp);
|
|
|
+ fclose(fp);
|
|
|
+
|
|
|
+#if 0
|
|
|
+ /* Rewrite the bitmap for fun! */
|
|
|
+ uint8_t *bitmap = fetch_mapped_gpu(int_addr, 0x200);
|
|
|
+
|
|
|
+ if (!bitmap) {
|
|
|
+ printf("Missing bitmap\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < (3 * 4); i += 3) {
|
|
|
+ bitmap[i] = rand() & 0xFF;
|
|
|
+ bitmap[i + 1] = 0;
|
|
|
+ bitmap[i + 2] = 0;
|
|
|
+ }
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
static void chai_trace_hw_chain(uint64_t chain)
|
|
@@ -349,16 +393,18 @@ static void chai_trace_hw_chain(uint64_t chain)
|
|
|
|
|
|
shader = fetch_mapped_gpu(*i_shader & ~15,
|
|
|
0x880 - 0x540);
|
|
|
- panwrap_log_hexdump_trimmed(shader,
|
|
|
- 0x880 - 0x540, "\t\t");
|
|
|
-
|
|
|
- asprintf(&fn, "shader_%s.bin",
|
|
|
- h->job_type == JOB_TYPE_VERTEX ?
|
|
|
- "Vertex" : "Fragment");
|
|
|
- fp = fopen(fn, "wb");
|
|
|
- fwrite(shader, 1, 0x880 - 0x540, fp);
|
|
|
- free(fn);
|
|
|
- fclose(fp);
|
|
|
+ if (shader) {
|
|
|
+ panwrap_log_hexdump_trimmed(shader,
|
|
|
+ 0x880 - 0x540, "\t\t");
|
|
|
+
|
|
|
+ asprintf(&fn, "shader_%s.bin",
|
|
|
+ h->job_type == JOB_TYPE_VERTEX ?
|
|
|
+ "Vertex" : "Fragment");
|
|
|
+ fp = fopen(fn, "wb");
|
|
|
+ fwrite(shader, 1, 0x880 - 0x540, fp);
|
|
|
+ free(fn);
|
|
|
+ fclose(fp);
|
|
|
+ }
|
|
|
|
|
|
/* Trace attribute based on metadata */
|
|
|
s = v->attribute_meta;
|
|
@@ -527,18 +573,20 @@ static void chai_trace_hw_chain(uint64_t chain)
|
|
|
|
|
|
void chai_trace_atom(const struct mali_jd_atom_v2 *v)
|
|
|
{
|
|
|
- if (v->core_req & MALI_JD_REQ_SOFT_JOB) {
|
|
|
- if (v->core_req & MALI_JD_REQ_SOFT_REPLAY) {
|
|
|
+ uint64_t req = v->compat_core_req | v->core_req;
|
|
|
+
|
|
|
+ if (req & MALI_JD_REQ_SOFT_JOB) {
|
|
|
+ if (req & MALI_JD_REQ_SOFT_REPLAY) {
|
|
|
struct mali_jd_replay_payload *payload;
|
|
|
|
|
|
payload = (struct mali_jd_replay_payload *)
|
|
|
fetch_mapped_gpu(v->jc, sizeof(*payload));
|
|
|
|
|
|
panwrap_log(
|
|
|
- "tiler_jc_list = %llX, fragment_jc = %llX, \nt "
|
|
|
+ "tiler_jc_list = %llX, fragment_jc = %llX, "
|
|
|
"tiler_heap_free = %llX, fragment hierarchy mask = %hX, "
|
|
|
"tiler hierachy mask = %hX, hierarchy def weight %X, "
|
|
|
- "tiler core_req = %X, fragment core_req = %X",
|
|
|
+ "tiler core_req = %X, fragment core_req = %X\n",
|
|
|
payload->tiler_jc_list,
|
|
|
payload->fragment_jc,
|
|
|
payload->tiler_heap_free,
|