nv50,nvc0: expose ARB_map_buffer_alignment
authorLucas Stach <dev@lynxeye.de>
Wed, 31 Oct 2012 15:31:12 +0000 (16:31 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 4 Nov 2012 11:33:38 +0000 (12:33 +0100)
All HW buffers (also suballocated ones) are already aligned.
Just make sure that also the initial sysram buffers have proper
alignment.

src/gallium/drivers/nouveau/nouveau_buffer.c
src/gallium/drivers/nouveau/nouveau_mm.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nvc0/nvc0_screen.c

index fb929d6823171da4aa0f9c4c6ae5d3ec68a5d0fd..0ecd53af67c75e0763f5eb3b4c146cfc8ef96a60 100644 (file)
@@ -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;
index 4207084aecf5a6739c5b4defd8f0579459b1eed8..6045af6ee00e1288505f51280d3b6257d400f923 100644 (file)
@@ -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)
index 9461af92556d1e76a9b9be7a65aeb6875d769dfc..d0a0295746f5aef1b7830c102a3438663085305b 100644 (file)
@@ -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);
index 0e0b6661b6933c90ed74913a6a27fcedd7c7a6a3..3bf21913a89c8d149fbba2c44df2c3bcc61ff27f 100644 (file)
@@ -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);