r600g: add winsys bo caching.
authorDave Airlie <airlied@redhat.com>
Fri, 17 Sep 2010 03:37:31 +0000 (13:37 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 17 Sep 2010 05:29:31 +0000 (15:29 +1000)
this adds the bo caching layer and uses it for vertex/index/constant bos.

ctx needs to take references on hw bos so the flushing works okay, also
needs to flush the maps.

src/gallium/winsys/r600/drm/radeon.c
src/gallium/winsys/r600/drm/radeon_ctx.c
src/gallium/winsys/r600/drm/radeon_priv.h
src/gallium/winsys/r600/drm/radeon_ws_bo.c

index 8a5acf6256207777ebc4dc43ed31c59ff92f265f..f39d020559c2705c2cdc078fd55cfc0a69609016 100644 (file)
@@ -133,6 +133,9 @@ struct radeon *radeon_new(int fd, unsigned device)
        radeon->kman = radeon_bo_pbmgr_create(radeon);
        if (!radeon->kman)
                return NULL;
+       radeon->cman = pb_cache_manager_create(radeon->kman, 100000);
+       if (!radeon->cman)
+               return NULL;
        return radeon;
 }
 
@@ -153,6 +156,7 @@ struct radeon *radeon_decref(struct radeon *radeon)
        }
 
        radeon->mman->destroy(radeon->mman);
+       radeon->cman->destroy(radeon->cman);
        radeon->kman->destroy(radeon->kman);
        drmClose(radeon->fd);
        free(radeon);
index 4bec79861c435142266be5c2425b4594ab3403fe..ca3e40ffdc10d7a57796bafd500b5f65e31a7971 100644 (file)
@@ -34,28 +34,12 @@ static int radeon_ctx_set_bo_new(struct radeon_ctx *ctx, struct radeon_ws_bo *bo
 {
        if (ctx->nbo >= RADEON_CTX_MAX_PM4)
                return -EBUSY;
-       radeon_ws_bo_reference(ctx->radeon, &ctx->bo[ctx->nbo], bo);
+       /* take a reference to the kernel bo */
+       radeon_bo_reference(ctx->radeon, &ctx->bo[ctx->nbo], radeon_bo_pb_get_bo(bo->pb));
        ctx->nbo++;
        return 0;
 }
 
-static struct radeon_ws_bo *radeon_ctx_get_bo(struct radeon_ctx *ctx, unsigned reloc)
-{
-       struct radeon_cs_reloc *greloc;
-       unsigned i;
-       struct radeon_ws_bo *bo;
-
-       greloc = (void *)(((u8 *)ctx->reloc) + reloc * 4);
-       for (i = 0; i < ctx->nbo; i++) {
-               if (radeon_ws_bo_get_handle(ctx->bo[i]) == greloc->handle) {
-                       radeon_ws_bo_reference(ctx->radeon, &bo, ctx->bo[i]);
-                       return bo;
-               }
-       }
-       fprintf(stderr, "%s no bo for reloc[%d 0x%08X] %d\n", __func__, reloc, greloc->handle, ctx->nbo);
-       return NULL;
-}
-
 static void radeon_ctx_get_placement(struct radeon_ctx *ctx, unsigned reloc, u32 *placement)
 {
        struct radeon_cs_reloc *greloc;
@@ -65,7 +49,7 @@ static void radeon_ctx_get_placement(struct radeon_ctx *ctx, unsigned reloc, u32
        placement[1] = 0;
        greloc = (void *)(((u8 *)ctx->reloc) + reloc * 4);
        for (i = 0; i < ctx->nbo; i++) {
-               if (radeon_ws_bo_get_handle(ctx->bo[i]) == greloc->handle) {
+               if (ctx->bo[i]->handle == greloc->handle) {
                        placement[0] = greloc->read_domain | greloc->write_domain;
                        placement[1] = placement[0];
                        return;
@@ -76,7 +60,7 @@ static void radeon_ctx_get_placement(struct radeon_ctx *ctx, unsigned reloc, u32
 void radeon_ctx_clear(struct radeon_ctx *ctx)
 {
        for (int i = 0; i < ctx->nbo; i++) {
-               radeon_ws_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
+               radeon_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
        }
        ctx->ndwords = RADEON_CTX_MAX_PM4;
        ctx->cdwords = 0;
@@ -118,7 +102,7 @@ void radeon_ctx_fini(struct radeon_ctx *ctx)
                return;
 
        for (i = 0; i < ctx->nbo; i++) {
-               radeon_ws_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
+               radeon_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
        }
        ctx->radeon = radeon_decref(ctx->radeon);
        free(ctx->bo);
@@ -131,12 +115,13 @@ static int radeon_ctx_state_bo(struct radeon_ctx *ctx, struct radeon_state *stat
 {
        unsigned i, j;
        int r;
-
+       struct radeon_bo *state_bo;
        if (state == NULL)
                return 0;
        for (i = 0; i < state->nbo; i++) {
                for (j = 0; j < ctx->nbo; j++) {
-                       if (state->bo[i] == ctx->bo[j])
+                       state_bo = radeon_bo_pb_get_bo(state->bo[i]->pb);
+                       if (state_bo == ctx->bo[j])
                                break;
                }
                if (j == ctx->nbo) {
@@ -158,6 +143,8 @@ int radeon_ctx_submit(struct radeon_ctx *ctx)
 
        if (!ctx->cdwords)
                return 0;
+
+       radeon_bo_pbmgr_flush_maps(ctx->radeon->kman);
 #if 0
        for (r = 0; r < ctx->cdwords; r++) {
                fprintf(stderr, "0x%08X\n", ctx->pm4[r]);
@@ -310,7 +297,6 @@ void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file)
 {
        bof_t *bcs, *blob, *array, *bo, *size, *handle, *device_id, *root;
        unsigned i;
-       void *data;
        unsigned bo_size;
        root = device_id = bcs = blob = array = bo = size = handle = NULL;
        root = bof_object();
@@ -347,7 +333,7 @@ void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file)
                bo = bof_object();
                if (bo == NULL)
                        goto out_err;
-               bo_size = radeon_ws_bo_get_size(ctx->bo[i]);
+               bo_size = ctx->bo[i]->size;
                size = bof_int32(bo_size);
                if (size == NULL)
                        goto out_err;
@@ -355,16 +341,16 @@ void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file)
                        goto out_err;
                bof_decref(size);
                size = NULL;
-               handle = bof_int32(radeon_ws_bo_get_handle(ctx->bo[i]));
+               handle = bof_int32(ctx->bo[i]->handle);
                if (handle == NULL)
                        goto out_err;
                if (bof_object_set(bo, "handle", handle))
                        goto out_err;
                bof_decref(handle);
                handle = NULL;
-               data = radeon_ws_bo_map(ctx->radeon, ctx->bo[i], 0, NULL);
-               blob = bof_blob(bo_size, data);
-               radeon_ws_bo_unmap(ctx->radeon, ctx->bo[i]);
+               radeon_bo_map(ctx->radeon, ctx->bo[i]);
+               blob = bof_blob(bo_size, ctx->bo[i]->data);
+               radeon_bo_unmap(ctx->radeon, ctx->bo[i]);
                if (blob == NULL)
                        goto out_err;
                if (bof_object_set(bo, "data", blob))
index bbcf8ec4a4b93c775ebe8e45cd37eab376dcf7f5..c284f6aa7d17389f3dd0b2bf9deb28e68289af36 100644 (file)
@@ -75,7 +75,7 @@ struct radeon_ctx {
        unsigned                        nreloc;
        struct radeon_cs_reloc          *reloc;
        unsigned                        nbo;
-       struct radeon_ws_bo             **bo;
+       struct radeon_bo                **bo;
 };
 
 struct radeon {
@@ -89,6 +89,7 @@ struct radeon {
        boolean use_mem_constant; /* true for evergreen */
        struct pb_manager *mman; /* malloc manager */
        struct pb_manager *kman; /* kernel bo manager */
+       struct pb_manager *cman; /* cached bo manager */
 };
 
 struct radeon_ws_bo {
index c63e926daba60209848ff39ba172118fae81227b..ccaedb4777dae96985c155096e74ab0083736b52 100644 (file)
@@ -15,7 +15,9 @@ struct radeon_ws_bo *radeon_ws_bo(struct radeon *radeon,
 
        if (radeon->use_mem_constant && (usage & PIPE_BIND_CONSTANT_BUFFER)) {
                man = radeon->mman;
-       } else
+       } else if (usage & (PIPE_BIND_CONSTANT_BUFFER | PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER))
+               man = radeon->cman;
+       else
                man = radeon->kman;
 
        ws_bo->pb = man->create_buffer(man, size, &desc);