From fa3f1348e49feeac511dbe5b22bbddc47f56ba81 Mon Sep 17 00:00:00 2001 From: Marek Olšák Date: Wed, 16 Feb 2011 22:23:23 +0100 Subject: r300g: fix a race between CS and SET_TILING ioctls --- src/gallium/drivers/r300/r300_state.c | 7 +------ src/gallium/drivers/r300/r300_texture.c | 2 +- src/gallium/drivers/r300/r300_winsys.h | 2 ++ 3 files changed, 4 insertions(+), 7 deletions(-) (limited to 'src/gallium/drivers/r300') diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index aa18ab7d1e..5d8298341d 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -624,12 +624,7 @@ static void r300_tex_set_tiling_flags(struct r300_context *r300, * Skip changing the flags otherwise. */ if (tex->tex.macrotile[tex->surface_level] != tex->tex.macrotile[level]) { - /* Tiling determines how DRM treats the buffer data. - * We must flush CS when changing it if the buffer is referenced. */ - if (r300->rws->cs_is_buffer_referenced(r300->cs, tex->cs_buf)) - r300->context.flush(&r300->context, 0, NULL); - - r300->rws->buffer_set_tiling(tex->buf, + r300->rws->buffer_set_tiling(tex->buf, r300->cs, tex->tex.microtile, tex->tex.macrotile[level], tex->tex.stride_in_bytes[0]); diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 45a896d610..354144cac7 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -800,7 +800,7 @@ r300_texture_create_object(struct r300_screen *rscreen, tex->cs_buf = rws->buffer_get_cs_handle(tex->buf); - rws->buffer_set_tiling(tex->buf, + rws->buffer_set_tiling(tex->buf, NULL, tex->tex.microtile, tex->tex.macrotile[0], tex->tex.stride_in_bytes[0]); diff --git a/src/gallium/drivers/r300/r300_winsys.h b/src/gallium/drivers/r300/r300_winsys.h index 6733253ccc..d5c73585c8 100644 --- a/src/gallium/drivers/r300/r300_winsys.h +++ b/src/gallium/drivers/r300/r300_winsys.h @@ -168,6 +168,7 @@ struct r300_winsys_screen { * Set tiling flags describing a memory layout of a buffer object. * * \param buf A winsys buffer object to set the flags for. + * \param cs A command stream to flush if the buffer is referenced by it. * \param macrotile A macrotile flag. * \param microtile A microtile flag. * \param stride A stride of the buffer in bytes, for texturing. @@ -175,6 +176,7 @@ struct r300_winsys_screen { * \note microtile and macrotile are not bitmasks! */ void (*buffer_set_tiling)(struct r300_winsys_bo *buf, + struct r300_winsys_cs *cs, enum r300_buffer_tiling microtile, enum r300_buffer_tiling macrotile, unsigned stride); -- cgit v1.2.3