Mesa (master): r300g,radeong: set tiling flags in libdrm

Corbin Simpson csimpson at kemper.freedesktop.org
Mon Jan 25 07:04:14 UTC 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sun Jan 17 00:57:04 2010 +0100

r300g,radeong: set tiling flags in libdrm

---

 src/gallium/drivers/r300/r300_texture.c            |    7 ++++++
 src/gallium/winsys/drm/radeon/core/radeon_buffer.c |   22 ++++++++++++++++++++
 src/gallium/winsys/drm/radeon/core/radeon_winsys.h |    6 +++++
 3 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c
index 1f73f74..67bf8ce 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -30,6 +30,8 @@
 #include "r300_texture.h"
 #include "r300_screen.h"
 
+#include "radeon_winsys.h"
+
 #define TILE_WIDTH 0
 #define TILE_HEIGHT 1
 
@@ -209,6 +211,7 @@ static struct pipe_texture*
 {
     struct r300_texture* tex = CALLOC_STRUCT(r300_texture);
     struct r300_screen* rscreen = r300_screen(screen);
+    struct radeon_winsys* winsys = (struct radeon_winsys*)screen->winsys;
 
     if (!tex) {
         return NULL;
@@ -225,6 +228,10 @@ static struct pipe_texture*
     tex->buffer = screen->buffer_create(screen, 2048,
                                         PIPE_BUFFER_USAGE_PIXEL,
                                         tex->size);
+    winsys->buffer_set_tiling(winsys, tex->buffer,
+                              tex->pitch[0],
+                              tex->microtile != R300_BUFFER_LINEAR,
+                              tex->macrotile != R300_BUFFER_LINEAR);
 
     if (!tex->buffer) {
         FREE(tex);
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_buffer.c b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
index b020ff3..25e1cdc 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
+++ b/src/gallium/winsys/drm/radeon/core/radeon_buffer.c
@@ -202,6 +202,26 @@ static void radeon_buffer_unmap(struct pipe_winsys *ws,
     }
 }
 
+static void radeon_buffer_set_tiling(struct radeon_winsys *ws,
+                                     struct pipe_buffer *buffer,
+                                     uint32_t pitch,
+                                     boolean microtiled,
+                                     boolean macrotiled)
+{
+    struct radeon_pipe_buffer *radeon_buffer =
+        (struct radeon_pipe_buffer*)buffer;
+    uint32_t flags = 0;
+
+    if (microtiled) {
+        flags |= RADEON_BO_FLAGS_MICRO_TILE;
+    }
+    if (macrotiled) {
+        flags |= RADEON_BO_FLAGS_MACRO_TILE;
+    }
+
+    radeon_bo_set_tiling(radeon_buffer->bo, flags, pitch);
+}
+
 static void radeon_fence_reference(struct pipe_winsys *ws,
                                    struct pipe_fence_handle **ptr,
                                    struct pipe_fence_handle *pfence)
@@ -304,5 +324,7 @@ struct radeon_winsys* radeon_pipe_winsys(int fd)
 
     radeon_ws->base.get_name = radeon_get_name;
 
+    radeon_ws->buffer_set_tiling = radeon_buffer_set_tiling;
+
     return radeon_ws;
 }
diff --git a/src/gallium/winsys/drm/radeon/core/radeon_winsys.h b/src/gallium/winsys/drm/radeon/core/radeon_winsys.h
index 9edc9e0..864082b 100644
--- a/src/gallium/winsys/drm/radeon/core/radeon_winsys.h
+++ b/src/gallium/winsys/drm/radeon/core/radeon_winsys.h
@@ -100,6 +100,12 @@ struct radeon_winsys {
 			 void (*flush_cb)(void *), void *data);
 
     void (*reset_bos)(struct radeon_winsys *winsys);
+
+    void (*buffer_set_tiling)(struct radeon_winsys* winsys,
+                              struct pipe_buffer* buffer,
+                              uint32_t pitch,
+                              boolean microtiled,
+                              boolean macrotiled);
 };
 
 #endif




More information about the mesa-commit mailing list