Module: Mesa
Branch: master
Commit: 29e55bc5f1b6d7375b6a86e24ca4ae58e399011e
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=29e55bc5f1b6d7375b6a86e24ca4ae58e399011e

Author: Marek Olšák <[email protected]>
Date:   Sun Feb 26 18:04:36 2012 +0100

winsys/radeon: add usage parameter to cs_is_buffer_referenced

Reviewed-by: Alex Deucher <[email protected]>
Reviewed-by: Christian König <[email protected]>

---

 src/gallium/drivers/r300/r300_transfer.c      |    2 +-
 src/gallium/drivers/r600/r600_query.c         |    2 +-
 src/gallium/drivers/r600/r600_texture.c       |    2 +-
 src/gallium/winsys/radeon/drm/radeon_drm_cs.c |   18 ++++++++++++++++--
 src/gallium/winsys/radeon/drm/radeon_winsys.h |    3 ++-
 5 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_transfer.c 
b/src/gallium/drivers/r300/r300_transfer.c
index 5e99cc4..d440db8 100644
--- a/src/gallium/drivers/r300/r300_transfer.c
+++ b/src/gallium/drivers/r300/r300_transfer.c
@@ -90,7 +90,7 @@ r300_texture_get_transfer(struct pipe_context *ctx,
     boolean referenced_cs, referenced_hw;
 
     referenced_cs =
-        r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf);
+        r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf, 
RADEON_USAGE_READWRITE);
     if (referenced_cs) {
         referenced_hw = TRUE;
     } else {
diff --git a/src/gallium/drivers/r600/r600_query.c 
b/src/gallium/drivers/r600/r600_query.c
index def0a97..df5764a 100644
--- a/src/gallium/drivers/r600/r600_query.c
+++ b/src/gallium/drivers/r600/r600_query.c
@@ -346,7 +346,7 @@ static void r600_begin_query(struct pipe_context *ctx, 
struct pipe_query *query)
        }
 
        /* Obtain a new buffer if the current one can't be mapped without a 
stall. */
-       if (rctx->ws->cs_is_buffer_referenced(rctx->cs, 
rquery->buffer.buf->cs_buf) ||
+       if (rctx->ws->cs_is_buffer_referenced(rctx->cs, 
rquery->buffer.buf->cs_buf, RADEON_USAGE_READWRITE) ||
            rctx->ws->buffer_is_busy(rquery->buffer.buf->buf, 
RADEON_USAGE_READWRITE)) {
                pipe_resource_reference((struct 
pipe_resource**)&rquery->buffer.buf, NULL);
                rquery->buffer.buf = r600_new_query_buffer(rctx, rquery->type);
diff --git a/src/gallium/drivers/r600/r600_texture.c 
b/src/gallium/drivers/r600/r600_texture.c
index 6e275eb..6222410 100644
--- a/src/gallium/drivers/r600/r600_texture.c
+++ b/src/gallium/drivers/r600/r600_texture.c
@@ -796,7 +796,7 @@ struct pipe_transfer* r600_texture_get_transfer(struct 
pipe_context *ctx,
 
        /* Use a staging texture for uploads if the underlying BO is busy. */
        if (!(usage & PIPE_TRANSFER_READ) &&
-           (rctx->ws->cs_is_buffer_referenced(rctx->cs, rtex->resource.cs_buf) 
||
+           (rctx->ws->cs_is_buffer_referenced(rctx->cs, rtex->resource.cs_buf, 
RADEON_USAGE_READWRITE) ||
             rctx->ws->buffer_is_busy(rtex->resource.buf, 
RADEON_USAGE_READWRITE)))
                use_staging_texture = TRUE;
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c 
b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index cf8f25b..10f9338 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -512,12 +512,26 @@ static void radeon_drm_cs_set_flush(struct 
radeon_winsys_cs *rcs,
 }
 
 static boolean radeon_bo_is_referenced(struct radeon_winsys_cs *rcs,
-                                       struct radeon_winsys_cs_handle *_buf)
+                                       struct radeon_winsys_cs_handle *_buf,
+                                       enum radeon_bo_usage usage)
 {
     struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
     struct radeon_bo *bo = (struct radeon_bo*)_buf;
+    int index;
 
-    return radeon_bo_is_referenced_by_cs(cs, bo);
+    if (!bo->num_cs_references)
+        return FALSE;
+
+    index = radeon_get_reloc(cs->csc, bo);
+    if (index == -1)
+        return FALSE;
+
+    if ((usage & RADEON_USAGE_WRITE) && cs->csc->relocs[index].write_domain)
+        return TRUE;
+    if ((usage & RADEON_USAGE_READ) && cs->csc->relocs[index].read_domains)
+        return TRUE;
+
+    return FALSE;
 }
 
 void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws)
diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h 
b/src/gallium/winsys/radeon/drm/radeon_winsys.h
index ef07d37..9c61dcb 100644
--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
+++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
@@ -341,7 +341,8 @@ struct radeon_winsys {
      * \param buf       A winsys buffer.
      */
     boolean (*cs_is_buffer_referenced)(struct radeon_winsys_cs *cs,
-                                       struct radeon_winsys_cs_handle *buf);
+                                       struct radeon_winsys_cs_handle *buf,
+                                       enum radeon_bo_usage usage);
 
     /**
      * Request access to a feature for a command stream.

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to