diff options
Diffstat (limited to 'libdrm')
| -rw-r--r-- | libdrm/radeon/radeon_bo.h | 6 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_bo_gem.c | 3 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_cs.h | 6 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_cs_gem.c | 103 | ||||
| -rw-r--r-- | libdrm/radeon/radeon_track.c | 1 | 
5 files changed, 113 insertions, 6 deletions
diff --git a/libdrm/radeon/radeon_bo.h b/libdrm/radeon/radeon_bo.h index 523cf38e..44dc0901 100644 --- a/libdrm/radeon/radeon_bo.h +++ b/libdrm/radeon/radeon_bo.h @@ -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, diff --git a/libdrm/radeon/radeon_bo_gem.c b/libdrm/radeon/radeon_bo_gem.c index b6d5b294..fdf852a2 100644 --- a/libdrm/radeon/radeon_bo_gem.c +++ b/libdrm/radeon/radeon_bo_gem.c @@ -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;  } diff --git a/libdrm/radeon/radeon_cs.h b/libdrm/radeon/radeon_cs.h index 63f104b6..e76121ea 100644 --- a/libdrm/radeon/radeon_cs.h +++ b/libdrm/radeon/radeon_cs.h @@ -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 diff --git a/libdrm/radeon/radeon_cs_gem.c b/libdrm/radeon/radeon_cs_gem.c index 91489dff..319d1b9e 100644 --- a/libdrm/radeon/radeon_cs_gem.c +++ b/libdrm/radeon/radeon_cs_gem.c @@ -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) diff --git a/libdrm/radeon/radeon_track.c b/libdrm/radeon/radeon_track.c index c0c6f850..1623906f 100644 --- a/libdrm/radeon/radeon_track.c +++ b/libdrm/radeon/radeon_track.c @@ -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;  | 
