<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, May 18, 2017 at 2:01 PM, Jason Ekstrand <span dir="ltr"><<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
 src/intel/vulkan/anv_device.c | 42 ++++++++++++++++++++++++++++++<wbr>++++++------<br>
 1 file changed, 36 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_device.<wbr>c b/src/intel/vulkan/anv_device.<wbr>c<br>
index 6ea8dfe..8eed7f3 100644<br>
--- a/src/intel/vulkan/anv_device.<wbr>c<br>
+++ b/src/intel/vulkan/anv_device.<wbr>c<br>
@@ -112,12 +112,42 @@ anv_physical_device_init_<wbr>heaps(struct anv_physical_device *device, int fd)<br>
    if (result != VK_SUCCESS)<br>
       return result;<br>
<br>
-   device->memory.heap_count = 1;<br>
-   device->memory.heaps[0] = (struct anv_memory_heap) {<br>
-      .size = heap_size,<br>
-      .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_<wbr>BIT,<br>
-      .supports_48bit_addresses = device->supports_48bit_<wbr>addresses,<br>
-   };<br>
+   if (heap_size <= 3ull * (1ull << 30)) {<br>
+      /* In this case, everything fits nicely into the 32-bit address space,<br>
+       * so there's no need for supporting 48bit addresses on clinet-allocated<br>
+       * memory objects.<br>
+       */<br>
+      device->memory.heap_count = 1;<br>
+      device->memory.heaps[0] = (struct anv_memory_heap) {<br>
+         .size = heap_size,<br>
+         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_<wbr>BIT,<br>
+         .supports_48bit_addresses = false,<br>
+      };<br>
+   } else {<br>
+      /* Not everything will fit nicely into a 32-bit address space.  In this<br>
+       * case we need a 64-bit heap.  Advertise a small 32-bit heap and a<br>
+       * larger 48-bit heap.  If we're in this case, then we have a total heap<br>
+       * size larger than 3GiB which most likely means they have 8 GiB of<br>
+       * video memory and so carving off 2 GiB for the 32-bit heap should be<br>
+       * reasonable.<br>
+       */<br>
+      const uint32_t heap_size_32bit = 2ull * (1ull << 30);<br></blockquote><div><br></div><div>FYI: I keep waflling on whether the 32-bit carve-out should be 2 GiB or 1 GiB.  No one should need more than 1 GiB for vertex buffers and it means that, on my laptop, the space is split roughly in half (2 GiB and ~3 GiB) which is a bit awkward.  I'm kind-of inclined to decrease it.  Opinions?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      const uint32_t heap_size_48bit = heap_size - heap_size_32bit;<br>
+<br>
+      assert(device->supports_48bit_<wbr>addresses);<br>
+<br>
+      device->memory.heap_count = 2;<br>
+      device->memory.heaps[0] = (struct anv_memory_heap) {<br>
+         .size = heap_size_48bit,<br>
+         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_<wbr>BIT,<br>
+         .supports_48bit_addresses = true,<br>
+      };<br>
+      device->memory.heaps[1] = (struct anv_memory_heap) {<br>
+         .size = heap_size_32bit,<br>
+         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_<wbr>BIT,<br>
+         .supports_48bit_addresses = false,<br>
+      };<br>
+   }<br>
<br>
    uint32_t type_count = 0;<br>
    for (uint32_t heap = 0; heap < device->memory.heap_count; heap++) {<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0.400.gff86faf<br>
<br>
</font></span></blockquote></div><br></div></div>