Module: Mesa Branch: refs/tags/segfault-fence_emit-2 Commit: 8b1701eb47cf2fb38144f9985c87e5e901438002 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8b1701eb47cf2fb38144f9985c87e5e901438002
Author: Emil Velikov <[email protected]> Date: Thu Jun 13 10:51:44 2013 +0100 Revert "nouveau: introduce nouveau_buffer_malloc helper" This reverts commit 4f70a1e89ef311981c3d704d2b8096a725fb2bbc. Due to missaligned malloc & copy, we segfault in __memcpy_ssse3 --- src/gallium/drivers/nouveau/nouveau_buffer.c | 28 +++++++++++++------------- src/gallium/drivers/nouveau/nouveau_winsys.h | 2 -- src/gallium/drivers/nv50/nv50_screen.c | 2 +- src/gallium/drivers/nvc0/nvc0_screen.c | 2 +- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c index 63e4c25..4709443 100644 --- a/src/gallium/drivers/nouveau/nouveau_buffer.c +++ b/src/gallium/drivers/nouveau/nouveau_buffer.c @@ -22,14 +22,6 @@ nouveau_transfer(struct pipe_transfer *transfer) } static INLINE boolean -nouveau_buffer_malloc(struct nv04_resource *buf) -{ - if (!buf->data) - buf->data = align_malloc(buf->base.width0, NOUVEAU_MIN_BUFFER_MAP_ALIGN); - return !!buf->data; -} - -static INLINE boolean nouveau_buffer_allocate(struct nouveau_screen *screen, struct nv04_resource *buf, unsigned domain) { @@ -53,10 +45,13 @@ nouveau_buffer_allocate(struct nouveau_screen *screen, if (!buf->bo) return FALSE; NOUVEAU_DRV_STAT(screen, buf_obj_current_bytes_sys, buf->base.width0); - } else { - assert(domain == 0); - if (!nouveau_buffer_malloc(buf)) - return FALSE; + } + if (domain != NOUVEAU_BO_GART) { + if (!buf->data) { + buf->data = align_malloc(buf->base.width0, 64); + if (!buf->data) + return FALSE; + } } buf->domain = domain; if (buf->bo) @@ -504,15 +499,20 @@ nouveau_user_buffer_create(struct pipe_screen *pscreen, void *ptr, return &buffer->base; } +/* Like download, but for GART buffers. Merge ? */ static INLINE boolean nouveau_buffer_data_fetch(struct nouveau_context *nv, struct nv04_resource *buf, struct nouveau_bo *bo, unsigned offset, unsigned size) { - if (!nouveau_buffer_malloc(buf)) - return FALSE; + if (!buf->data) { + buf->data = MALLOC(size); + if (!buf->data) + return FALSE; + } if (nouveau_bo_map(bo, NOUVEAU_BO_RD, nv->client)) return FALSE; memcpy(buf->data, (uint8_t *)bo->map + offset, size); + return TRUE; } diff --git a/src/gallium/drivers/nouveau/nouveau_winsys.h b/src/gallium/drivers/nouveau/nouveau_winsys.h index 6d47f47..faaa524 100644 --- a/src/gallium/drivers/nouveau/nouveau_winsys.h +++ b/src/gallium/drivers/nouveau/nouveau_winsys.h @@ -12,8 +12,6 @@ #define NV04_PFIFO_MAX_PACKET_LEN 2047 #endif -#define NOUVEAU_MIN_BUFFER_MAP_ALIGN 64 - static INLINE uint32_t PUSH_AVAIL(struct nouveau_pushbuf *push) { diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c index b6da303..1291083 100644 --- a/src/gallium/drivers/nv50/nv50_screen.c +++ b/src/gallium/drivers/nv50/nv50_screen.c @@ -177,7 +177,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: return 1; /* 256 for binding as RT, but that's not possible in GL */ case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: - return NOUVEAU_MIN_BUFFER_MAP_ALIGN; + return 64; case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c index 97ce82c..31fde4a 100644 --- a/src/gallium/drivers/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nvc0/nvc0_screen.c @@ -169,7 +169,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: return 1; /* 256 for binding as RT, but that's not possible in GL */ case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: - return NOUVEAU_MIN_BUFFER_MAP_ALIGN; + return 64; case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
