<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>