[Mesa-dev] [PATCH 14/16] anv: Advertise both 32-bit and 48-bit heaps when we have enough memory

Jason Ekstrand jason at jlekstrand.net
Fri May 19 17:53:12 UTC 2017


On Thu, May 18, 2017 at 2:01 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:

> ---
>  src/intel/vulkan/anv_device.c | 42 ++++++++++++++++++++++++++++++
> ++++++------
>  1 file changed, 36 insertions(+), 6 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
> index 6ea8dfe..8eed7f3 100644
> --- a/src/intel/vulkan/anv_device.c
> +++ b/src/intel/vulkan/anv_device.c
> @@ -112,12 +112,42 @@ anv_physical_device_init_heaps(struct
> anv_physical_device *device, int fd)
>     if (result != VK_SUCCESS)
>        return result;
>
> -   device->memory.heap_count = 1;
> -   device->memory.heaps[0] = (struct anv_memory_heap) {
> -      .size = heap_size,
> -      .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
> -      .supports_48bit_addresses = device->supports_48bit_addresses,
> -   };
> +   if (heap_size <= 3ull * (1ull << 30)) {
> +      /* In this case, everything fits nicely into the 32-bit address
> space,
> +       * so there's no need for supporting 48bit addresses on
> clinet-allocated
> +       * memory objects.
> +       */
> +      device->memory.heap_count = 1;
> +      device->memory.heaps[0] = (struct anv_memory_heap) {
> +         .size = heap_size,
> +         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
> +         .supports_48bit_addresses = false,
> +      };
> +   } else {
> +      /* Not everything will fit nicely into a 32-bit address space.  In
> this
> +       * case we need a 64-bit heap.  Advertise a small 32-bit heap and a
> +       * larger 48-bit heap.  If we're in this case, then we have a total
> heap
> +       * size larger than 3GiB which most likely means they have 8 GiB of
> +       * video memory and so carving off 2 GiB for the 32-bit heap should
> be
> +       * reasonable.
> +       */
> +      const uint32_t heap_size_32bit = 2ull * (1ull << 30);
>

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?


> +      const uint32_t heap_size_48bit = heap_size - heap_size_32bit;
> +
> +      assert(device->supports_48bit_addresses);
> +
> +      device->memory.heap_count = 2;
> +      device->memory.heaps[0] = (struct anv_memory_heap) {
> +         .size = heap_size_48bit,
> +         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
> +         .supports_48bit_addresses = true,
> +      };
> +      device->memory.heaps[1] = (struct anv_memory_heap) {
> +         .size = heap_size_32bit,
> +         .flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT,
> +         .supports_48bit_addresses = false,
> +      };
> +   }
>
>     uint32_t type_count = 0;
>     for (uint32_t heap = 0; heap < device->memory.heap_count; heap++) {
> --
> 2.5.0.400.gff86faf
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170519/4d610d6e/attachment-0001.html>


More information about the mesa-dev mailing list