diff options
author | Marek Olšák <maraeo@gmail.com> | 2011-02-11 07:52:10 +0100 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2011-02-12 03:08:39 +0100 |
commit | df54b53b7d12a3bca5867b6649cb308feb36f0da (patch) | |
tree | 62a94f5682308e8dba045d7cb123c46fef30d420 /src/gallium/winsys/radeon/drm/radeon_drm_cs.c | |
parent | 20a78b68a3271d7a66fdf1e55c5882b8c12dfb8d (diff) |
r300g: improve function radeon_bo_is_referenced_by_cs
This should prevent calling into radeon_get_reloc when there's
only one context.
Diffstat (limited to 'src/gallium/winsys/radeon/drm/radeon_drm_cs.c')
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c index 6aa3f2ecce..5b2a17c856 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c @@ -106,6 +106,7 @@ static struct r300_winsys_cs *radeon_drm_cs_create(struct r300_winsys_screen *rw cs->chunks[1].chunk_id = RADEON_CHUNK_ID_RELOCS; cs->chunks[1].length_dw = 0; cs->chunks[1].chunk_data = (uint64_t)(uintptr_t)cs->relocs; + p_atomic_inc(&ws->num_cs); return &cs->base; } @@ -215,6 +216,7 @@ static void radeon_add_reloc(struct radeon_drm_cs *cs, /* Initialize the new relocation. */ radeon_bo_ref(bo); + p_atomic_inc(&bo->num_cs_references); cs->relocs_bo[cs->crelocs] = bo; reloc = &cs->relocs[cs->crelocs]; reloc->handle = bo->handle; @@ -315,6 +317,7 @@ static void radeon_drm_cs_emit(struct r300_winsys_cs *rcs) /* Unreference buffers, cleanup. */ for (i = 0; i < cs->crelocs; i++) { radeon_bo_unref(cs->relocs_bo[i]); + p_atomic_dec(&cs->relocs_bo[i]->num_cs_references); cs->relocs_bo[i] = NULL; } @@ -330,6 +333,7 @@ static void radeon_drm_cs_emit(struct r300_winsys_cs *rcs) static void radeon_drm_cs_destroy(struct r300_winsys_cs *rcs) { struct radeon_drm_cs *cs = radeon_drm_cs(rcs); + p_atomic_dec(&cs->ws->num_cs); FREE(cs->relocs_bo); FREE(cs->relocs); FREE(cs); |