From: Dave Airlie Date: Sat, 3 Apr 2010 11:52:09 +0000 (+1000) Subject: r300g: fix color tiling for buffer from X server. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4c26cdbe01619abad413b09317f2842dcf1a4d57;p=mesa.git 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 --- diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index e7bac615dff..a9c9e14ba7c 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 acfa5dbeb9c..d8d0c609d25 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 218a3763018..8782d675df2 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 66f61322457..5fd20cc7754 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 38fcf889c8b..935c1d84d02 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;