summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2011-02-11 07:52:10 +0100
committerMarek Olšák <maraeo@gmail.com>2011-02-12 03:08:39 +0100
commitdf54b53b7d12a3bca5867b6649cb308feb36f0da (patch)
tree62a94f5682308e8dba045d7cb123c46fef30d420 /src/gallium/winsys/radeon/drm/radeon_drm_cs.c
parent20a78b68a3271d7a66fdf1e55c5882b8c12dfb8d (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.c4
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);