mirror of https://gitlab.freedesktop.org/mesa/mesa
freedreno/decode: Move rd section parsing to a common header
Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19444>
This commit is contained in:
parent
4701508ec0
commit
060e168623
|
@ -47,6 +47,7 @@
|
|||
#include "redump.h"
|
||||
#include "rnnutil.h"
|
||||
#include "script.h"
|
||||
#include "rdutil.h"
|
||||
|
||||
static struct cffdec_options options = {
|
||||
.gpu_id = 220,
|
||||
|
@ -241,25 +242,14 @@ main(int argc, char **argv)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
parse_addr(uint32_t *buf, int sz, unsigned int *len, uint64_t *gpuaddr)
|
||||
{
|
||||
*gpuaddr = buf[0];
|
||||
*len = buf[1];
|
||||
if (sz > 8)
|
||||
*gpuaddr |= ((uint64_t)(buf[2])) << 32;
|
||||
}
|
||||
|
||||
static int
|
||||
handle_file(const char *filename, int start, int end, int draw)
|
||||
{
|
||||
enum rd_sect_type type = RD_NONE;
|
||||
void *buf = NULL;
|
||||
struct io *io;
|
||||
int submit = 0, got_gpu_id = 0;
|
||||
int sz, ret = 0;
|
||||
bool needs_reset = false;
|
||||
bool skip = false;
|
||||
struct rd_parsed_section ps = {0};
|
||||
|
||||
options.draw_filter = draw;
|
||||
|
||||
|
@ -285,76 +275,48 @@ handle_file(const char *filename, int start, int end, int draw)
|
|||
uint64_t gpuaddr;
|
||||
} gpuaddr = {0};
|
||||
|
||||
while (true) {
|
||||
uint32_t arr[2];
|
||||
|
||||
ret = io_readn(io, arr, 8);
|
||||
if (ret <= 0)
|
||||
goto end;
|
||||
|
||||
while ((arr[0] == 0xffffffff) && (arr[1] == 0xffffffff)) {
|
||||
ret = io_readn(io, arr, 8);
|
||||
if (ret <= 0)
|
||||
goto end;
|
||||
}
|
||||
|
||||
type = arr[0];
|
||||
sz = arr[1];
|
||||
|
||||
if (sz < 0) {
|
||||
ret = -1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
free(buf);
|
||||
|
||||
while (parse_rd_section(io, &ps)) {
|
||||
needs_wfi = false;
|
||||
|
||||
buf = malloc(sz + 1);
|
||||
((char *)buf)[sz] = '\0';
|
||||
ret = io_readn(io, buf, sz);
|
||||
if (ret < 0)
|
||||
goto end;
|
||||
|
||||
switch (type) {
|
||||
switch (ps.type) {
|
||||
case RD_TEST:
|
||||
printl(1, "test: %s\n", (char *)buf);
|
||||
printl(1, "test: %s\n", (char *)ps.buf);
|
||||
break;
|
||||
case RD_CMD:
|
||||
is_blob = true;
|
||||
printl(2, "cmd: %s\n", (char *)buf);
|
||||
printl(2, "cmd: %s\n", (char *)ps.buf);
|
||||
skip = false;
|
||||
if (exename) {
|
||||
skip |= (strstr(buf, exename) != buf);
|
||||
skip |= (strstr(ps.buf, exename) != ps.buf);
|
||||
} else if (!show_comp) {
|
||||
skip |= (strstr(buf, "fdperf") == buf);
|
||||
skip |= (strstr(buf, "chrome") == buf);
|
||||
skip |= (strstr(buf, "surfaceflinger") == buf);
|
||||
skip |= ((char *)buf)[0] == 'X';
|
||||
skip |= (strstr(ps.buf, "fdperf") == ps.buf);
|
||||
skip |= (strstr(ps.buf, "chrome") == ps.buf);
|
||||
skip |= (strstr(ps.buf, "surfaceflinger") == ps.buf);
|
||||
skip |= ((char *)ps.buf)[0] == 'X';
|
||||
}
|
||||
break;
|
||||
case RD_VERT_SHADER:
|
||||
printl(2, "vertex shader:\n%s\n", (char *)buf);
|
||||
printl(2, "vertex shader:\n%s\n", (char *)ps.buf);
|
||||
break;
|
||||
case RD_FRAG_SHADER:
|
||||
printl(2, "fragment shader:\n%s\n", (char *)buf);
|
||||
printl(2, "fragment shader:\n%s\n", (char *)ps.buf);
|
||||
break;
|
||||
case RD_GPUADDR:
|
||||
if (needs_reset) {
|
||||
reset_buffers();
|
||||
needs_reset = false;
|
||||
}
|
||||
parse_addr(buf, sz, &gpuaddr.len, &gpuaddr.gpuaddr);
|
||||
parse_addr(ps.buf, ps.sz, &gpuaddr.len, &gpuaddr.gpuaddr);
|
||||
break;
|
||||
case RD_BUFFER_CONTENTS:
|
||||
add_buffer(gpuaddr.gpuaddr, gpuaddr.len, buf);
|
||||
buf = NULL;
|
||||
add_buffer(gpuaddr.gpuaddr, gpuaddr.len, ps.buf);
|
||||
ps.buf = NULL;
|
||||
break;
|
||||
case RD_CMDSTREAM_ADDR:
|
||||
if ((start <= submit) && (submit <= end)) {
|
||||
unsigned int sizedwords;
|
||||
uint64_t gpuaddr;
|
||||
parse_addr(buf, sz, &sizedwords, &gpuaddr);
|
||||
parse_addr(ps.buf, ps.sz, &sizedwords, &gpuaddr);
|
||||
printl(2, "############################################################\n");
|
||||
printl(2, "cmdstream: %d dwords\n", sizedwords);
|
||||
if (!skip) {
|
||||
|
@ -370,7 +332,7 @@ handle_file(const char *filename, int start, int end, int draw)
|
|||
break;
|
||||
case RD_GPU_ID:
|
||||
if (!got_gpu_id) {
|
||||
uint32_t gpu_id = *((unsigned int *)buf);
|
||||
uint32_t gpu_id = parse_gpu_id(ps.buf);
|
||||
if (!gpu_id)
|
||||
break;
|
||||
options.gpu_id = gpu_id;
|
||||
|
@ -381,10 +343,7 @@ handle_file(const char *filename, int start, int end, int draw)
|
|||
break;
|
||||
case RD_CHIP_ID:
|
||||
if (!got_gpu_id) {
|
||||
uint64_t chip_id = *((uint64_t *)buf);
|
||||
options.gpu_id = 100 * ((chip_id >> 24) & 0xff) +
|
||||
10 * ((chip_id >> 16) & 0xff) +
|
||||
((chip_id >> 8) & 0xff);
|
||||
options.gpu_id = parse_chip_id(ps.buf);
|
||||
printl(2, "gpu_id: %d\n", options.gpu_id);
|
||||
cffdec_init(&options);
|
||||
got_gpu_id = 1;
|
||||
|
@ -395,13 +354,12 @@ handle_file(const char *filename, int start, int end, int draw)
|
|||
}
|
||||
}
|
||||
|
||||
end:
|
||||
script_end_cmdstream();
|
||||
|
||||
io_close(io);
|
||||
fflush(stdout);
|
||||
|
||||
if (ret < 0) {
|
||||
if (ps.ret < 0) {
|
||||
printf("corrupt file\n");
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* Copyright © 2022 Igalia S.L.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "io.h"
|
||||
#include "redump.h"
|
||||
|
||||
static void
|
||||
parse_addr(uint32_t *buf, int sz, unsigned int *len, uint64_t *gpuaddr)
|
||||
{
|
||||
*gpuaddr = buf[0];
|
||||
*len = buf[1];
|
||||
if (sz > 8)
|
||||
*gpuaddr |= ((uint64_t)(buf[2])) << 32;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
parse_gpu_id(void *buf)
|
||||
{
|
||||
return *((unsigned int *)buf);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
parse_chip_id(void *buf)
|
||||
{
|
||||
uint64_t chip_id = *((uint64_t *)buf);
|
||||
return 100 * ((chip_id >> 24) & 0xff) + 10 * ((chip_id >> 16) & 0xff) +
|
||||
((chip_id >> 8) & 0xff);
|
||||
}
|
||||
|
||||
struct rd_parsed_section
|
||||
{
|
||||
void *buf;
|
||||
enum rd_sect_type type;
|
||||
int sz;
|
||||
int ret;
|
||||
};
|
||||
|
||||
static bool
|
||||
parse_rd_section(struct io *io, struct rd_parsed_section *section)
|
||||
{
|
||||
uint32_t arr[2];
|
||||
int ret;
|
||||
|
||||
ret = io_readn(io, arr, 8);
|
||||
if (ret <= 0)
|
||||
goto end;
|
||||
|
||||
while ((arr[0] == 0xffffffff) && (arr[1] == 0xffffffff)) {
|
||||
ret = io_readn(io, arr, 8);
|
||||
if (ret <= 0)
|
||||
goto end;
|
||||
}
|
||||
|
||||
section->type = arr[0];
|
||||
section->sz = arr[1];
|
||||
|
||||
if (section->sz < 0) {
|
||||
ret = -1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
free(section->buf);
|
||||
|
||||
section->buf = malloc(section->sz + 1);
|
||||
((char *)section->buf)[section->sz] = '\0';
|
||||
ret = io_readn(io, section->buf, section->sz);
|
||||
if (ret < 0)
|
||||
goto end;
|
||||
|
||||
section->ret = ret;
|
||||
return true;
|
||||
|
||||
end:
|
||||
section->ret = ret;
|
||||
return false;
|
||||
}
|
|
@ -31,6 +31,7 @@
|
|||
#include "cffdec.h"
|
||||
#include "io.h"
|
||||
#include "redump.h"
|
||||
#include "rdutil.h"
|
||||
|
||||
/**
|
||||
* Replay command stream obtained from:
|
||||
|
@ -117,15 +118,6 @@ main(int argc, char **argv)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
parse_addr(uint32_t *buf, int sz, unsigned int *len, uint64_t *gpuaddr)
|
||||
{
|
||||
*gpuaddr = buf[0];
|
||||
*len = buf[1];
|
||||
if (sz > 8)
|
||||
*gpuaddr |= ((uint64_t)(buf[2])) << 32;
|
||||
}
|
||||
|
||||
struct buffer {
|
||||
struct rb_node node;
|
||||
|
||||
|
@ -431,13 +423,11 @@ upload_buffer(struct device *dev, uint64_t iova, unsigned int size,
|
|||
static int
|
||||
handle_file(const char *filename)
|
||||
{
|
||||
enum rd_sect_type type = RD_NONE;
|
||||
void *buf = NULL;
|
||||
struct io *io;
|
||||
int submit = 0;
|
||||
int sz, ret = 0;
|
||||
bool skip = false;
|
||||
bool need_submit = false;
|
||||
struct rd_parsed_section ps = {0};
|
||||
|
||||
printf("Reading %s...\n", filename);
|
||||
|
||||
|
@ -458,36 +448,8 @@ handle_file(const char *filename)
|
|||
uint64_t gpuaddr;
|
||||
} gpuaddr = {0};
|
||||
|
||||
while (true) {
|
||||
uint32_t arr[2];
|
||||
|
||||
ret = io_readn(io, arr, 8);
|
||||
if (ret <= 0)
|
||||
goto end;
|
||||
|
||||
while ((arr[0] == 0xffffffff) && (arr[1] == 0xffffffff)) {
|
||||
ret = io_readn(io, arr, 8);
|
||||
if (ret <= 0)
|
||||
goto end;
|
||||
}
|
||||
|
||||
type = arr[0];
|
||||
sz = arr[1];
|
||||
|
||||
if (sz < 0) {
|
||||
ret = -1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
free(buf);
|
||||
|
||||
buf = malloc(sz + 1);
|
||||
((char *)buf)[sz] = '\0';
|
||||
ret = io_readn(io, buf, sz);
|
||||
if (ret < 0)
|
||||
goto end;
|
||||
|
||||
switch (type) {
|
||||
while (parse_rd_section(io, &ps)) {
|
||||
switch (ps.type) {
|
||||
case RD_TEST:
|
||||
case RD_VERT_SHADER:
|
||||
case RD_FRAG_SHADER:
|
||||
|
@ -496,12 +458,12 @@ handle_file(const char *filename)
|
|||
case RD_CMD:
|
||||
skip = false;
|
||||
if (exename) {
|
||||
skip |= (strstr(buf, exename) != buf);
|
||||
skip |= (strstr(ps.buf, exename) != ps.buf);
|
||||
} else {
|
||||
skip |= (strstr(buf, "fdperf") == buf);
|
||||
skip |= (strstr(buf, "chrome") == buf);
|
||||
skip |= (strstr(buf, "surfaceflinger") == buf);
|
||||
skip |= ((char *)buf)[0] == 'X';
|
||||
skip |= (strstr(ps.buf, "fdperf") == ps.buf);
|
||||
skip |= (strstr(ps.buf, "chrome") == ps.buf);
|
||||
skip |= (strstr(ps.buf, "surfaceflinger") == ps.buf);
|
||||
skip |= ((char *)ps.buf)[0] == 'X';
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -511,17 +473,16 @@ handle_file(const char *filename)
|
|||
device_submit_cmdstreams(dev);
|
||||
}
|
||||
|
||||
parse_addr(buf, sz, &gpuaddr.len, &gpuaddr.gpuaddr);
|
||||
parse_addr(ps.buf, ps.sz, &gpuaddr.len, &gpuaddr.gpuaddr);
|
||||
/* no-op */
|
||||
break;
|
||||
case RD_BUFFER_CONTENTS:
|
||||
upload_buffer(dev, gpuaddr.gpuaddr, gpuaddr.len, buf);
|
||||
buf = NULL;
|
||||
upload_buffer(dev, gpuaddr.gpuaddr, gpuaddr.len, ps.buf);
|
||||
break;
|
||||
case RD_CMDSTREAM_ADDR: {
|
||||
unsigned int sizedwords;
|
||||
uint64_t gpuaddr;
|
||||
parse_addr(buf, sz, &sizedwords, &gpuaddr);
|
||||
parse_addr(ps.buf, ps.sz, &sizedwords, &gpuaddr);
|
||||
printf("cmdstream %d: %d dwords\n", submit, sizedwords);
|
||||
|
||||
if (!skip) {
|
||||
|
@ -535,17 +496,13 @@ handle_file(const char *filename)
|
|||
break;
|
||||
}
|
||||
case RD_GPU_ID: {
|
||||
uint32_t gpu_id = *((unsigned int *)buf);
|
||||
if (!gpu_id)
|
||||
break;
|
||||
printf("gpuid: %d\n", gpu_id);
|
||||
uint32_t gpu_id = parse_gpu_id(ps.buf);
|
||||
if (gpu_id)
|
||||
printf("gpuid: %d\n", gpu_id);
|
||||
break;
|
||||
}
|
||||
case RD_CHIP_ID: {
|
||||
uint64_t chip_id = *((uint64_t *)buf);
|
||||
uint32_t gpu_id = 100 * ((chip_id >> 24) & 0xff) +
|
||||
10 * ((chip_id >> 16) & 0xff) +
|
||||
((chip_id >> 8) & 0xff);
|
||||
uint32_t gpu_id = parse_chip_id(ps.buf);
|
||||
printf("gpuid: %d\n", gpu_id);
|
||||
break;
|
||||
}
|
||||
|
@ -554,7 +511,6 @@ handle_file(const char *filename)
|
|||
}
|
||||
}
|
||||
|
||||
end:
|
||||
if (need_submit)
|
||||
device_submit_cmdstreams(dev);
|
||||
|
||||
|
@ -563,7 +519,7 @@ end:
|
|||
io_close(io);
|
||||
fflush(stdout);
|
||||
|
||||
if (ret < 0) {
|
||||
if (ps.ret < 0) {
|
||||
printf("corrupt file\n");
|
||||
}
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue