gallium/radeon: enable suballocations for VRAM with no CPU access
authorMarek Olšák <marek.olsak@amd.com>
Thu, 29 Jun 2017 16:33:05 +0000 (18:33 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 4 Jul 2017 13:40:37 +0000 (15:40 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/r600_buffer_common.c
src/gallium/drivers/radeon/radeon_winsys.h
src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
src/gallium/winsys/radeon/drm/radeon_drm_bo.c

index 262fe1db836df4efb57ae1d51713ae0a18b39484..4bf293daf27ecf6a18cdd96afcc64bc408107ab7 100644 (file)
@@ -176,8 +176,10 @@ void r600_init_resource_fields(struct r600_common_screen *rscreen,
         */
        if (!rscreen->info.has_dedicated_vram &&
            (rscreen->info.drm_major < 3 || rscreen->info.drm_minor < 6) &&
-           res->domains == RADEON_DOMAIN_VRAM)
+           res->domains == RADEON_DOMAIN_VRAM) {
                res->domains = RADEON_DOMAIN_VRAM_GTT;
+               res->flags &= ~RADEON_FLAG_NO_CPU_ACCESS; /* disallowed with VRAM_GTT */
+       }
 
        if (rscreen->debug_flags & DBG_NO_WC)
                res->flags &= ~RADEON_FLAG_GTT_WC;
index 95543bb2086a4f829f45fffdec187de618edd34c..4ecd73f01dca1f226474fadad1923fefd7340304 100644 (file)
@@ -659,6 +659,7 @@ static inline void radeon_emit_array(struct radeon_winsys_cs *cs,
 }
 
 enum radeon_heap {
+    RADEON_HEAP_VRAM_NO_CPU_ACCESS,
     RADEON_HEAP_VRAM,
     RADEON_HEAP_VRAM_GTT, /* combined heaps */
     RADEON_HEAP_GTT_WC,
@@ -669,6 +670,7 @@ enum radeon_heap {
 static inline enum radeon_bo_domain radeon_domain_from_heap(enum radeon_heap heap)
 {
     switch (heap) {
+    case RADEON_HEAP_VRAM_NO_CPU_ACCESS:
     case RADEON_HEAP_VRAM:
         return RADEON_DOMAIN_VRAM;
     case RADEON_HEAP_VRAM_GTT:
@@ -685,6 +687,8 @@ static inline enum radeon_bo_domain radeon_domain_from_heap(enum radeon_heap hea
 static inline unsigned radeon_flags_from_heap(enum radeon_heap heap)
 {
     switch (heap) {
+    case RADEON_HEAP_VRAM_NO_CPU_ACCESS:
+        return RADEON_FLAG_GTT_WC | RADEON_FLAG_NO_CPU_ACCESS;
     case RADEON_HEAP_VRAM:
     case RADEON_HEAP_VRAM_GTT:
     case RADEON_HEAP_GTT_WC:
@@ -701,14 +705,19 @@ static inline int radeon_get_heap_index(enum radeon_bo_domain domain,
 {
     /* VRAM implies WC (write combining) */
     assert(!(domain & RADEON_DOMAIN_VRAM) || flags & RADEON_FLAG_GTT_WC);
+    /* NO_CPU_ACCESS implies VRAM only. */
+    assert(!(flags & RADEON_FLAG_NO_CPU_ACCESS) || domain == RADEON_DOMAIN_VRAM);
 
-    /* Unsupported flags: NO_CPU_ACCESS, NO_SUBALLOC, SPARSE. */
-    if (flags & ~RADEON_FLAG_GTT_WC)
+    /* Unsupported flags: NO_SUBALLOC, SPARSE. */
+    if (flags & ~(RADEON_FLAG_GTT_WC | RADEON_FLAG_NO_CPU_ACCESS))
         return -1;
 
     switch (domain) {
     case RADEON_DOMAIN_VRAM:
-        return RADEON_HEAP_VRAM;
+        if (flags & RADEON_FLAG_NO_CPU_ACCESS)
+            return RADEON_HEAP_VRAM_NO_CPU_ACCESS;
+        else
+            return RADEON_HEAP_VRAM;
     case RADEON_DOMAIN_VRAM_GTT:
         return RADEON_HEAP_VRAM_GTT;
     case RADEON_DOMAIN_GTT:
index d99081c436afc7cced142826e738b8cc0e832070..8e1bc8ed987aedea33fef3a580b8e11f169e4c58 100644 (file)
@@ -1138,6 +1138,9 @@ amdgpu_bo_create(struct radeon_winsys *rws,
    /* VRAM implies WC. This is not optional. */
    assert(!(domain & RADEON_DOMAIN_VRAM) || flags & RADEON_FLAG_GTT_WC);
 
+   /* NO_CPU_ACCESS is valid with VRAM only. */
+   assert(domain == RADEON_DOMAIN_VRAM || !(flags & RADEON_FLAG_NO_CPU_ACCESS));
+
    /* Sub-allocate small buffers from slabs. */
    if (!(flags & (RADEON_FLAG_NO_SUBALLOC | RADEON_FLAG_SPARSE)) &&
        size <= (1 << AMDGPU_SLAB_MAX_SIZE_LOG2) &&
index c516df05d8ef75df47649b74add499d6b029a4d6..91f09b9f5d6c0f946283623d5676b1fd2dad07e8 100644 (file)
@@ -925,6 +925,9 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
     /* VRAM implies WC. This is not optional. */
     if (domain & RADEON_DOMAIN_VRAM)
         flags |= RADEON_FLAG_GTT_WC;
+    /* NO_CPU_ACCESS is valid with VRAM only. */
+    if (domain != RADEON_DOMAIN_VRAM)
+        flags &= ~RADEON_FLAG_NO_CPU_ACCESS;
 
     /* Sub-allocate small buffers from slabs. */
     if (!(flags & RADEON_FLAG_NO_SUBALLOC) &&