Mesa (nvfx-next-6): r300g: do not tell st that a buffer is referenced by hw

Luca Barbieri lb at kemper.freedesktop.org
Sun Apr 18 14:25:32 UTC 2010


Module: Mesa
Branch: nvfx-next-6
Commit: 7a1b5c937fa32968a04a11649e456a1ef8c5b442
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7a1b5c937fa32968a04a11649e456a1ef8c5b442

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sun Apr 18 06:32:10 2010 +0200

r300g: do not tell st that a buffer is referenced by hw

It saves a few libdrm calls and unnecessary flushes.

---

 src/gallium/drivers/r300/r300_render.c            |    6 +++---
 src/gallium/drivers/r300/r300_screen_buffer.c     |    2 +-
 src/gallium/drivers/r300/r300_texture.c           |    2 +-
 src/gallium/drivers/r300/r300_winsys.h            |   10 +++++++---
 src/gallium/winsys/radeon/drm/radeon_buffer.h     |    3 ++-
 src/gallium/winsys/radeon/drm/radeon_drm_buffer.c |   20 ++++++++++++++++----
 src/gallium/winsys/radeon/drm/radeon_r300.c       |    5 +++--
 7 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index f6bc68c..26ff71c 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -152,9 +152,9 @@ static boolean immd_is_good_idea(struct r300_context *r300,
         if (!checked[vbi]) {
             vbuf = &r300->vertex_buffer[vbi];
 
-            if (r300->context.is_resource_referenced(&r300->context,
-						     vbuf->buffer,
-						     0, 0)) {
+            if (r300->rws->is_buffer_referenced(r300->rws,
+                                                r300_buffer(vbuf->buffer)->buf,
+                                                R300_REF_CS | R300_REF_HW)) {
                 /* It's a very bad idea to map it... */
                 return FALSE;
             }
diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c
index 739f723..c5c10af 100644
--- a/src/gallium/drivers/r300/r300_screen_buffer.c
+++ b/src/gallium/drivers/r300/r300_screen_buffer.c
@@ -44,7 +44,7 @@ static unsigned r300_buffer_is_referenced(struct pipe_context *context,
     if (r300_buffer_is_user_buffer(buf))
  	return PIPE_UNREFERENCED;
 
-    if (r300->rws->is_buffer_referenced(r300->rws, rbuf->buf))
+    if (r300->rws->is_buffer_referenced(r300->rws, rbuf->buf, R300_REF_CS))
         return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
 
     return PIPE_UNREFERENCED;
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index a4a3f21..e795c8d 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -880,7 +880,7 @@ static unsigned r300_texture_is_referenced(struct pipe_context *context,
     struct r300_context *r300 = r300_context(context);
     struct r300_texture *rtex = (struct r300_texture *)texture;
 
-    if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer))
+    if (r300->rws->is_buffer_referenced(r300->rws, rtex->buffer, R300_REF_CS))
         return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
 
     return PIPE_UNREFERENCED;
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
index 9c348d9..2bd4017 100644
--- a/src/gallium/drivers/r300/r300_winsys.h
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -42,6 +42,11 @@ enum r300_value_id {
     R300_VID_TEX3D_MIP_BUG,
 };
 
+enum r300_reference_domain { /* bitfield */
+    R300_REF_CS = 1,
+    R300_REF_HW = 2
+};
+
 struct r300_winsys_screen {
     void (*destroy)(struct r300_winsys_screen *ws);
     
@@ -160,9 +165,8 @@ struct r300_winsys_screen {
 				 struct winsys_handle *whandle);
 
     boolean (*is_buffer_referenced)(struct r300_winsys_screen *winsys,
-                                    struct r300_winsys_buffer *buffer);
-
-  
+                                    struct r300_winsys_buffer *buffer,
+                                    enum r300_reference_domain domain);
 };
 
 struct r300_winsys_screen *
diff --git a/src/gallium/winsys/radeon/drm/radeon_buffer.h b/src/gallium/winsys/radeon/drm/radeon_buffer.h
index 8782d67..b48b635 100644
--- a/src/gallium/winsys/radeon/drm/radeon_buffer.h
+++ b/src/gallium/winsys/radeon/drm/radeon_buffer.h
@@ -86,5 +86,6 @@ void radeon_drm_bufmgr_flush_maps(struct pb_manager *_mgr);
 boolean radeon_drm_bufmgr_get_handle(struct pb_buffer *_buf,
 				     struct winsys_handle *whandle);
 
-boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf);
+boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf,
+                                               enum r300_reference_domain domain);
 #endif
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
index c9179a3..9824ada 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
@@ -381,13 +381,25 @@ void radeon_drm_bufmgr_write_reloc(struct pb_buffer *_buf,
     }
 }
 
-boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf)
+boolean radeon_drm_bufmgr_is_buffer_referenced(struct pb_buffer *_buf,
+                                               enum r300_reference_domain domain)
 {
     struct radeon_drm_buffer *buf = get_drm_buffer(_buf);
-    uint32_t domain;
+    uint32_t tmp;
+
+    if (domain & R300_REF_CS) {
+        if (radeon_bo_is_referenced_by_cs(buf->bo, buf->mgr->rws->cs)) {
+            return TRUE;
+        }
+    }
+
+    if (domain & R300_REF_HW) {
+        if (radeon_bo_is_busy(buf->bo, &tmp)) {
+            return TRUE;
+        }
+    }
 
-    return (radeon_bo_is_referenced_by_cs(buf->bo, buf->mgr->rws->cs) ||
-	    radeon_bo_is_busy(buf->bo, &domain));
+    return FALSE;
 }
 
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_r300.c b/src/gallium/winsys/radeon/drm/radeon_r300.c
index d1e65f8..2fcf7cf 100644
--- a/src/gallium/winsys/radeon/drm/radeon_r300.c
+++ b/src/gallium/winsys/radeon/drm/radeon_r300.c
@@ -111,11 +111,12 @@ static void radeon_r300_winsys_buffer_reference(struct r300_winsys_screen *rws,
 }
 
 static boolean radeon_r300_winsys_is_buffer_referenced(struct r300_winsys_screen *rws,
-						       struct r300_winsys_buffer *buf)
+						       struct r300_winsys_buffer *buf,
+                                                       enum r300_reference_domain domain)
 {
     struct pb_buffer *_buf = radeon_pb_buffer(buf);
 
-    return radeon_drm_bufmgr_is_buffer_referenced(_buf);
+    return radeon_drm_bufmgr_is_buffer_referenced(_buf, domain);
 }
 
 static struct r300_winsys_buffer *radeon_r300_winsys_buffer_from_handle(struct r300_winsys_screen *rws,




More information about the mesa-commit mailing list