All HW buffers (also suballocated ones) are already aligned. Just make sure that also the initial sysram buffers have proper alignment.tags/gles3-fmt-v1
@@ -43,7 +43,7 @@ nouveau_buffer_allocate(struct nouveau_screen *screen, | |||
} | |||
if (domain != NOUVEAU_BO_GART) { | |||
if (!buf->data) { | |||
buf->data = MALLOC(buf->base.width0); | |||
buf->data = align_malloc(buf->base.width0, 64); | |||
if (!buf->data) | |||
return FALSE; | |||
} | |||
@@ -92,7 +92,7 @@ nouveau_buffer_destroy(struct pipe_screen *pscreen, | |||
nouveau_buffer_release_gpu_storage(res); | |||
if (res->data && !(res->status & NOUVEAU_BUFFER_STATUS_USER_MEMORY)) | |||
FREE(res->data); | |||
align_free(res->data); | |||
nouveau_fence_ref(NULL, &res->fence); | |||
nouveau_fence_ref(NULL, &res->fence_wr); | |||
@@ -457,7 +457,7 @@ nouveau_buffer_migrate(struct nouveau_context *nv, | |||
if (ret) | |||
return ret; | |||
memcpy((uint8_t *)buf->bo->map + buf->offset, buf->data, size); | |||
FREE(buf->data); | |||
align_free(buf->data); | |||
} else | |||
if (old_domain != 0 && new_domain != 0) { | |||
struct nouveau_mm_allocation *mm = buf->mm; |
@@ -9,7 +9,7 @@ | |||
#include "nouveau_screen.h" | |||
#include "nouveau_mm.h" | |||
#define MM_MIN_ORDER 7 | |||
#define MM_MIN_ORDER 7 /* >= 6 to not violate ARB_map_buffer_alignment */ | |||
#define MM_MAX_ORDER 20 | |||
#define MM_NUM_BUCKETS (MM_MAX_ORDER - MM_MIN_ORDER + 1) |
@@ -170,11 +170,12 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) | |||
return 1; | |||
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: | |||
return 256; | |||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: | |||
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: | |||
case PIPE_CAP_TEXTURE_MULTISAMPLE: | |||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: | |||
return 0; | |||
default: | |||
NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); |
@@ -148,11 +148,12 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) | |||
return 1; | |||
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: | |||
return 256; | |||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: | |||
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: | |||
case PIPE_CAP_TEXTURE_MULTISAMPLE: | |||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: | |||
return 0; | |||
default: | |||
NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); |