Mesa (master): r300g: fix color tiling for buffer from X server.

Dave Airlie airlied at kemper.freedesktop.org
Sat Apr 3 11:57:36 UTC 2010


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Sat Apr  3 21:52:09 2010 +1000

r300g: fix color tiling for buffer from X server.

The tiling setup needs a bit of work, but this should be good enough for now,
when we get buffers from the kernel we need to store their tiling properties.

Signed-off-by: Dave Airlie <airlied at redhat.com>

---

 src/gallium/drivers/r300/r300_texture.c           |    1 +
 src/gallium/drivers/r300/r300_winsys.h            |    5 +++++
 src/gallium/winsys/radeon/drm/radeon_buffer.h     |    4 ++++
 src/gallium/winsys/radeon/drm/radeon_drm_buffer.c |   19 ++++++++++++++++++-
 src/gallium/winsys/radeon/drm/radeon_r300.c       |   10 ++++++++++
 5 files changed, 38 insertions(+), 1 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index e7bac61..a9c9e14 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -909,6 +909,7 @@ static struct pipe_texture*
     /* one ref already taken */
     tex->buffer = buffer;
 
+    rws->buffer_get_tiling(rws, buffer, &tex->microtile, &tex->macrotile);
     return (struct pipe_texture*)tex;
 }
 
diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h
index acfa5db..d8d0c60 100644
--- a/src/gallium/drivers/r300/r300_winsys.h
+++ b/src/gallium/drivers/r300/r300_winsys.h
@@ -146,6 +146,11 @@ struct r300_winsys_screen {
 
     void (*reset_bos)(struct r300_winsys_screen *winsys);
 
+    void (*buffer_get_tiling)(struct r300_winsys_screen *winsys,
+                              struct r300_winsys_buffer *buffer,
+                              enum r300_buffer_tiling *microtiled,
+                              enum r300_buffer_tiling *macrotiled);
+
     void (*buffer_set_tiling)(struct r300_winsys_screen *winsys,
                               struct r300_winsys_buffer *buffer,
                               uint32_t pitch,
diff --git a/src/gallium/winsys/radeon/drm/radeon_buffer.h b/src/gallium/winsys/radeon/drm/radeon_buffer.h
index 218a376..8782d67 100644
--- a/src/gallium/winsys/radeon/drm/radeon_buffer.h
+++ b/src/gallium/winsys/radeon/drm/radeon_buffer.h
@@ -72,6 +72,10 @@ void radeon_drm_bufmgr_write_reloc(struct pb_buffer *_buf,
 struct pb_buffer *radeon_drm_bufmgr_create_buffer_from_handle(struct pb_manager *_mgr,
 							      uint32_t handle);
 
+void radeon_drm_bufmgr_get_tiling(struct pb_buffer *_buf,
+                                  enum r300_buffer_tiling *microtiled,
+                                  enum r300_buffer_tiling *macrotiled);
+
 void radeon_drm_bufmgr_set_tiling(struct pb_buffer *_buf,
                                   enum r300_buffer_tiling microtiled,
                                   enum r300_buffer_tiling macrotiled,
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
index 66f6132..5fd20cc 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_buffer.c
@@ -304,7 +304,24 @@ boolean radeon_drm_bufmgr_get_handle(struct pb_buffer *_buf,
     }
     return TRUE;
 }
-					   
+
+void radeon_drm_bufmgr_get_tiling(struct pb_buffer *_buf,
+                                  enum r300_buffer_tiling *microtiled,
+                                  enum r300_buffer_tiling *macrotiled)
+{
+    struct radeon_drm_buffer *buf = get_drm_buffer(_buf);
+    uint32_t flags = 0, pitch;
+
+    radeon_bo_get_tiling(buf->bo, &flags, &pitch);
+
+    *microtiled = R300_BUFFER_LINEAR;
+    *macrotiled = R300_BUFFER_LINEAR;
+    if (flags & RADEON_BO_FLAGS_MICRO_TILE)
+	*microtiled = R300_BUFFER_TILED;
+
+    if (flags & RADEON_BO_FLAGS_MACRO_TILE)
+	*macrotiled = R300_BUFFER_TILED;
+}
 
 void radeon_drm_bufmgr_set_tiling(struct pb_buffer *_buf,
                                   enum r300_buffer_tiling microtiled,
diff --git a/src/gallium/winsys/radeon/drm/radeon_r300.c b/src/gallium/winsys/radeon/drm/radeon_r300.c
index 38fcf88..935c1d8 100644
--- a/src/gallium/winsys/radeon/drm/radeon_r300.c
+++ b/src/gallium/winsys/radeon/drm/radeon_r300.c
@@ -72,6 +72,15 @@ static void radeon_r300_winsys_buffer_set_tiling(struct r300_winsys_screen *rws,
     radeon_drm_bufmgr_set_tiling(_buf, microtiled, macrotiled, pitch);
 }
 
+static void radeon_r300_winsys_buffer_get_tiling(struct r300_winsys_screen *rws,
+						  struct r300_winsys_buffer *buf,
+						  enum r300_buffer_tiling *microtiled,
+						  enum r300_buffer_tiling *macrotiled)
+{
+    struct pb_buffer *_buf = radeon_pb_buffer(buf);
+    radeon_drm_bufmgr_get_tiling(_buf, microtiled, macrotiled);
+}
+
 static void *radeon_r300_winsys_buffer_map(struct r300_winsys_screen *ws,
 					   struct r300_winsys_buffer *buf,
 					   unsigned usage)
@@ -320,6 +329,7 @@ radeon_setup_winsys(int fd, struct radeon_libdrm_winsys* ws)
     ws->base.buffer_create = radeon_r300_winsys_buffer_create;
     ws->base.buffer_destroy = radeon_r300_winsys_buffer_destroy;
     ws->base.buffer_set_tiling = radeon_r300_winsys_buffer_set_tiling;
+    ws->base.buffer_get_tiling = radeon_r300_winsys_buffer_get_tiling;
     ws->base.buffer_map = radeon_r300_winsys_buffer_map;
     ws->base.buffer_unmap = radeon_r300_winsys_buffer_unmap;
     ws->base.buffer_reference = radeon_r300_winsys_buffer_reference;




More information about the mesa-commit mailing list