| // Copyright (c) 2016-2020 NVIDIA Corporation |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_NV_dedicated_allocation.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2016-05-31 |
| *IP Status*:: |
| No known IP claims. |
| *Contributors*:: |
| - Jeff Bolz, NVIDIA |
| |
| === Description |
| |
| This extension allows device memory to be allocated for a particular buffer |
| or image resource, which on some devices can significantly improve the |
| performance of that resource. |
| Normal device memory allocations must support memory aliasing and sparse |
| binding, which could interfere with optimizations like framebuffer |
| compression or efficient page table usage. |
| This is important for render targets and very large resources, but need not |
| (and probably should not) be used for smaller resources that can benefit |
| from suballocation. |
| |
| This extension adds a few small structures to resource creation and memory |
| allocation: a new structure that flags whether am image/buffer will have a |
| dedicated allocation, and a structure indicating the image or buffer that an |
| allocation will be bound to. |
| |
| include::{generated}/interfaces/VK_NV_dedicated_allocation.txt[] |
| |
| === Examples |
| |
| [source,c++] |
| -------------------------------------- |
| |
| // Create an image with |
| // VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation |
| // set to VK_TRUE |
| |
| VkDedicatedAllocationImageCreateInfoNV dedicatedImageInfo = |
| { |
| VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV, // sType |
| NULL, // pNext |
| VK_TRUE, // dedicatedAllocation |
| }; |
| |
| VkImageCreateInfo imageCreateInfo = |
| { |
| VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // sType |
| &dedicatedImageInfo // pNext |
| // Other members set as usual |
| }; |
| |
| VkImage image; |
| VkResult result = vkCreateImage( |
| device, |
| &imageCreateInfo, |
| NULL, // pAllocator |
| &image); |
| |
| VkMemoryRequirements memoryRequirements; |
| vkGetImageMemoryRequirements( |
| device, |
| image, |
| &memoryRequirements); |
| |
| // Allocate memory with VkDedicatedAllocationMemoryAllocateInfoNV::image |
| // pointing to the image we are allocating the memory for |
| |
| VkDedicatedAllocationMemoryAllocateInfoNV dedicatedInfo = |
| { |
| VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, // sType |
| NULL, // pNext |
| image, // image |
| VK_NULL_HANDLE, // buffer |
| }; |
| |
| VkMemoryAllocateInfo memoryAllocateInfo = |
| { |
| VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // sType |
| &dedicatedInfo, // pNext |
| memoryRequirements.size, // allocationSize |
| FindMemoryTypeIndex(memoryRequirements.memoryTypeBits), // memoryTypeIndex |
| }; |
| |
| VkDeviceMemory memory; |
| vkAllocateMemory( |
| device, |
| &memoryAllocateInfo, |
| NULL, // pAllocator |
| &memory); |
| |
| // Bind the image to the memory |
| |
| vkBindImageMemory( |
| device, |
| image, |
| memory, |
| 0); |
| |
| -------------------------------------- |
| |
| === Version History |
| |
| * Revision 1, 2016-05-31 (Jeff Bolz) |
| - Internal revisions |