Mesa (master): r300g: let the driver determine the GEM domain for buffer_create

Marek Olšák mareko at kemper.freedesktop.org
Tue Jun 1 21:01:52 PDT 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Wed Jun  2 05:50:58 2010 +0200

r300g: let the driver determine the GEM domain for buffer_create

---

 src/gallium/drivers/r300/r300_defines.h           |    5 +++
 src/gallium/drivers/r300/r300_screen_buffer.c     |    2 +-
 src/gallium/drivers/r300/r300_texture.c           |    4 +-
 src/gallium/drivers/r300/r300_winsys.h            |    3 +-
 src/gallium/winsys/radeon/drm/radeon_buffer.h     |    2 +
 src/gallium/winsys/radeon/drm/radeon_drm_buffer.c |   31 +++-----------------
 src/gallium/winsys/radeon/drm/radeon_r300.c       |    9 ++++++
 7 files changed, 26 insertions(+), 30 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_defines.h b/src/gallium/drivers/r300/r300_defines.h
index 4b1c370..83c9ec7 100644
--- a/src/gallium/drivers/r300/r300_defines.h
+++ b/src/gallium/drivers/r300/r300_defines.h
@@ -45,4 +45,9 @@ enum r300_buffer_tiling {
     R300_BUFFER_SQUARETILED
 };
 
+enum r300_buffer_domain { /* bitfield */
+    R300_DOMAIN_GTT  = 1,
+    R300_DOMAIN_VRAM = 2
+};
+
 #endif
diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c
index 3e2b5af..de89f51 100644
--- a/src/gallium/drivers/r300/r300_screen_buffer.c
+++ b/src/gallium/drivers/r300/r300_screen_buffer.c
@@ -125,7 +125,7 @@ r300_winsys_buffer_create(struct r300_screen *r300screen,
     struct r300_winsys_screen *rws = r300screen->rws;
     struct r300_winsys_buffer *buf;
 
-    buf = rws->buffer_create(rws, alignment, usage, size);
+    buf = rws->buffer_create(rws, alignment, usage, R300_DOMAIN_GTT, size);
     return buf;
 }
 
diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index a4b5d34..8572334 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -959,9 +959,9 @@ struct pipe_resource* r300_texture_create(struct pipe_screen* screen,
                base->width0, base->height0, base->depth0, base->last_level,
                util_format_short_name(base->format));
 
-    tex->buffer = rws->buffer_create(rws, 2048,
-                                     base->bind,
+    tex->buffer = rws->buffer_create(rws, 2048, base->bind, R300_DOMAIN_VRAM,
 				     tex->size);
+
     rws->buffer_set_tiling(rws, tex->buffer,
             tex->pitch[0] * util_format_get_blocksize(tex->b.b.format),
             tex->microtile,
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
index f7cbbde..d59a45a 100644
--- a/src/gallium/drivers/r300/r300_winsys.h
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -74,8 +74,9 @@ struct r300_winsys_screen {
     struct r300_winsys_buffer *(*buffer_create)(struct r300_winsys_screen *ws,
 						unsigned alignment,
 						unsigned usage,
+                                                enum r300_buffer_domain domain,
 						unsigned size);
-    
+
     /**
      * Map the entire data store of a buffer object into the client's address.
      * flags is bitmask of R300_WINSYS_BUFFER_USAGE_CPU_READ/WRITE flags.
diff --git a/src/gallium/winsys/radeon/drm/radeon_buffer.h b/src/gallium/winsys/radeon/drm/radeon_buffer.h
index b9ecf9d..da13e4d 100644
--- a/src/gallium/winsys/radeon/drm/radeon_buffer.h
+++ b/src/gallium/winsys/radeon/drm/radeon_buffer.h
@@ -43,6 +43,8 @@
 
 #include "radeon_winsys.h"
 
+#define RADEON_USAGE_DOMAIN_GTT  (1 << 29)
+#define RADEON_USAGE_DOMAIN_VRAM (1 << 30)
 
 #define RADEON_MAX_BOS 24
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
index a05205d..efe8202 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
@@ -145,31 +145,6 @@ const struct pb_vtbl radeon_drm_buffer_vtbl = {
     radeon_drm_buffer_get_base_buffer,
 };
 
-
-static uint32_t radeon_domain_from_usage(unsigned usage)
-{
-    uint32_t domain = 0;
-
-    if (usage & PIPE_BIND_RENDER_TARGET) {
-        domain |= RADEON_GEM_DOMAIN_VRAM;
-    }
-    if (usage & PIPE_BIND_DEPTH_STENCIL) {
-        domain |= RADEON_GEM_DOMAIN_VRAM;
-    }
-    if (usage & PIPE_BIND_SAMPLER_VIEW) {
-        domain |= RADEON_GEM_DOMAIN_VRAM;
-    }
-    /* also need BIND_BLIT_SOURCE/DESTINATION ? */
-    if (usage & PIPE_BIND_VERTEX_BUFFER) {
-        domain |= RADEON_GEM_DOMAIN_GTT;
-    }
-    if (usage & PIPE_BIND_INDEX_BUFFER) {
-        domain |= RADEON_GEM_DOMAIN_GTT;
-    }
-
-    return domain;
-}
-
 struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
 							      uint32_t handle)
 {
@@ -225,7 +200,11 @@ radeon_drm_bufmgr_create_buffer(struct pb_manager *_mgr,
     buf->mgr = mgr;
 
     make_empty_list(buf);
-    domain = radeon_domain_from_usage(desc->usage);
+
+    domain =
+        (desc->usage & RADEON_USAGE_DOMAIN_GTT  ? RADEON_GEM_DOMAIN_GTT  : 0) |
+        (desc->usage & RADEON_USAGE_DOMAIN_VRAM ? RADEON_GEM_DOMAIN_VRAM : 0);
+
     buf->bo = radeon_bo_open(rws->bom, 0, size,
 			     desc->alignment, domain, 0);
     if (buf->bo == NULL)
diff --git a/src/gallium/winsys/radeon/drm/radeon_r300.c b/src/gallium/winsys/radeon/drm/radeon_r300.c
index ecee1ee..4cf21ff 100644
--- a/src/gallium/winsys/radeon/drm/radeon_r300.c
+++ b/src/gallium/winsys/radeon/drm/radeon_r300.c
@@ -31,6 +31,7 @@ static struct r300_winsys_buffer *
 radeon_r300_winsys_buffer_create(struct r300_winsys_screen *rws,
 				 unsigned alignment,
 				 unsigned usage,
+                                 enum r300_buffer_domain domain,
 				 unsigned size)
 {
     struct radeon_libdrm_winsys *ws = radeon_winsys_screen(rws);
@@ -38,6 +39,14 @@ radeon_r300_winsys_buffer_create(struct r300_winsys_screen *rws,
     struct pb_manager *provider;
     struct pb_buffer *buffer;
 
+    /* XXX this is hackish, but it's the only way to pass these flags
+     * to the real create function. */
+    usage &= ~(RADEON_USAGE_DOMAIN_GTT | RADEON_USAGE_DOMAIN_VRAM);
+    if (domain & R300_DOMAIN_GTT)
+        usage |= RADEON_USAGE_DOMAIN_GTT;
+    if (domain & R300_DOMAIN_VRAM)
+        usage |= RADEON_USAGE_DOMAIN_VRAM;
+
     memset(&desc, 0, sizeof(desc));
     desc.alignment = alignment;
     desc.usage = usage;



More information about the mesa-commit mailing list