mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2025-12-26 17:00:12 +01:00
libdrm-radeon: add print callback to cs & small fixes
This commit is contained in:
parent
5ae79e7edd
commit
c0ba14fd90
5 changed files with 113 additions and 6 deletions
|
|
@ -75,13 +75,13 @@ struct radeon_bo_manager {
|
|||
};
|
||||
|
||||
static inline void _radeon_bo_debug(struct radeon_bo *bo,
|
||||
int opcode,
|
||||
const char *op,
|
||||
const char *file,
|
||||
const char *func,
|
||||
int line)
|
||||
{
|
||||
fprintf(stderr, "%02d %p 0x%08X 0x%08X 0x%08X [%s %s %d]\n",
|
||||
opcode, bo, bo->handle, bo->size, bo->cref, file, func, line);
|
||||
fprintf(stderr, "%s %p 0x%08X 0x%08X 0x%08X [%s %s %d]\n",
|
||||
op, bo, bo->handle, bo->size, bo->cref, file, func, line);
|
||||
}
|
||||
|
||||
static inline struct radeon_bo *_radeon_bo_open(struct radeon_bo_manager *bom,
|
||||
|
|
|
|||
|
|
@ -81,7 +81,6 @@ static struct radeon_bo *bo_open(struct radeon_bo_manager *bom,
|
|||
open_arg.name = handle;
|
||||
r = ioctl(bom->fd, DRM_IOCTL_GEM_OPEN, &open_arg);
|
||||
if (r != 0) {
|
||||
fprintf(stderr, "GEM open failed: %d (%s)\n",r,strerror(r));
|
||||
free(bo);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -95,6 +94,7 @@ static struct radeon_bo *bo_open(struct radeon_bo_manager *bom,
|
|||
args.alignment = alignment;
|
||||
args.initial_domain = bo->base.domains;
|
||||
args.no_backing_store = 0;
|
||||
args.handle = 0;
|
||||
r = drmCommandWriteRead(bom->fd, DRM_RADEON_GEM_CREATE,
|
||||
&args, sizeof(args));
|
||||
bo->base.handle = args.handle;
|
||||
|
|
@ -133,6 +133,7 @@ static struct radeon_bo *bo_unref(struct radeon_bo *bo)
|
|||
/* close object */
|
||||
args.handle = bo->handle;
|
||||
ioctl(bo->bom->fd, DRM_IOCTL_GEM_CLOSE, &args);
|
||||
memset(bo_gem, 0, sizeof(struct radeon_bo_gem));
|
||||
free(bo_gem);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ struct radeon_cs_funcs {
|
|||
int (*cs_destroy)(struct radeon_cs *cs);
|
||||
int (*cs_erase)(struct radeon_cs *cs);
|
||||
int (*cs_need_flush)(struct radeon_cs *cs);
|
||||
void (*cs_print)(struct radeon_cs *cs, FILE *file);
|
||||
};
|
||||
|
||||
struct radeon_cs_manager {
|
||||
|
|
@ -159,4 +160,9 @@ static inline int radeon_cs_need_flush(struct radeon_cs *cs)
|
|||
return cs->csm->funcs->cs_need_flush(cs);
|
||||
}
|
||||
|
||||
static inline void radeon_cs_print(struct radeon_cs *cs, FILE *file)
|
||||
{
|
||||
cs->csm->funcs->cs_print(cs, file);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -254,6 +254,8 @@ static int cs_gem_emit(struct radeon_cs *cs)
|
|||
unsigned i;
|
||||
int r;
|
||||
|
||||
csg->chunks[0].length_dw = cs->cdw;
|
||||
|
||||
chunk_array[0] = (uint64_t)(intptr_t)&csg->chunks[0];
|
||||
chunk_array[1] = (uint64_t)(intptr_t)&csg->chunks[1];
|
||||
|
||||
|
|
@ -304,7 +306,103 @@ static int cs_gem_erase(struct radeon_cs *cs)
|
|||
|
||||
static int cs_gem_need_flush(struct radeon_cs *cs)
|
||||
{
|
||||
return (cs->relocs_total_size > (16*1024*1024));
|
||||
return (cs->relocs_total_size > (32*1024*1024));
|
||||
}
|
||||
|
||||
#define PACKET_TYPE0 0
|
||||
#define PACKET_TYPE1 1
|
||||
#define PACKET_TYPE2 2
|
||||
#define PACKET_TYPE3 3
|
||||
|
||||
#define PACKET3_NOP 0x10
|
||||
#define PACKET3_SET_SCISSORS 0x1E
|
||||
#define PACKET3_3D_DRAW_VBUF 0x28
|
||||
#define PACKET3_3D_DRAW_IMMD 0x29
|
||||
#define PACKET3_3D_DRAW_INDX 0x2A
|
||||
#define PACKET3_3D_LOAD_VBPNTR 0x2F
|
||||
#define PACKET3_INDX_BUFFER 0x33
|
||||
#define PACKET3_3D_DRAW_VBUF_2 0x34
|
||||
#define PACKET3_3D_DRAW_IMMD_2 0x35
|
||||
#define PACKET3_3D_DRAW_INDX_2 0x36
|
||||
|
||||
#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
|
||||
#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
|
||||
#define CP_PACKET0_GET_REG(h) (((h) & 0x1FFF) << 2)
|
||||
#define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1)
|
||||
#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
|
||||
|
||||
static void cs_gem_print(struct radeon_cs *cs, FILE *file)
|
||||
{
|
||||
unsigned opcode;
|
||||
unsigned reg;
|
||||
unsigned cnt;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < cs->cdw;) {
|
||||
cnt = CP_PACKET_GET_COUNT(cs->packets[i]);
|
||||
switch (CP_PACKET_GET_TYPE(cs->packets[i])) {
|
||||
case PACKET_TYPE0:
|
||||
fprintf(file, "Pkt0 at %d (%d dwords):\n", i, cnt + 1);
|
||||
reg = CP_PACKET0_GET_REG(cs->packets[i]);
|
||||
if (CP_PACKET0_GET_ONE_REG_WR(cs->packets[i++])) {
|
||||
for (j = 0; j <= cnt; j++) {
|
||||
fprintf(file, " 0x%08X -> 0x%04X\n",
|
||||
cs->packets[i++], reg);
|
||||
}
|
||||
} else {
|
||||
for (j = 0; j <= cnt; j++) {
|
||||
fprintf(file, " 0x%08X -> 0x%04X\n",
|
||||
cs->packets[i++], reg);
|
||||
reg += 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PACKET_TYPE3:
|
||||
fprintf(file, "Pkt3 at %d :\n", i);
|
||||
opcode = CP_PACKET3_GET_OPCODE(cs->packets[i++]);
|
||||
switch (opcode) {
|
||||
case PACKET3_NOP:
|
||||
fprintf(file, " PACKET3_NOP:\n");
|
||||
break;
|
||||
case PACKET3_3D_DRAW_VBUF:
|
||||
fprintf(file, " PACKET3_3D_DRAW_VBUF:\n");
|
||||
break;
|
||||
case PACKET3_3D_DRAW_IMMD:
|
||||
fprintf(file, " PACKET3_3D_DRAW_IMMD:\n");
|
||||
break;
|
||||
case PACKET3_3D_DRAW_INDX:
|
||||
fprintf(file, " PACKET3_3D_DRAW_INDX:\n");
|
||||
break;
|
||||
case PACKET3_3D_LOAD_VBPNTR:
|
||||
fprintf(file, " PACKET3_3D_LOAD_VBPNTR:\n");
|
||||
break;
|
||||
case PACKET3_INDX_BUFFER:
|
||||
fprintf(file, " PACKET3_INDX_BUFFER:\n");
|
||||
break;
|
||||
case PACKET3_3D_DRAW_VBUF_2:
|
||||
fprintf(file, " PACKET3_3D_DRAW_VBUF_2:\n");
|
||||
break;
|
||||
case PACKET3_3D_DRAW_IMMD_2:
|
||||
fprintf(file, " PACKET3_3D_DRAW_IMMD_2:\n");
|
||||
break;
|
||||
case PACKET3_3D_DRAW_INDX_2:
|
||||
fprintf(file, " PACKET3_3D_DRAW_INDX_2:\n");
|
||||
break;
|
||||
default:
|
||||
fprintf(file, "Unknow opcode 0x%02X at %d\n", opcode, i);
|
||||
return;
|
||||
}
|
||||
for (j = 0; j <= cnt; j++) {
|
||||
fprintf(file, " 0x%08X\n", cs->packets[i++]);
|
||||
}
|
||||
break;
|
||||
case PACKET_TYPE1:
|
||||
case PACKET_TYPE2:
|
||||
default:
|
||||
fprintf(file, "Unknow packet 0x%08X at %d\n", cs->packets[i], i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static struct radeon_cs_funcs radeon_cs_gem_funcs = {
|
||||
|
|
@ -316,7 +414,8 @@ static struct radeon_cs_funcs radeon_cs_gem_funcs = {
|
|||
cs_gem_emit,
|
||||
cs_gem_destroy,
|
||||
cs_gem_erase,
|
||||
cs_gem_need_flush
|
||||
cs_gem_need_flush,
|
||||
cs_gem_print
|
||||
};
|
||||
|
||||
struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd)
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ void radeon_tracker_remove_track(struct radeon_tracker *tracker,
|
|||
if (track->next) {
|
||||
track->next->prev = track->prev;
|
||||
}
|
||||
track->next = track->prev = NULL;
|
||||
event = track->events;
|
||||
while (event) {
|
||||
tmp = event;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue