From 976f920c158cb5e8982030091c7fff3fbf542354 Mon Sep 17 00:00:00 2001 From: Adam Sawicki Date: Tue, 12 Sep 2017 20:45:14 +0200 Subject: [PATCH] Version 2.0.0-alpha.3 - major update. --- bin/VulkanSample_Release_2015.exe | Bin 88064 -> 96768 bytes docs/html/annotated.html | 18 +- docs/html/classes.html | 6 +- docs/html/functions.html | 68 +- docs/html/functions_vars.html | 68 +- docs/html/globals.html | 99 +- docs/html/globals_enum.html | 9 +- docs/html/globals_eval.html | 39 +- docs/html/globals_func.html | 30 +- docs/html/globals_type.html | 30 +- docs/html/group__general.html | 34 + docs/html/group__layer1.html | 117 +- docs/html/group__layer2.html | 414 +- docs/html/group__layer3.html | 32 +- docs/html/index.html | 203 +- docs/html/search/all_0.js | 5 +- docs/html/search/all_1.js | 2 + docs/html/search/all_3.js | 3 +- docs/html/search/all_6.js | 5 +- docs/html/search/all_8.js | 5 +- docs/html/search/all_9.js | 2 +- docs/html/search/all_a.js | 6 +- docs/html/search/all_c.js | 5 +- docs/html/search/all_d.js | 41 +- docs/html/search/classes_0.js | 4 +- docs/html/search/enums_0.js | 5 +- docs/html/search/enumvalues_0.js | 15 +- docs/html/search/functions_0.js | 18 +- docs/html/search/typedefs_1.js | 10 +- docs/html/search/variables_0.js | 5 +- docs/html/search/variables_1.js | 2 + docs/html/search/variables_3.js | 3 +- docs/html/search/variables_4.js | 5 +- docs/html/search/variables_6.js | 5 +- docs/html/search/variables_7.js | 2 +- docs/html/search/variables_8.js | 6 +- docs/html/search/variables_a.js | 5 +- ...ct_vma_allocation_create_info-members.html | 82 + .../struct_vma_allocation_create_info.html | 208 + docs/html/struct_vma_allocation_info.html | 17 +- ...uct_vma_allocator_create_info-members.html | 11 +- .../struct_vma_allocator_create_info.html | 30 +- .../html/struct_vma_defragmentation_info.html | 4 +- .../struct_vma_defragmentation_stats.html | 8 +- .../struct_vma_pool_create_info-members.html | 82 + docs/html/struct_vma_pool_create_info.html | 212 + docs/html/struct_vma_pool_stats-members.html | 80 + docs/html/struct_vma_pool_stats.html | 167 + docs/html/struct_vma_stat_info-members.html | 8 +- docs/html/struct_vma_stat_info.html | 55 +- docs/html/vk__mem__alloc_8h.html | 114 +- docs/html/vk__mem__alloc_8h_source.html | 181 +- src/VulkanSample.cpp | 49 +- src/vk_mem_alloc.h | 4083 ++++++++++++----- 54 files changed, 5196 insertions(+), 1521 deletions(-) create mode 100644 docs/html/struct_vma_allocation_create_info-members.html create mode 100644 docs/html/struct_vma_allocation_create_info.html create mode 100644 docs/html/struct_vma_pool_create_info-members.html create mode 100644 docs/html/struct_vma_pool_create_info.html create mode 100644 docs/html/struct_vma_pool_stats-members.html create mode 100644 docs/html/struct_vma_pool_stats.html diff --git a/bin/VulkanSample_Release_2015.exe b/bin/VulkanSample_Release_2015.exe index c213b25c77969a61f888231aa7691a2b4e9ecae2..4eb1623491e2eab28235c662c76001e3e5888d8f 100644 GIT binary patch literal 96768 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

{mpMGcb&zTK1B8 z7*yqt@N7;{4IK>~-xgFSLoe+Ms?)IQd$BCW!@pFtio$3uqFv5GM8HSEvK&Pky*()G zR1+mfgXPDWCH<(8E)T^G1j|k^%LY=5D3OBYr`#+sXg7yuCbfpod-?*uy+^$Gtu-ZVQ*in8I<;7H9)~`o7aQ>#0;Rp68mr$-S z{3+>jpCQ|P_9b~Twr>G@#2KK#qYf=;?`1$bW=MD*q8)mU2O}S6aRc4oyVZ zu_T(?Y{#4F3337Qm>{8(=@FQFIP7k~aBqi~H zI#$7_qGXS6eLm(XT3VG0durq++(lU_E})O9^kFCw0WT;SxKH8i~j;VKXUxnyC>lj6G^Y55vp^ce}c{6!wGvS4C(vd;bfGb=-!gkrFUmC%nc4You79O-^hvj13jw z0tUHF|KKSm^Vsp#8OQhhd>`U7DEQbb3s~@<$_U02oq^_q2rcaPMc;)6d@H04`t^8m z=WfyqK0J>r#YjOTmlJ_Dght%0D`h#-9m@&7SV78)9{Ymvych?i2!tdV4vHOqD^>&% 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

DWOOF8|$>K(y*})VyzIcLq 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 CRgNJ5 literal 88064 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 +$s0gD0i7i? zMP$~ei_EGtky(%`GW~X+#g;5=^`nFhX|?62`7G&Hk^V$Ve{ye9Pl88?sb{5%vl^`; z=c9CSdN51a>oY}4!FbU-MTpN~2Bi$C5C{brGy*gNG$M}1f@=?>^R0u4H3=S>j)D~7 zISmKtVBBXQ9g~y9czD3WklAuNbz&E%*W1MD1!KhN{_MdC{h7Vvdh8y{ zgk&+Hk!5I%NWC@LGj&apSQE@Z{-q1&G$B^Q6y{KF!~?t;H)(RRNb`^CxB8N555NoyMlemBR-Y;+RgFfON@1DrXPMs|SLW@w1IKdxDImY; zvvfU~Y8B%x<3vhta!(S<8`D|?|EZI}^P@2$>usAD3mvD{j}=J;6ND4tHo??PS9xxB zkEJ|SW04mu|FX{XjP|9}P@Yv<9@&q9|IT;uk017NDA!N)e$Ej<*27!Sf)KCU1J9&s zsbU)P?o`yBY}B39%H+YM{sbR+=YjVgO+Q|@G8X_c{MgxPVs^n)G1ZbSCJbiwkL$Jf zsMbTZ87W$>e#k?5iu7e5+Yp0}VeIpj`*}cq-Kg-$J+T{*bYm%h!9+3P!EuB3{xQAj zJ*mFYH7Op--=C@4r$H?PdD|DLaKq@C8npH&`Vwl8Uo1lf z>7obz@55xzK>lPViOeUHg|#X};<6TDOhPVtuF3zkUBc>wGDTs4SW$K`A z^(5cz;L9%$D;A``#wnfRc0d{4kqVi{h*JtOL`LQ4LDbeBYJ&P~)H2ykGSw_r;rami zZ75dqd<&5LCY_Teatfx%x*%I_nL@UfLi`MM!U>)?ARK8OCcbpfg4(L93Wh zpCl$!C5j0J31UJ&cqO6Vou(mlYVL;*gP)^H#Uttd0ROW`LBETk-$f$H7uD+y(7uGM zrc55Bf!|s{=6<7g6VjhB3HTr&=jEFL`*l23ax{uCfDF3<5Iu`{50GK*T&co52*`T* zsdfi0RsIdDv|i?<2}dwrIO^vKM?s!&SZ0aL!Eya|=$vh%2h1m}Jw+_-n=OhD&k+~w zohugX&JzW9%oB6B<%_R%%ok@i7KmwYw~1-NR3ZpRT$ZaVSK_qZ1eR( z{5y;|6K#m>vr?qH_Up(C>6Xcs9Nc{>Qmy!{-I~_es)OlD+T0tIUseb#&I@`G|m;hw;=p>>fg~2R~Vl)*0=5 zvKYJ#za;P-q#64_a;$*-iN!%bCYnjpM~R8SGsMJ#X=0+qA=0!=gXEo(BvSHat<018 zigB;=ZXs@ish9jkjC(A`ieoD?eCai5d2DY{sih9`pnras12VsS8eR|BdymqS{a#5T z<^qzY77%I?-vgwcj{r)2%JIMK=WA418!fQcDE7k)X_?G!OIC`=!Wc3Oei{c1c{h_EaJdk~IL&ewXB{i^*sJRr-@ zen8S#ZcGt3R&g#Bk=bWipCZ=B-ZTH zc@r`⪚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 YR diff --git a/docs/html/annotated.html b/docs/html/annotated.html index 20a707d..1872afc 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -64,14 +64,16 @@ $(function() {

diff --git a/docs/html/classes.html b/docs/html/classes.html index 67a1270..ac33cf4 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -65,9 +65,9 @@ $(function() { - - + + +
  v  
-
VmaAllocatorCreateInfo   VmaDefragmentationStats   VmaMemoryRequirements   VmaStats   
VmaDefragmentationInfo   VmaDeviceMemoryCallbacks   VmaStatInfo   
VmaAllocationInfo   
VmaAllocationInfo   VmaDefragmentationStats   VmaPoolStats   
VmaAllocatorCreateInfo   VmaDeviceMemoryCallbacks   VmaStatInfo   
VmaAllocationCreateInfo   VmaDefragmentationInfo   VmaPoolCreateInfo   VmaStats   
diff --git a/docs/html/functions.html b/docs/html/functions.html index a924d1f..0c91a0c 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -61,9 +61,21 @@ $(function() {
Here is a list of all class members with links to the classes they belong to:

- a -

- r -

@@ -170,18 +205,7 @@ $(function() {

- s -

@@ -197,6 +221,9 @@ $(function() {
  • UnusedBytes : VmaStatInfo
  • +
  • unusedRangeCount +: VmaPoolStats +
  • UnusedRangeCount : VmaStatInfo
  • @@ -209,8 +236,11 @@ $(function() {
  • UnusedRangeSizeMin : VmaStatInfo
  • +
  • unusedSize +: VmaPoolStats +
  • usage -: VmaMemoryRequirements +: VmaAllocationCreateInfo
  • UsedBytes : VmaStatInfo diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index e09f776..5bdd9e8 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -61,9 +61,21 @@ $(function() {  

    - a -

    - r -

    @@ -170,18 +205,7 @@ $(function() {

    - s -

    @@ -197,6 +221,9 @@ $(function() {
  • UnusedBytes : VmaStatInfo
  • +
  • unusedRangeCount +: VmaPoolStats +
  • UnusedRangeCount : VmaStatInfo
  • @@ -209,8 +236,11 @@ $(function() {
  • UnusedRangeSizeMin : VmaStatInfo
  • +
  • unusedSize +: VmaPoolStats +
  • usage -: VmaMemoryRequirements +: VmaAllocationCreateInfo
  • UsedBytes : VmaStatInfo diff --git a/docs/html/globals.html b/docs/html/globals.html index 7eaee9e..8479115 100644 --- a/docs/html/globals.html +++ b/docs/html/globals.html @@ -71,24 +71,30 @@ $(function() {

    - v -

      +
    • VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT +: vk_mem_alloc.h +
    • +
    • VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT +: vk_mem_alloc.h +
    • +
    • VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM +: vk_mem_alloc.h +
    • +
    • VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT +: vk_mem_alloc.h +
    • +
    • VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT +: vk_mem_alloc.h +
    • +
    • VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT +: vk_mem_alloc.h +
    • VMA_ALLOCATOR_EXTERNALLY_SYNCHRONIZED_BIT : vk_mem_alloc.h
    • VMA_ALLOCATOR_FLAG_BITS_MAX_ENUM : vk_mem_alloc.h
    • -
    • VMA_MEMORY_REQUIREMENT_FLAG_BITS_MAX_ENUM -: vk_mem_alloc.h -
    • -
    • VMA_MEMORY_REQUIREMENT_NEVER_ALLOCATE_BIT -: vk_mem_alloc.h -
    • -
    • VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT -: vk_mem_alloc.h -
    • -
    • VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT -: vk_mem_alloc.h -
    • VMA_MEMORY_USAGE_CPU_ONLY : vk_mem_alloc.h
    • @@ -107,17 +113,35 @@ $(function() {
    • VMA_MEMORY_USAGE_UNKNOWN : vk_mem_alloc.h
    • +
    • VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM +: vk_mem_alloc.h +
    • +
    • VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT +: vk_mem_alloc.h +
    • +
    • VMA_POOL_CREATE_PERSISTENT_MAP_BIT +: vk_mem_alloc.h +
    • VMA_STATS_STRING_ENABLED : vk_mem_alloc.h
    • vmaAllocateMemory() -: vk_mem_alloc.h +: vk_mem_alloc.h
    • vmaAllocateMemoryForBuffer() -: vk_mem_alloc.h +: vk_mem_alloc.h
    • vmaAllocateMemoryForImage() -: vk_mem_alloc.h +: vk_mem_alloc.h +
    • +
    • VmaAllocationCreateFlagBits +: vk_mem_alloc.h +
    • +
    • VmaAllocationCreateFlags +: vk_mem_alloc.h +
    • +
    • VmaAllocationCreateInfo +: vk_mem_alloc.h
    • VmaAllocationInfo : vk_mem_alloc.h @@ -141,10 +165,16 @@ $(function() { : vk_mem_alloc.h
    • vmaCreateBuffer() -: vk_mem_alloc.h +: vk_mem_alloc.h
    • vmaCreateImage() -: vk_mem_alloc.h +: vk_mem_alloc.h +
    • +
    • vmaCreateLostAllocation() +: vk_mem_alloc.h +
    • +
    • vmaCreatePool() +: vk_mem_alloc.h
    • vmaDefragment() : vk_mem_alloc.h @@ -164,11 +194,14 @@ $(function() {
    • vmaDestroyImage() : vk_mem_alloc.h
    • +
    • vmaDestroyPool() +: vk_mem_alloc.h +
    • VmaDeviceMemoryCallbacks : vk_mem_alloc.h
    • vmaFindMemoryTypeIndex() -: vk_mem_alloc.h +: vk_mem_alloc.h
    • vmaFreeMemory() : vk_mem_alloc.h @@ -188,27 +221,39 @@ $(function() {
    • vmaGetPhysicalDeviceProperties() : vk_mem_alloc.h
    • +
    • vmaGetPoolStats() +: vk_mem_alloc.h +
    • +
    • vmaMakePoolAllocationsLost() +: vk_mem_alloc.h +
    • vmaMapMemory() : vk_mem_alloc.h
    • vmaMapPersistentlyMappedMemory() : vk_mem_alloc.h
    • -
    • VmaMemoryRequirementFlagBits -: vk_mem_alloc.h -
    • -
    • VmaMemoryRequirementFlags -: vk_mem_alloc.h -
    • -
    • VmaMemoryRequirements -: vk_mem_alloc.h -
    • VmaMemoryUsage : vk_mem_alloc.h
    • +
    • VmaPoolCreateFlagBits +: vk_mem_alloc.h +
    • +
    • VmaPoolCreateFlags +: vk_mem_alloc.h +
    • +
    • VmaPoolCreateInfo +: vk_mem_alloc.h +
    • +
    • VmaPoolStats +: vk_mem_alloc.h +
    • vmaSetAllocationUserData() : vk_mem_alloc.h
    • +
    • vmaSetCurrentFrameIndex() +: vk_mem_alloc.h +
    • VmaStatInfo : vk_mem_alloc.h
    • diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html index e8d4941..0589833 100644 --- a/docs/html/globals_enum.html +++ b/docs/html/globals_enum.html @@ -59,15 +59,18 @@ $(function() {
       
      diff --git a/docs/html/globals_eval.html b/docs/html/globals_eval.html index 4fad40c..8c6790b 100644 --- a/docs/html/globals_eval.html +++ b/docs/html/globals_eval.html @@ -59,24 +59,30 @@ $(function() {
       
      diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html index fca5d30..06ec566 100644 --- a/docs/html/globals_func.html +++ b/docs/html/globals_func.html @@ -60,13 +60,13 @@ $(function() {
       

      PhysicalDeviceProperties are fetched from physicalDevice by the allocator. You can access it here, without fetching it again on your own.

      +
      + + +

      ◆ vmaSetCurrentFrameIndex()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void vmaSetCurrentFrameIndex (VmaAllocator allocator,
      uint32_t frameIndex 
      )
      +
      + +

      Sets index of the current frame.

      +

      This function must be used if you make allocations with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT and VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flags to inform the allocator when a new frame begins. Allocations queried using vmaGetAllocationInfo() cannot become lost in the current frame.

      +
      diff --git a/docs/html/group__layer1.html b/docs/html/group__layer1.html index 80652d9..c58e442 100644 --- a/docs/html/group__layer1.html +++ b/docs/html/group__layer1.html @@ -70,20 +70,20 @@ $(function() { - +

      Classes

      struct  VmaMemoryRequirements
      struct  VmaAllocationCreateInfo
       
      - - - - - - - + + + + + + +

      Typedefs

      typedef enum VmaMemoryUsage VmaMemoryUsage
       
      typedef enum VmaMemoryRequirementFlagBits VmaMemoryRequirementFlagBits
       Flags to be passed as VmaMemoryRequirements::flags. More...
       
      typedef VkFlags VmaMemoryRequirementFlags
       
      typedef struct VmaMemoryRequirements VmaMemoryRequirements
       
      typedef enum VmaAllocationCreateFlagBits VmaAllocationCreateFlagBits
       Flags to be passed as VmaAllocationCreateInfo::flags. More...
       
      typedef VkFlags VmaAllocationCreateFlags
       
      typedef struct VmaAllocationCreateInfo VmaAllocationCreateInfo
       
      @@ -98,59 +98,64 @@ Enumerations
      } - + - +

      Enumerations

       
      enum  VmaMemoryRequirementFlagBits { VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT = 0x00000001, -VMA_MEMORY_REQUIREMENT_NEVER_ALLOCATE_BIT = 0x00000002, -VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT = 0x00000004, -VMA_MEMORY_REQUIREMENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF - }
       Flags to be passed as VmaMemoryRequirements::flags. More...
      enum  VmaAllocationCreateFlagBits {
      +  VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT = 0x00000001, +VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT = 0x00000002, +VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT = 0x00000004, +VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT = 0x00000008, +
      +  VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT = 0x00000010, +VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +
      + }
       Flags to be passed as VmaAllocationCreateInfo::flags. More...
       
       
      - - + +

      Functions

      VkResult vmaFindMemoryTypeIndex (VmaAllocator allocator, uint32_t memoryTypeBits, const VmaMemoryRequirements *pMemoryRequirements, uint32_t *pMemoryTypeIndex)
       
      VkResult vmaFindMemoryTypeIndex (VmaAllocator allocator, uint32_t memoryTypeBits, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)
       

      Detailed Description

      Typedef Documentation

      - -

      ◆ VmaMemoryRequirementFlagBits

      + +

      ◆ VmaAllocationCreateFlagBits

      - -

      ◆ VmaMemoryRequirementFlags

      + +

      ◆ VmaAllocationCreateFlags

      - +
      typedef VkFlags VmaMemoryRequirementFlagstypedef VkFlags VmaAllocationCreateFlags
      - -

      ◆ VmaMemoryRequirements

      + +

      ◆ VmaAllocationCreateInfo

      @@ -172,32 +177,42 @@ Functions

      Enumeration Type Documentation

      - -

      ◆ VmaMemoryRequirementFlagBits

      + +

      ◆ VmaAllocationCreateFlagBits

      -

      Flags to be passed as VmaMemoryRequirements::flags.

      +

      Flags to be passed as VmaAllocationCreateInfo::flags.

      - - - - + + +
      Enumerator
      VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT 

      Set this flag if the allocation should have its own memory block.

      +
      Enumerator
      VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT 

      Set this flag if the allocation should have its own memory block.

      Use it for special, big resources, like fullscreen images used as attachments.

      -

      This flag must also be used for host visible resources that you want to map simultaneously because otherwise they might end up as regions of the same VkDeviceMemory, while mapping same VkDeviceMemory multiple times is illegal.

      +

      This flag must also be used for host visible resources that you want to map simultaneously because otherwise they might end up as regions of the same VkDeviceMemory, while mapping same VkDeviceMemory multiple times simultaneously is illegal.

      +

      You should not use this flag if VmaAllocationCreateInfo::pool is not null.

      VMA_MEMORY_REQUIREMENT_NEVER_ALLOCATE_BIT 

      Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such block.

      -

      If new allocation cannot be placed in any of the existing blocks, allocation fails with VK_ERROR_OUT_OF_DEVICE_MEMORY error.

      -

      It makes no sense to set VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT and VMA_MEMORY_REQUIREMENT_NEVER_ALLOCATE_BIT at the same time.

      +
      VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT 

      Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such block.

      +

      If new allocation cannot be placed in any of the existing blocks, allocation fails with VK_ERROR_OUT_OF_DEVICE_MEMORY error.

      +

      You should not use VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT and VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT at the same time. It makes no sense.

      +

      If VmaAllocationCreateInfo::pool is not null, this flag is implied and ignored.

      VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT 

      Set to use a memory that will be persistently mapped and retrieve pointer to it.

      -

      Pointer to mapped memory will be returned through VmaAllocationInfo::pMappedData. You cannot map the memory on your own as multiple maps of a single VkDeviceMemory are illegal.

      +
      VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT 

      Set this flag to use a memory that will be persistently mapped and retrieve pointer to it.

      +

      Pointer to mapped memory will be returned through VmaAllocationInfo::pMappedData. You cannot map the memory on your own as multiple mappings of a single VkDeviceMemory are illegal.

      +

      If VmaAllocationCreateInfo::pool is not null, usage of this flag must match usage of flag VMA_POOL_CREATE_PERSISTENT_MAP_BIT used during pool creation.

      VMA_MEMORY_REQUIREMENT_FLAG_BITS_MAX_ENUM 
      VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT 

      Allocation created with this flag can become lost as a result of another allocation with VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag, so you must check it before use.

      +

      To check if allocation is not lost, call vmaGetAllocationInfo() and check if VmaAllocationInfo::deviceMemory is not VK_NULL_HANDLE.

      +

      For details about supporting lost allocations, see Lost Allocations chapter of User Guide on Main Page.

      +
      VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT 

      While creating allocation using this flag, other allocations that were created with flag VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT can become lost.

      +

      For details about supporting lost allocations, see Lost Allocations chapter of User Guide on Main Page.

      +
      VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM 
      @@ -216,16 +231,16 @@ Functions - - - -
      Enumerator
      VMA_MEMORY_USAGE_UNKNOWN 

      No intended memory usage specified.

      VMA_MEMORY_USAGE_GPU_ONLY 

      Memory will be used on device only, no need to be mapped on host.

      +
      VMA_MEMORY_USAGE_GPU_ONLY 

      Memory will be used on device only, so faster access from the device is preferred. No need to be mappable on host.

      VMA_MEMORY_USAGE_CPU_ONLY 

      Memory will be mapped on host. Could be used for transfer to device.

      -

      Guarantees to be HOST_VISIBLE and HOST_COHERENT.

      +
      VMA_MEMORY_USAGE_CPU_ONLY 

      Memory will be mapped on host. Could be used for transfer to/from device.

      +

      Guarantees to be HOST_VISIBLE and HOST_COHERENT.

      VMA_MEMORY_USAGE_CPU_TO_GPU 

      Memory will be used for frequent (dynamic) updates from host and reads on device.

      -

      Guarantees to be HOST_VISIBLE.

      +
      VMA_MEMORY_USAGE_CPU_TO_GPU 

      Memory will be used for frequent (dynamic) updates from host and reads on device (upload).

      +

      Guarantees to be HOST_VISIBLE.

      VMA_MEMORY_USAGE_GPU_TO_CPU 

      Memory will be used for writing on device and readback on host.

      -

      Guarantees to be HOST_VISIBLE.

      +
      VMA_MEMORY_USAGE_GPU_TO_CPU 

      Memory will be used for frequent writing on device and readback on host (download).

      +

      Guarantees to be HOST_VISIBLE.

      VMA_MEMORY_USAGE_MAX_ENUM 
      @@ -233,8 +248,8 @@ Functions

      Function Documentation

      - -

      ◆ vmaFindMemoryTypeIndex()

      + +

      ◆ vmaFindMemoryTypeIndex()

      @@ -254,8 +269,8 @@ Functions - const VmaMemoryRequirements *  - pMemoryRequirements, + const VmaAllocationCreateInfo *  + pAllocationCreateInfo, @@ -273,9 +288,9 @@ Functions

      This algorithm tries to find a memory type that:

      • Is allowed by memoryTypeBits.
      • -
      • Contains all the flags from pMemoryRequirements->requiredFlags.
      • +
      • Contains all the flags from pAllocationCreateInfo->requiredFlags.
      • Matches intended usage.
      • -
      • Has as many flags from pMemoryRequirements->preferredFlags as possible.
      • +
      • Has as many flags from pAllocationCreateInfo->preferredFlags as possible.
      Returns
      Returns VK_ERROR_FEATURE_NOT_PRESENT if not found. Receiving such result from this function or any other allocating function probably means that your device doesn't support any memory type with requested features for the specific type of resource you want to use it for. Please check parameters of your resource, like image layout (OPTIMAL versus LINEAR) or mip level count.
      diff --git a/docs/html/group__layer2.html b/docs/html/group__layer2.html index fb24f50..271bd8f 100644 --- a/docs/html/group__layer2.html +++ b/docs/html/group__layer2.html @@ -61,6 +61,7 @@ $(function() {
      Layer 2 Allocating Memory
      @@ -69,8 +70,14 @@ $(function() { + + + + + + - + @@ -81,8 +88,19 @@ Classes

      Classes

      struct  VmaPoolCreateInfo
       Describes parameter of created VmaPool. More...
       
      struct  VmaPoolStats
       Describes parameter of existing VmaPool. More...
       
      struct  VmaAllocationInfo
       Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). More...
       Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). More...
       
      struct  VmaDefragmentationInfo
       Optional configuration parameters to be passed to function vmaDefragment(). More...
      + + + + + + + + + + + - + @@ -91,18 +109,39 @@ Typedefs

      Typedefs

      typedef enum VmaPoolCreateFlagBits VmaPoolCreateFlagBits
       Flags to be passed as VmaPoolCreateInfo::flags. More...
       
      typedef VkFlags VmaPoolCreateFlags
       
      typedef struct VmaPoolCreateInfo VmaPoolCreateInfo
       Describes parameter of created VmaPool. More...
       
      typedef struct VmaPoolStats VmaPoolStats
       Describes parameter of existing VmaPool. More...
       
      typedef struct VmaAllocationInfo VmaAllocationInfo
       Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). More...
       Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). More...
       
      typedef struct VmaDefragmentationInfo VmaDefragmentationInfo
       Optional configuration parameters to be passed to function vmaDefragment(). More...
       Statistics returned by function vmaDefragment(). More...
       
      + + + + +

      +Enumerations

      enum  VmaPoolCreateFlagBits { VMA_POOL_CREATE_PERSISTENT_MAP_BIT = 0x00000001, +VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT = 0x00000002, +VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF + }
       Flags to be passed as VmaPoolCreateInfo::flags. More...
       
      - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + @@ -110,15 +149,18 @@ Functions + + + - + - + @@ -138,7 +180,7 @@ Functions

      Functions

      VkResult vmaAllocateMemory (VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaMemoryRequirements *pVmaMemoryRequirements, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       General purpose memory allocation. More...
       
      VkResult vmaAllocateMemoryForBuffer (VmaAllocator allocator, VkBuffer buffer, const VmaMemoryRequirements *pMemoryRequirements, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       
      VkResult vmaAllocateMemoryForImage (VmaAllocator allocator, VkImage image, const VmaMemoryRequirements *pMemoryRequirements, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       Function similar to vmaAllocateMemoryForBuffer(). More...
       
      VkResult vmaCreatePool (VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)
       Allocates Vulkan device memory and creates VmaPool object. More...
       
      void vmaDestroyPool (VmaAllocator allocator, VmaPool pool)
       Destroys VmaPool object and frees Vulkan device memory. More...
       
      void vmaGetPoolStats (VmaAllocator allocator, VmaPool pool, VmaPoolStats *pPoolStats)
       Retrieves statistics of existing VmaPool object. More...
       
      void vmaMakePoolAllocationsLost (VmaAllocator allocator, VmaPool pool, size_t *pLostAllocationCount)
       Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInfo::frameInUseCount back from now. More...
       
      VkResult vmaAllocateMemory (VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       General purpose memory allocation. More...
       
      VkResult vmaAllocateMemoryForBuffer (VmaAllocator allocator, VkBuffer buffer, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       
      VkResult vmaAllocateMemoryForImage (VmaAllocator allocator, VkImage image, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       Function similar to vmaAllocateMemoryForBuffer(). More...
       
      void vmaFreeMemory (VmaAllocator allocator, VmaAllocation allocation)
       Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage(). More...
       Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage(). More...
       
      void vmaGetAllocationInfo (VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)
       Returns current information about specified allocation. More...
      void vmaSetAllocationUserData (VmaAllocator allocator, VmaAllocation allocation, void *pUserData)
       Sets pUserData in given allocation to new value. More...
       
      void vmaCreateLostAllocation (VmaAllocator allocator, VmaAllocation *pAllocation)
       Creates new allocation that is in lost state from the beginning. More...
       
      VkResult vmaMapMemory (VmaAllocator allocator, VmaAllocation allocation, void **ppData)
       
      void vmaUnmapMemory (VmaAllocator allocator, VmaAllocation allocation)
       
      void vmaUnmapPersistentlyMappedMemory (VmaAllocator allocator)
       Unmaps persistently mapped memory of types that is HOST_COHERENT and DEVICE_LOCAL. More...
       Unmaps persistently mapped memory of types that are HOST_COHERENT and DEVICE_LOCAL. More...
       
      VkResult vmaMapPersistentlyMappedMemory (VmaAllocator allocator)
       Maps back persistently mapped memory of types that is HOST_COHERENT and DEVICE_LOCAL. More...
       Maps back persistently mapped memory of types that are HOST_COHERENT and DEVICE_LOCAL. More...
       
      VkResult vmaDefragment (VmaAllocator allocator, VmaAllocation *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const VmaDefragmentationInfo *pDefragmentationInfo, VmaDefragmentationStats *pDefragmentationStats)
       Compacts memory by moving allocations. More...
      -

      Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().

      +

      Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().

      @@ -172,11 +214,102 @@ Functions

      Statistics returned by function vmaDefragment().

      + + + +

      ◆ VmaPoolCreateFlagBits

      + +
      +
      + +

      Flags to be passed as VmaPoolCreateInfo::flags.

      + +
      +
      + +

      ◆ VmaPoolCreateFlags

      + +
      +
      + + + + +
      typedef VkFlags VmaPoolCreateFlags
      +
      + +
      +
      + +

      ◆ VmaPoolCreateInfo

      + +
      +
      + + + + +
      typedef struct VmaPoolCreateInfo VmaPoolCreateInfo
      +
      + +

      Describes parameter of created VmaPool.

      + +
      +
      + +

      ◆ VmaPoolStats

      + +
      +
      + + + + +
      typedef struct VmaPoolStats VmaPoolStats
      +
      + +

      Describes parameter of existing VmaPool.

      + +
      +
      +

      Enumeration Type Documentation

      + +

      ◆ VmaPoolCreateFlagBits

      + +
      +
      + + + + +
      enum VmaPoolCreateFlagBits
      +
      + +

      Flags to be passed as VmaPoolCreateInfo::flags.

      + + + + +
      Enumerator
      VMA_POOL_CREATE_PERSISTENT_MAP_BIT 

      Set this flag to use a memory that will be persistently mapped.

      +

      Each allocation made from this pool will have VmaAllocationInfo::pMappedData available.

      +

      Usage of this flag must match usage of VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT flag for every allocation made from this pool.

      +
      VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT 

      Use this flag if you always allocate only buffers and linear images or only optimal images out of this pool and so Buffer-Image Granularity can be ignored.

      +

      This is na optional optimization flag.

      +

      If you always allocate using vmaCreateBuffer(), vmaCreateImage(), vmaAllocateMemoryForBuffer(), then you don't need to use it because allocator knows exact type of your allocations so it can handle Buffer-Image Granularity in the optimal way.

      +

      If you also allocate using vmaAllocateMemoryForImage() or vmaAllocateMemory(), exact type of such allocations is not known, so allocator must be conservative in handling Buffer-Image Granularity, which can lead to suboptimal allocation (wasted memory). In that case, if you can make sure you always allocate only buffers and linear images or only optimal images out of this pool, use this flag to make allocator disregard Buffer-Image Granularity and so make allocations more optimal.

      +
      VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM 
      +

      Function Documentation

      - -

      ◆ vmaAllocateMemory()

      + +

      ◆ vmaAllocateMemory()

      @@ -196,8 +329,8 @@ Functions - const VmaMemoryRequirements *  - pVmaMemoryRequirements, + const VmaAllocationCreateInfo *  + pCreateInfo, @@ -228,12 +361,12 @@ Functions

      You should free the memory using vmaFreeMemory().

      -

      It is recommended to use vmaAllocateMemoryForBuffer(), vmaAllocateMemoryForImage(), vmaCreateBuffer(), vmaCreateImage() instead whenever possible.

      +

      It is recommended to use vmaAllocateMemoryForBuffer(), vmaAllocateMemoryForImage(), vmaCreateBuffer(), vmaCreateImage() instead whenever possible.

      - -

      ◆ vmaAllocateMemoryForBuffer()

      + +

      ◆ vmaAllocateMemoryForBuffer()

      @@ -253,8 +386,8 @@ Functions - const VmaMemoryRequirements *  - pMemoryRequirements, + const VmaAllocationCreateInfo *  + pCreateInfo, @@ -286,8 +419,8 @@ Functions
      - -

      ◆ vmaAllocateMemoryForImage()

      + +

      ◆ vmaAllocateMemoryForImage()

      @@ -307,8 +440,8 @@ Functions - const VmaMemoryRequirements *  - pMemoryRequirements, + const VmaAllocationCreateInfo *  + pCreateInfo, @@ -330,7 +463,84 @@ Functions
      -

      Function similar to vmaAllocateMemoryForBuffer().

      +

      Function similar to vmaAllocateMemoryForBuffer().

      + +
      +
      + +

      ◆ vmaCreateLostAllocation()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void vmaCreateLostAllocation (VmaAllocator allocator,
      VmaAllocation * pAllocation 
      )
      +
      + +

      Creates new allocation that is in lost state from the beginning.

      +

      It can be useful if you need a dummy, non-null allocation.

      +

      You still need to destroy created object using vmaFreeMemory().

      +

      Returned allocation is not tied to any specific memory pool or memory type and not bound to any image or buffer. It has size = 0. It cannot be turned into a real, non-empty allocation.

      + +
      +
      + +

      ◆ vmaCreatePool()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      VkResult vmaCreatePool (VmaAllocator allocator,
      const VmaPoolCreateInfopCreateInfo,
      VmaPool * pPool 
      )
      +
      + +

      Allocates Vulkan device memory and creates VmaPool object.

      +
      Parameters
      + + + + +
      allocatorAllocator object.
      pCreateInfoParameters of pool to create.
      [out]pPoolHandle to created pool.
      +
      +
      @@ -396,16 +606,16 @@ Functions
      Returns
      VK_SUCCESS if completed, VK_INCOMPLETE if succeeded but didn't make all possible optimizations because limits specified in pDefragmentationInfo have been reached, negative error code in case of error.
      -

      This function works by moving allocations to different places (different VkDeviceMemory objects and/or different offsets) in order to optimize memory usage. Only allocations that are in pAllocations array can be moved. All other allocations are considered nonmovable in this call. Basic rules:

      +

      This function works by moving allocations to different places (different VkDeviceMemory objects and/or different offsets) in order to optimize memory usage. Only allocations that are in pAllocations array can be moved. All other allocations are considered nonmovable in this call. Basic rules:

        -
      • Only allocations made in memory types that have VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT flag can be compacted. You may pass other allocations but it makes no sense - these will never be moved.
      • -
      • You may pass allocations made with VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT but it makes no sense - they will never be moved.
      • -
      • Both allocations made with or without VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT flag can be compacted. If not persistently mapped, memory will be mapped temporarily inside this function if needed, so it shouldn't be mapped by you for the time of this call.
      • -
      • You must not pass same VmaAllocation object multiple times in pAllocations array.
      • +
      • Only allocations made in memory types that have VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT flag can be compacted. You may pass other allocations but it makes no sense - these will never be moved.
      • +
      • You may pass allocations made with VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT but it makes no sense - they will never be moved.
      • +
      • Both allocations made with or without VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT flag can be compacted. If not persistently mapped, memory will be mapped temporarily inside this function if needed, so it shouldn't be mapped by you for the time of this call.
      • +
      • You must not pass same VmaAllocation object multiple times in pAllocations array.
      -

      The function also frees empty VkDeviceMemory blocks.

      +

      The function also frees empty VkDeviceMemory blocks.

      After allocation has been moved, its VmaAllocationInfo::deviceMemory and/or VmaAllocationInfo::offset changes. You must query them again using vmaGetAllocationInfo() if you need them.

      -

      If an allocation has been moved, data in memory is copied to new place automatically, but if it was bound to a buffer or an image, you must destroy that object yourself, create new one and bind it to the new memory pointed by the allocation. You must use vkDestroyBuffer(), vkDestroyImage(), vkCreateBuffer(), vkCreateImage() for that purpose and NOT vmaDestroyBuffer(), vmaDestroyImage(), vmaCreateBuffer(), vmaCreateImage()! Example:

      +

      If an allocation has been moved, data in memory is copied to new place automatically, but if it was bound to a buffer or an image, you must destroy that object yourself, create new one and bind it to the new memory pointed by the allocation. You must use vkDestroyBuffer(), vkDestroyImage(), vkCreateBuffer(), vkCreateImage() for that purpose and NOT vmaDestroyBuffer(), vmaDestroyImage(), vmaCreateBuffer(), vmaCreateImage()! Example:

      VkDevice device = ...;
       VmaAllocator allocator = ...;
       std::vector<VkBuffer> buffers = ...;
      @@ -433,6 +643,36 @@ for(size_t i = 0; i < allocations.size(); ++i)
       }
       

      This function may be time-consuming, so you shouldn't call it too often (like every frame or after every resource creation/destruction), but rater you can call it on special occasions (like when reloading a game level, when you just destroyed a lot of objects).

      + + + +

      ◆ vmaDestroyPool()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void vmaDestroyPool (VmaAllocator allocator,
      VmaPool pool 
      )
      +
      + +

      Destroys VmaPool object and frees Vulkan device memory.

      +
      @@ -461,7 +701,7 @@ for(size_t i = 0; i < allocations.size(); ++i)
      -

      Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage().

      +

      Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage().

      @@ -499,6 +739,94 @@ for(size_t i = 0; i < allocations.size(); ++i)

      Returns current information about specified allocation.

      + + + +

      ◆ vmaGetPoolStats()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void vmaGetPoolStats (VmaAllocator allocator,
      VmaPool pool,
      VmaPoolStatspPoolStats 
      )
      +
      + +

      Retrieves statistics of existing VmaPool object.

      +
      Parameters
      + + + + +
      allocatorAllocator object.
      poolPool object.
      [out]pPoolStatsStatistics of specified pool.
      +
      +
      + +
      +
      + +

      ◆ vmaMakePoolAllocationsLost()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      void vmaMakePoolAllocationsLost (VmaAllocator allocator,
      VmaPool pool,
      size_t * pLostAllocationCount 
      )
      +
      + +

      Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInfo::frameInUseCount back from now.

      +
      Parameters
      + + + + +
      allocatorAllocator object.
      poolPool.
      [out]pLostAllocationCountNumber of allocations marked as lost. Optional - pass null if you don't need this information.
      +
      +
      +
      @@ -533,7 +861,7 @@ for(size_t i = 0; i < allocations.size(); ++i)

      Feel free to use vkMapMemory on these memory blocks on you own if you want, but just for convenience and to make sure correct offset and size is always specified, usage of vmaMapMemory() / vmaUnmapMemory() is recommended.

      -

      Do not use it on memory allocated with VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT as multiple maps to same VkDeviceMemory is illegal.

      +

      Do not use it on memory allocated with VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT as multiple maps to same VkDeviceMemory is illegal.

      @@ -553,9 +881,9 @@ for(size_t i = 0; i < allocations.size(); ++i)
      -

      Maps back persistently mapped memory of types that is HOST_COHERENT and DEVICE_LOCAL.

      -

      See vmaUnmapPersistentlyMappedMemory().

      -

      After this call VmaAllocationInfo::pMappedData of some allocation may have value different than before calling vmaUnmapPersistentlyMappedMemory().

      +

      Maps back persistently mapped memory of types that are HOST_COHERENT and DEVICE_LOCAL.

      +

      See vmaUnmapPersistentlyMappedMemory().

      +

      After this call VmaAllocationInfo::pMappedData of some allocation may have value different than before calling vmaUnmapPersistentlyMappedMemory().

      @@ -639,13 +967,13 @@ for(size_t i = 0; i < allocations.size(); ++i)
      -

      Unmaps persistently mapped memory of types that is HOST_COHERENT and DEVICE_LOCAL.

      -

      This is optional performance optimization. On Windows you should call it before every call to vkQueueSubmit and vkQueuePresent. After which you can remap the allocations again using vmaMapPersistentlyMappedMemory(). This is because of the internal behavior of WDDM. Example:

      +

      Unmaps persistently mapped memory of types that are HOST_COHERENT and DEVICE_LOCAL.

      +

      This is optional performance optimization. On Windows you should call it before every call to vkQueueSubmit and vkQueuePresent. After which you can remap the allocations again using vmaMapPersistentlyMappedMemory(). This is because of the internal behavior of WDDM. Example:

      vmaUnmapPersistentlyMappedMemory(allocator);
       vkQueueSubmit(...)
       vmaMapPersistentlyMappedMemory(allocator);
       

      After this call VmaAllocationInfo::pMappedData of some allocations may become null.

      -

      This call is reference-counted. Memory is mapped again after you call vmaMapPersistentlyMappedMemory() same number of times that you called vmaUnmapPersistentlyMappedMemory().

      +

      This call is reference-counted. Memory is mapped again after you call vmaMapPersistentlyMappedMemory() same number of times that you called vmaUnmapPersistentlyMappedMemory().

      diff --git a/docs/html/group__layer3.html b/docs/html/group__layer3.html index 9e929f6..1da6a66 100644 --- a/docs/html/group__layer3.html +++ b/docs/html/group__layer3.html @@ -67,20 +67,20 @@ $(function() { - - + + - - - + + +

      Functions

      VkResult vmaCreateBuffer (VmaAllocator allocator, const VkBufferCreateInfo *pCreateInfo, const VmaMemoryRequirements *pMemoryRequirements, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       
      VkResult vmaCreateBuffer (VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       
      void vmaDestroyBuffer (VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)
       
      VkResult vmaCreateImage (VmaAllocator allocator, const VkImageCreateInfo *pCreateInfo, const VmaMemoryRequirements *pMemoryRequirements, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       Function similar to vmaCreateBuffer(). More...
       
      VkResult vmaCreateImage (VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)
       Function similar to vmaCreateBuffer(). More...
       
      void vmaDestroyImage (VmaAllocator allocator, VkImage image, VmaAllocation allocation)
       

      Detailed Description

      Function Documentation

      - -

      ◆ vmaCreateBuffer()

      + +

      ◆ vmaCreateBuffer()

      @@ -95,13 +95,13 @@ Functions const VkBufferCreateInfo *  - pCreateInfo, + pBufferCreateInfo, - const VmaMemoryRequirements *  - pMemoryRequirements, + const VmaAllocationCreateInfo *  + pAllocationCreateInfo, @@ -147,8 +147,8 @@ Functions
      - -

      ◆ vmaCreateImage()

      + +

      ◆ vmaCreateImage()

      @@ -163,13 +163,13 @@ Functions const VkImageCreateInfo *  - pCreateInfo, + pImageCreateInfo, - const VmaMemoryRequirements *  - pMemoryRequirements, + const VmaAllocationCreateInfo *  + pAllocationCreateInfo, @@ -197,7 +197,7 @@ Functions
      -

      Function similar to vmaCreateBuffer().

      +

      Function similar to vmaCreateBuffer().

      diff --git a/docs/html/index.html b/docs/html/index.html index 20a1a2b..9e8b311 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -62,15 +62,32 @@ $(function() {
      Vulkan Memory Allocator
      -

      Version 2.0.0-alpha.2 (2017-07-11)

      + +

      Version 2.0.0-alpha.3 (2017-09-12)

      Members grouped: see Modules.

      All members: see vk_mem_alloc.h.

      -Problem Statement

      +Problem statement

      Memory allocation and resource (buffer and image) creation in Vulkan is difficult (comparing to older graphics API-s, like D3D11 or OpenGL) for several reasons:

      • It requires a lot of boilerplate code, just like everything else in Vulkan, because it is a low-level and high-performance API.
      • -
      • There is additional level of indirection: VkDeviceMemory is allocated separately from creating VkBuffer/VkImage and they must be bound together. The binding cannot be changed later - resource must be recreated.
      • +
      • There is additional level of indirection: VkDeviceMemory is allocated separately from creating VkBuffer/VkImage and they must be bound together. The binding cannot be changed later - resource must be recreated.
      • Driver must be queried for supported memory heaps and memory types. Different IHV-s provide different types of it.
      • It is recommended practice to allocate bigger chunks of memory and assign parts of them to particular resources.
      @@ -82,7 +99,7 @@ Features
    • Required or preferred traits of the memory are expressed using higher-level description comparing to Vulkan flags.
  • -
  • Functions that allocate memory blocks, reserve and return parts of them (VkDeviceMemory + offset + size) to the user.
      +
    • Functions that allocate memory blocks, reserve and return parts of them (VkDeviceMemory + offset + size) to the user.
      • Library keeps track of allocated memory blocks, used and unused ranges inside them, finds best matching unused ranges for new allocations, takes all the rules of alignment into consideration.
    • @@ -95,10 +112,12 @@ Prequisites
    • Public interface in C, in same convention as Vulkan API. Implementation in C++.
    • Interface documented using Doxygen-style comments.
    • Platform-independent, but developed and tested on Windows using Visual Studio.
    • -
    • Error handling implemented by returning VkResult error codes - same way as in Vulkan.
    • +
    • Error handling implemented by returning VkResult error codes - same way as in Vulkan.
    -

    -Quick Start

    +

    +User guide

    +

    +Quick start

    In your project code:

    1. Include "vk_mem_alloc.h" file wherever you want to use the library.
    2. @@ -108,8 +127,8 @@ Quick Start #include "vk_mem_alloc.h"

      At program startup:

        -
      1. Initialize Vulkan to have VkPhysicalDevice and VkDevice object.
      2. -
      3. Fill VmaAllocatorCreateInfo structure and create VmaAllocator object by calling vmaCreateAllocator().
      4. +
      5. Initialize Vulkan to have VkPhysicalDevice and VkDevice object.
      6. +
      7. Fill VmaAllocatorCreateInfo structure and create VmaAllocator object by calling vmaCreateAllocator().
      VmaAllocatorCreateInfo allocatorInfo = {};
       allocatorInfo.physicalDevice = physicalDevice;
      @@ -119,36 +138,174 @@ VmaAllocator allocator;
       vmaCreateAllocator(&allocatorInfo, &allocator);
       

      When you want to create a buffer or image:

        -
      1. Fill VkBufferCreateInfo / VkImageCreateInfo structure.
      2. -
      3. Fill VmaMemoryRequirements structure.
      4. -
      5. Call vmaCreateBuffer() / vmaCreateImage() to get VkBuffer/VkImage with memory already allocated and bound to it.
      6. +
      7. Fill VkBufferCreateInfo / VkImageCreateInfo structure.
      8. +
      9. Fill VmaAllocationCreateInfo structure.
      10. +
      11. Call vmaCreateBuffer() / vmaCreateImage() to get VkBuffer/VkImage with memory already allocated and bound to it.
      VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
       bufferInfo.size = myBufferSize;
       bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
       
      -VmaMemoryRequirements memReq = {};
      +VmaAllocationCreateInfo memReq = {};
       memReq.usage = VMA_MEMORY_USAGE_GPU_ONLY;
       
       VkBuffer buffer;
       VmaAllocation allocation;
       vmaCreateBuffer(allocator, &bufferInfo, &memReq, &buffer, &allocation, nullptr);
      -

      Don't forget to destroy your objects:

      +

      Don't forget to destroy your objects when no longer needed:

      vmaDestroyBuffer(allocator, buffer, allocation);
       vmaDestroyAllocator(allocator);
      -

      +

      +Persistently mapped memory

      +

      If you need to map memory on host, it may happen that two allocations are assigned to the same VkDeviceMemory block, so if you map them both at the same time, it will cause error because mapping single memory block multiple times is illegal in Vulkan.

      +

      It is safer, more convenient and more efficient to use special feature designed for that: persistently mapped memory. Allocations made with VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT flag set in VmaAllocationCreateInfo::flags are returned from device memory blocks that stay mapped all the time, so you can just access CPU pointer to it. VmaAllocationInfo::pMappedData pointer is already offseted to the beginning of particular allocation. Example:

      +
      VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
      +bufCreateInfo.size = 1024;
      +bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
      +
      +VmaAllocationCreateInfo allocCreateInfo = {};
      +allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;
      +allocCreateInfo.flags = VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT;
      +
      +VkBuffer buf;
      +VmaAllocation alloc;
      +VmaAllocationInfo allocInfo;
      +vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);
      +
      +.// Buffer is immediately mapped. You can access its memory.
      +memcpy(allocInfo.pMappedData, myData, 1024);
      +

      Memory in Vulkan doesn't need to be unmapped before using it e.g. for transfers, but if you are not sure whether it's HOST_COHERENT (here is surely is because it's created with VMA_MEMORY_USAGE_CPU_ONLY), you should check it. If it's not, you should call vkInvalidateMappedMemoryRanges() before reading and vkFlushMappedMemoryRanges() after writing to mapped memory on CPU. Example:

      +
      VkMemoryPropertyFlags memFlags;
      +vmaGetMemoryTypeProperties(allocator, allocInfo.memoryType, &memFlags);
      +if((memFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0)
      +{
      +    VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };
      +    memRange.memory = allocInfo.deviceMemory;
      +    memRange.offset = allocInfo.offset;
      +    memRange.size   = allocInfo.size;
      +    vkFlushMappedMemoryRanges(device, 1, &memRange);
      +}
      +

      For performance reasons it is also recommended to unmap Vulkan memory for the time of call to vkQueueSubmit() or vkQueuePresent(). You can do it for all persistently mapped memory using just one function call. For details, see function vmaUnmapPersistentlyMappedMemory(), vmaMapPersistentlyMappedMemory().

      +

      +Custom memory pools

      +

      The library automatically creates and manages default memory pool for each memory type available on the device. A pool contains a number of VkDeviceMemory blocks. You can create custom pool and allocate memory out of it. It can be useful if you want to:

      +
        +
      • Keep certain kind of allocations separate from others.
      • +
      • Enforce particular size of Vulkan memory blocks.
      • +
      • Limit maximum amount of Vulkan memory allocated for that pool.
      • +
      +

      To use custom memory pools:

      +
        +
      1. Fill VmaPoolCreateInfo structure.
      2. +
      3. Call vmaCreatePool() to obtain VmaPool handle.
      4. +
      5. When making an allocation, set VmaAllocationCreateInfo::pool to this handle. You don't need to specify any other parameters of this structure, like usage.
      6. +
      +

      Example:

      +
      .// Create a pool that could have at most 2 blocks, 128 MB each.
      +VmaPoolCreateInfo poolCreateInfo = {};
      +poolCreateInfo.memoryTypeIndex = ...
      +poolCreateInfo.blockSize = 128ull * 1024 * 1024;
      +poolCreateInfo.maxBlockCount = 2;
      +
      +VmaPool pool;
      +vmaCreatePool(allocator, &poolCreateInfo, &pool);
      +
      +.// Allocate a buffer out of it.
      +VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
      +bufCreateInfo.size = 1024;
      +bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
      +
      +VmaAllocationCreateInfo allocCreateInfo = {};
      +allocCreateInfo.pool = pool;
      +
      +VkBuffer buf;
      +VmaAllocation alloc;
      +VmaAllocationInfo allocInfo;
      +vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);
      +

      You have to free all allocations made from this pool before destroying it.

      +
      vmaDestroyBuffer(allocator, buf, alloc);
      +vmaDestroyPool(allocator, pool);
      +

      +Defragmentation

      +

      Interleaved allocations and deallocations of many objects of varying size can cause fragmentation, which can lead to a situation where the library is unable to find a continuous range of free memory for a new allocation despite there is enough free space, just scattered across many small free ranges between existing allocations.

      +

      To mitigate this problem, you can use vmaDefragment(). Given set of allocations, this function can move them to compact used memory, ensure more continuous free space and possibly also free some VkDeviceMemory. It can work only on allocations made from memory type that is HOST_VISIBLE. Allocations are modified to point to the new VkDeviceMemory and offset. Data in this memory is also memmove-ed to the new place. However, if you have images or buffers bound to these allocations (and you certainly do), you need to destroy, recreate, and bind them to the new place in memory.

      +

      For further details and example code, see documentation of function vmaDefragment().

      +

      +Lost allocations

      +

      If your game oversubscribes video memory, if may work OK in previous-generation graphics APIs (DirectX 9, 10, 11, OpenGL) because resources are automatically paged to system RAM. In Vulkan you can't do it because when you run out of memory, an allocation just fails. If you have more data (e.g. textures) that can fit into VRAM and you don't need it all at once, you may want to upload them to GPU on demand and "push out" ones that are not used for a long time to make room for the new ones, effectively using VRAM (or a cartain memory pool) as a form of cache. Vulkan Memory Allocator can help you with that by supporting a concept of "lost allocations".

      +

      To create an allocation that can become lost, include VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT flag in VmaAllocationCreateInfo::flags. Before using a buffer or image bound to such allocation in every new frame, you need to query it if it's not lost. To check it: call vmaGetAllocationInfo() and see if VmaAllocationInfo::deviceMemory is not VK_NULL_HANDLE. If the allocation is lost, you should not use it or buffer/image bound to it. You mustn't forget to destroy this allocation and this buffer/image.

      +

      To create an allocation that can make some other allocations lost to make room for it, use VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag. You will usually use both flags VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT and VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT at the same time.

      +

      Warning! Current implementation uses quite naive, brute force algorithm, which can make allocation calls that use VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag quite slow. A new, more optimal algorithm and data structure to speed this up is planned for the future.

      +

      When interleaving creation of new allocations with usage of existing ones, how do you make sure that an allocation won't become lost while it's used in the current frame?

      +

      It is ensured because vmaGetAllocationInfo() not only returns allocation parameters and checks whether it's not lost, but when it's not, it also atomically marks it as used in the current frame, which makes it impossible to become lost in that frame. It uses lockless algorithm, so it works fast and doesn't involve locking any internal mutex.

      +

      What if my allocation may still be in use by the GPU when it's rendering a previous frame while I already submit new frame on the CPU?

      +

      You can make sure that allocations "touched" by vmaGetAllocationInfo() will not become lost for a number of additional frames back from the current one by specifying this number as VmaAllocatorCreateInfo::frameInUseCount (for default memory pool) and VmaPoolCreateInfo::frameInUseCount (for custom pool).

      +

      How do you inform the library when new frame starts?

      +

      You need to call function vmaSetCurrentFrameIndex().

      +

      Example code:

      +
      struct MyBuffer
      +{
      +    VkBuffer m_Buf = nullptr;
      +    VmaAllocation m_Alloc = nullptr;
      +
      +    .// Called when the buffer is really needed in the current frame.
      +    void EnsureBuffer();
      +};
      +
      +void MyBuffer::EnsureBuffer()
      +{
      +    .// Buffer has been created.
      +    if(m_Buf != VK_NULL_HANDLE)
      +    {
      +        .// Check if its allocation is not lost + mark it as used in current frame.
      +        VmaAllocationInfo allocInfo;
      +        vmaGetAllocationInfo(allocator, m_Alloc, &allocInfo);
      +        if(allocInfo.deviceMemory != VK_NULL_HANDLE)
      +        {
      +            .// It's all OK - safe to use m_Buf.
      +            return;
      +        }
      +    }
      +
      +    .// Buffer not yet exists or lost - destroy and recreate it.
      +
      +    vmaDestroyBuffer(allocator, m_Buf, m_Alloc);
      +
      +    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
      +    bufCreateInfo.size = 1024;
      +    bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
      +
      +    VmaAllocationCreateInfo allocCreateInfo = {};
      +    allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
      +    allocCreateInfo.flags = VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT |
      +        VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT;
      +
      +    vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &m_Buf, &m_Alloc, nullptr);
      +}
      +

      When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.

      +

      The library uses following algorithm for allocation, in order:

      +
        +
      1. Try to find free range of memory in existing blocks.
      2. +
      3. If failed, try to create a new block of VkDeviceMemory, with preferred block size.
      4. +
      5. If failed, try to create such block with size/2 and size/4.
      6. +
      7. If failed and VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag was specified, try to find space in existing blocks, possilby making some other allocations lost.
      8. +
      9. If failed, try to allocate separate VkDeviceMemory for this allocation, just like when you use VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT.
      10. +
      11. If failed, choose other memory type that meets the requirements specified in VmaAllocationCreateInfo and go to point 1.
      12. +
      13. If failed, return VK_ERROR_OUT_OF_DEVICE_MEMORY.
      14. +
      +

      Configuration

      -

      Please check "CONFIGURATION SECTION" in the code to find macros that you can define before each #include of this file or change directly in this file to provide your own implementation of basic facilities like assert, min and max functions, mutex etc. C++ STL is used by default, but changing these allows you to get rid of any STL usage if you want, as many game developers tend to do.

      -

      -Custom memory allocator

      -

      You can use custom memory allocator by filling optional member VmaAllocatorCreateInfo::pAllocationCallbacks. These functions will be passed to Vulkan, as well as used by the library itself to make any CPU-side allocations.

      +

      Please check "CONFIGURATION SECTION" in the code to find macros that you can define before each #include of this file or change directly in this file to provide your own implementation of basic facilities like assert, min and max functions, mutex etc. C++ STL is used by default, but changing these allows you to get rid of any STL usage if you want, as many game developers tend to do.

      +

      +Custom memory allocator

      +

      You can use custom memory allocator by filling optional member VmaAllocatorCreateInfo::pAllocationCallbacks. These functions will be passed to Vulkan, as well as used by the library itself to make any CPU-side allocations.

      Thread safety

        -
      • The library has no global state, so separate VmaAllocator objects can be used independently.
      • -
      • By default, all calls to functions that take VmaAllocator as first parameter are safe to call from multiple threads simultaneously because they are synchronized internally when needed.
      • -
      • When the allocator is created with VMA_ALLOCATOR_EXTERNALLY_SYNCHRONIZED_BIT flag, calls to functions that take such VmaAllocator object must be synchronized externally.
      • -
      • Access to a VmaAllocation object must be externally synchronized. For example, you must not call vmaGetAllocationInfo() and vmaDefragment() from different threads at the same time if you pass the same VmaAllocation object to these functions.
      • +
      • The library has no global state, so separate VmaAllocator objects can be used independently.
      • +
      • By default, all calls to functions that take VmaAllocator as first parameter are safe to call from multiple threads simultaneously because they are synchronized internally when needed.
      • +
      • When the allocator is created with VMA_ALLOCATOR_EXTERNALLY_SYNCHRONIZED_BIT flag, calls to functions that take such VmaAllocator object must be synchronized externally.
      • +
      • Access to a VmaAllocation object must be externally synchronized. For example, you must not call vmaGetAllocationInfo() and vmaDefragment() from different threads at the same time if you pass the same VmaAllocation object to these functions.
      diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js index d65975f..36e26b6 100644 --- a/docs/html/search/all_0.js +++ b/docs/html/search/all_0.js @@ -1,5 +1,8 @@ var searchData= [ - ['allocationcount',['AllocationCount',['../struct_vma_stat_info.html#a240402222ac6777e4079653c5d542cb0',1,'VmaStatInfo']]], + ['allocationcount',['AllocationCount',['../struct_vma_stat_info.html#a240402222ac6777e4079653c5d542cb0',1,'VmaStatInfo::AllocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()']]], + ['allocationsizeavg',['AllocationSizeAvg',['../struct_vma_stat_info.html#a0019702e4f4ea4ed824aebf250841f21',1,'VmaStatInfo']]], + ['allocationsizemax',['AllocationSizeMax',['../struct_vma_stat_info.html#aba2ef16e2ac09b97305c58a168a3805c',1,'VmaStatInfo']]], + ['allocationsizemin',['AllocationSizeMin',['../struct_vma_stat_info.html#a61a834fa78bcf41fb5a53b286b2e1580',1,'VmaStatInfo']]], ['allocationsmoved',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]] ]; diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js index cb221fc..e73151c 100644 --- a/docs/html/search/all_1.js +++ b/docs/html/search/all_1.js @@ -1,5 +1,7 @@ var searchData= [ + ['blockcount',['BlockCount',['../struct_vma_stat_info.html#a9af0d9809007cf4a0009d324b2b8bbc9',1,'VmaStatInfo']]], + ['blocksize',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]], ['bytesfreed',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]], ['bytesmoved',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]] ]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js index 60408e6..06fd7c5 100644 --- a/docs/html/search/all_3.js +++ b/docs/html/search/all_3.js @@ -1,4 +1,5 @@ var searchData= [ - ['flags',['flags',['../struct_vma_allocator_create_info.html#a35d3b42ac5a3be3758926819dc053859',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_memory_requirements.html#a53c9ea8c3cbcc12dddbe9ae23bb85eb6',1,'VmaMemoryRequirements::flags()']]] + ['flags',['flags',['../struct_vma_allocator_create_info.html#a35d3b42ac5a3be3758926819dc053859',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]], + ['frameinusecount',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]] ]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js index b23ec17..1002ad2 100644 --- a/docs/html/search/all_6.js +++ b/docs/html/search/all_6.js @@ -1,7 +1,10 @@ var searchData= [ ['maxallocationstomove',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]], + ['maxblockcount',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]], ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]], ['memoryheap',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]], - ['memorytype',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]] + ['memorytype',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], + ['memorytypeindex',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], + ['minblockcount',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]] ]; diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js index 4093397..48da8dd 100644 --- a/docs/html/search/all_8.js +++ b/docs/html/search/all_8.js @@ -8,8 +8,9 @@ var searchData= ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]], ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]], ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]], - ['preferredflags',['preferredFlags',['../struct_vma_memory_requirements.html#a6e105f836c2288034c711815b18226dc',1,'VmaMemoryRequirements']]], + ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]], + ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]], ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]], ['preferredsmallheapblocksize',['preferredSmallHeapBlockSize',['../struct_vma_allocator_create_info.html#ab435423d84d5ab26e2c347c51771f90a',1,'VmaAllocatorCreateInfo']]], - ['puserdata',['pUserData',['../struct_vma_memory_requirements.html#a8470093e93ed07ed2557490cdc67566a',1,'VmaMemoryRequirements::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]] + ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]] ]; diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js index 0a576b4..9505699 100644 --- a/docs/html/search/all_9.js +++ b/docs/html/search/all_9.js @@ -1,4 +1,4 @@ var searchData= [ - ['requiredflags',['requiredFlags',['../struct_vma_memory_requirements.html#a8876c1b0f112e13a277f16967064cfe0',1,'VmaMemoryRequirements']]] + ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]] ]; diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js index 5261aad..740c955 100644 --- a/docs/html/search/all_a.js +++ b/docs/html/search/all_a.js @@ -1,8 +1,4 @@ var searchData= [ - ['size',['size',['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo']]], - ['suballocationcount',['SuballocationCount',['../struct_vma_stat_info.html#a09fb04b5491661c2e838d098d51bcead',1,'VmaStatInfo']]], - ['suballocationsizeavg',['SuballocationSizeAvg',['../struct_vma_stat_info.html#abb6c3e160a136787f474a18a8264d83b',1,'VmaStatInfo']]], - ['suballocationsizemax',['SuballocationSizeMax',['../struct_vma_stat_info.html#a6be7faf2b7fcff5a9bc017d90aed9271',1,'VmaStatInfo']]], - ['suballocationsizemin',['SuballocationSizeMin',['../struct_vma_stat_info.html#a9dc0b50fab2f10ab99366b79424bf14b',1,'VmaStatInfo']]] + ['size',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]] ]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js index cc1a3e7..91686af 100644 --- a/docs/html/search/all_c.js +++ b/docs/html/search/all_c.js @@ -1,10 +1,11 @@ var searchData= [ ['unusedbytes',['UnusedBytes',['../struct_vma_stat_info.html#a394d2aef4348cb58abf73764804b4f2d',1,'VmaStatInfo']]], - ['unusedrangecount',['UnusedRangeCount',['../struct_vma_stat_info.html#a56c4fb4dba646479180b601854cde2a6',1,'VmaStatInfo']]], + ['unusedrangecount',['UnusedRangeCount',['../struct_vma_stat_info.html#a56c4fb4dba646479180b601854cde2a6',1,'VmaStatInfo::UnusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]], ['unusedrangesizeavg',['UnusedRangeSizeAvg',['../struct_vma_stat_info.html#a88ad9bdc2b3a98964a4d0c338c0c9060',1,'VmaStatInfo']]], ['unusedrangesizemax',['UnusedRangeSizeMax',['../struct_vma_stat_info.html#a10c52c0841f01ca704e8ddb1ea6a635d',1,'VmaStatInfo']]], ['unusedrangesizemin',['UnusedRangeSizeMin',['../struct_vma_stat_info.html#a07c508f42a4d3424bd0c259784a7f2d6',1,'VmaStatInfo']]], - ['usage',['usage',['../struct_vma_memory_requirements.html#ab588497177a57847ed04e0a1aef54bbe',1,'VmaMemoryRequirements']]], + ['unusedsize',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]], + ['usage',['usage',['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo']]], ['usedbytes',['UsedBytes',['../struct_vma_stat_info.html#a86f82cb9cffd456b9da63eaf26c9ff04',1,'VmaStatInfo']]] ]; diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js index dbd1fed..fb398e6 100644 --- a/docs/html/search/all_d.js +++ b/docs/html/search/all_d.js @@ -2,22 +2,30 @@ var searchData= [ ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]], ['vk_5fmem_5falloc_2eh',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]], + ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fown_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a965e035b69f8728b317803ef2d523aa4',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fpersistent_5fmap_5fbit',['VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597ae443691ef3d077c0dc3de5576ac4c312',1,'vk_mem_alloc.h']]], ['vma_5fallocator_5fexternally_5fsynchronized_5fbit',['VMA_ALLOCATOR_EXTERNALLY_SYNCHRONIZED_BIT',['../group__general.html#gga34fff29c218d23a7ff7dff44b77b6b6fabe92b706180652ceb320da5bc383aef4',1,'vk_mem_alloc.h']]], ['vma_5fallocator_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATOR_FLAG_BITS_MAX_ENUM',['../group__general.html#gga34fff29c218d23a7ff7dff44b77b6b6fa914e905a08c2e578f76b9d6c418626cc',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fflag_5fbits_5fmax_5fenum',['VMA_MEMORY_REQUIREMENT_FLAG_BITS_MAX_ENUM',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619eda11f849416519c61bebd90e2e7ecbab21',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fnever_5fallocate_5fbit',['VMA_MEMORY_REQUIREMENT_NEVER_ALLOCATE_BIT',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619edae1a503c29619c0c9885521d371e9b4c4',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fown_5fmemory_5fbit',['VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619eda9831d98a698347b0cd1594db6a29e8ed',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fpersistent_5fmap_5fbit',['VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619edae75c9dde227c9d4f64693b1e004106dc',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fcpu_5fonly',['VMA_MEMORY_USAGE_CPU_ONLY',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fgpu_5fonly',['VMA_MEMORY_USAGE_GPU_ONLY',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../group__layer2.html#gga9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../group__layer2.html#gga9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fpersistent_5fmap_5fbit',['VMA_POOL_CREATE_PERSISTENT_MAP_BIT',['../group__layer2.html#gga9a7c45f9c863695d98c83fa5ac940fe7a918441f7b40dca90481b114f5d224fe9',1,'vk_mem_alloc.h']]], ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../group__general.html#gae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]], - ['vmaallocatememory',['vmaAllocateMemory',['../group__layer2.html#ga1a7d45920877a53e9a8fbefd6a536119',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../group__layer2.html#ga3536b4da2a2744dc3f3f138be555af02',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../group__layer2.html#ga801f98c24eb928642742bb1e5615e86e',1,'vk_mem_alloc.h']]], + ['vmaallocatememory',['vmaAllocateMemory',['../group__layer2.html#gabf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../group__layer2.html#ga7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../group__layer2.html#ga0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../group__layer1.html#gad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits(): vk_mem_alloc.h'],['../group__layer1.html#gabf6bf6748c7a9fe7ce5b7835c0f56af4',1,'VmaAllocationCreateFlagBits(): vk_mem_alloc.h']]], + ['vmaallocationcreateflags',['VmaAllocationCreateFlags',['../group__layer1.html#ga5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../group__layer1.html#ga86c44f9950b40d50088ed93a17870a7a',1,'VmaAllocationCreateInfo(): vk_mem_alloc.h']]], ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../group__layer2.html#ga795e6ff02a21d5486c0565f403dd9255',1,'VmaAllocationInfo(): vk_mem_alloc.h']]], ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../group__general.html#gae0f6d1d733dded220d28134da46b4283',1,'VmaAllocatorCreateInfo(): vk_mem_alloc.h']]], ['vmaallocatorflagbits',['VmaAllocatorFlagBits',['../group__general.html#ga34fff29c218d23a7ff7dff44b77b6b6f',1,'VmaAllocatorFlagBits(): vk_mem_alloc.h'],['../group__general.html#gac51ae2c316ee760ec5aebbae06d31253',1,'VmaAllocatorFlagBits(): vk_mem_alloc.h']]], @@ -25,29 +33,36 @@ var searchData= ['vmabuildstatsstring',['vmaBuildStatsString',['../group__general.html#gaa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]], ['vmacalculatestats',['vmaCalculateStats',['../group__general.html#ga333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]], ['vmacreateallocator',['vmaCreateAllocator',['../group__general.html#ga200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]], - ['vmacreatebuffer',['vmaCreateBuffer',['../group__layer3.html#ga2f711e32e95cf9bf8dff4917230c2e9b',1,'vk_mem_alloc.h']]], - ['vmacreateimage',['vmaCreateImage',['../group__layer3.html#ga9e34bc318ff4b25d1958e79b9db3f1aa',1,'vk_mem_alloc.h']]], + ['vmacreatebuffer',['vmaCreateBuffer',['../group__layer3.html#gac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]], + ['vmacreateimage',['vmaCreateImage',['../group__layer3.html#ga02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]], + ['vmacreatelostallocation',['vmaCreateLostAllocation',['../group__layer2.html#gae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]], + ['vmacreatepool',['vmaCreatePool',['../group__layer2.html#ga5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]], ['vmadefragment',['vmaDefragment',['../group__layer2.html#ga6aced90fcc7b39882b6654a740a0b9bb',1,'vk_mem_alloc.h']]], ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../group__layer2.html#gae67f8573a0cf20f16f0a1eecbca566a0',1,'VmaDefragmentationInfo(): vk_mem_alloc.h']]], ['vmadefragmentationstats',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../group__layer2.html#gab0f9b06441c840fee560de4a2967f8c9',1,'VmaDefragmentationStats(): vk_mem_alloc.h']]], ['vmadestroyallocator',['vmaDestroyAllocator',['../group__general.html#gaa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]], ['vmadestroybuffer',['vmaDestroyBuffer',['../group__layer3.html#ga0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]], ['vmadestroyimage',['vmaDestroyImage',['../group__layer3.html#gae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]], + ['vmadestroypool',['vmaDestroyPool',['../group__layer2.html#ga5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]], ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../group__general.html#ga5e2eb68d727cfd4df25702b027b7aa31',1,'VmaDeviceMemoryCallbacks(): vk_mem_alloc.h']]], - ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../group__layer1.html#gadf80663373e94bcef382f17534b8694e',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../group__layer1.html#gaef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]], ['vmafreememory',['vmaFreeMemory',['../group__layer2.html#ga11f0fbc034fa81a4efedd73d61ce7568',1,'vk_mem_alloc.h']]], ['vmafreestatsstring',['vmaFreeStatsString',['../group__general.html#ga3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]], ['vmagetallocationinfo',['vmaGetAllocationInfo',['../group__layer2.html#ga86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]], ['vmagetmemoryproperties',['vmaGetMemoryProperties',['../group__general.html#gab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]], ['vmagetmemorytypeproperties',['vmaGetMemoryTypeProperties',['../group__general.html#ga8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]], ['vmagetphysicaldeviceproperties',['vmaGetPhysicalDeviceProperties',['../group__general.html#gaecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]], + ['vmagetpoolstats',['vmaGetPoolStats',['../group__layer2.html#gae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]], + ['vmamakepoolallocationslost',['vmaMakePoolAllocationsLost',['../group__layer2.html#ga736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]], ['vmamapmemory',['vmaMapMemory',['../group__layer2.html#gad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]], ['vmamappersistentlymappedmemory',['vmaMapPersistentlyMappedMemory',['../group__layer2.html#ga03366170bb8e186605518d2f5d65b85a',1,'vk_mem_alloc.h']]], - ['vmamemoryrequirementflagbits',['VmaMemoryRequirementFlagBits',['../group__layer1.html#gadec54ccdb0fd3901e89ac6d38c2619ed',1,'VmaMemoryRequirementFlagBits(): vk_mem_alloc.h'],['../group__layer1.html#gaecb50b7fdb759cc4c4346c40819bf00b',1,'VmaMemoryRequirementFlagBits(): vk_mem_alloc.h']]], - ['vmamemoryrequirementflags',['VmaMemoryRequirementFlags',['../group__layer1.html#gab96b90d34cd1bd0f340fc48f8ca2664a',1,'vk_mem_alloc.h']]], - ['vmamemoryrequirements',['VmaMemoryRequirements',['../struct_vma_memory_requirements.html',1,'VmaMemoryRequirements'],['../group__layer1.html#gae9ee98bebd6e474aa0ef679e10f1d8ca',1,'VmaMemoryRequirements(): vk_mem_alloc.h']]], ['vmamemoryusage',['VmaMemoryUsage',['../group__layer1.html#gaa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage(): vk_mem_alloc.h'],['../group__layer1.html#gad63b2113c0bfdbeade1cb498f5a8580d',1,'VmaMemoryUsage(): vk_mem_alloc.h']]], + ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../group__layer2.html#ga9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits(): vk_mem_alloc.h'],['../group__layer2.html#ga8f93195158e0e2ac80ca352064e71c1f',1,'VmaPoolCreateFlagBits(): vk_mem_alloc.h']]], + ['vmapoolcreateflags',['VmaPoolCreateFlags',['../group__layer2.html#ga2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]], + ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../group__layer2.html#ga211706e9348dcee25a843ed4ea69bce7',1,'VmaPoolCreateInfo(): vk_mem_alloc.h']]], + ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../group__layer2.html#ga2e5612d871d64c5624087b837a338c34',1,'VmaPoolStats(): vk_mem_alloc.h']]], ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../group__layer2.html#gaf9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]], + ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../group__general.html#gade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]], ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../group__general.html#ga810b009a788ee8aac72a25b42ffbe31c',1,'VmaStatInfo(): vk_mem_alloc.h']]], ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'']]], ['vmaunmapmemory',['vmaUnmapMemory',['../group__layer2.html#ga9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]], diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js index 079a70a..b559087 100644 --- a/docs/html/search/classes_0.js +++ b/docs/html/search/classes_0.js @@ -1,11 +1,13 @@ var searchData= [ + ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]], ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]], ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]], ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]], ['vmadefragmentationstats',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]], ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]], - ['vmamemoryrequirements',['VmaMemoryRequirements',['../struct_vma_memory_requirements.html',1,'']]], + ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]], + ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]], ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]], ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'']]] ]; diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js index f6e10b1..471af77 100644 --- a/docs/html/search/enums_0.js +++ b/docs/html/search/enums_0.js @@ -1,6 +1,7 @@ var searchData= [ + ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../group__layer1.html#gad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]], ['vmaallocatorflagbits',['VmaAllocatorFlagBits',['../group__general.html#ga34fff29c218d23a7ff7dff44b77b6b6f',1,'vk_mem_alloc.h']]], - ['vmamemoryrequirementflagbits',['VmaMemoryRequirementFlagBits',['../group__layer1.html#gadec54ccdb0fd3901e89ac6d38c2619ed',1,'vk_mem_alloc.h']]], - ['vmamemoryusage',['VmaMemoryUsage',['../group__layer1.html#gaa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]] + ['vmamemoryusage',['VmaMemoryUsage',['../group__layer1.html#gaa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]], + ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../group__layer2.html#ga9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]] ]; diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js index 13bd7ca..f624ca0 100644 --- a/docs/html/search/enumvalues_0.js +++ b/docs/html/search/enumvalues_0.js @@ -1,15 +1,20 @@ var searchData= [ + ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fown_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_OWN_MEMORY_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597a965e035b69f8728b317803ef2d523aa4',1,'vk_mem_alloc.h']]], + ['vma_5fallocation_5fcreate_5fpersistent_5fmap_5fbit',['VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT',['../group__layer1.html#ggad9889c10c798b040d59c92f257cae597ae443691ef3d077c0dc3de5576ac4c312',1,'vk_mem_alloc.h']]], ['vma_5fallocator_5fexternally_5fsynchronized_5fbit',['VMA_ALLOCATOR_EXTERNALLY_SYNCHRONIZED_BIT',['../group__general.html#gga34fff29c218d23a7ff7dff44b77b6b6fabe92b706180652ceb320da5bc383aef4',1,'vk_mem_alloc.h']]], ['vma_5fallocator_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATOR_FLAG_BITS_MAX_ENUM',['../group__general.html#gga34fff29c218d23a7ff7dff44b77b6b6fa914e905a08c2e578f76b9d6c418626cc',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fflag_5fbits_5fmax_5fenum',['VMA_MEMORY_REQUIREMENT_FLAG_BITS_MAX_ENUM',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619eda11f849416519c61bebd90e2e7ecbab21',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fnever_5fallocate_5fbit',['VMA_MEMORY_REQUIREMENT_NEVER_ALLOCATE_BIT',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619edae1a503c29619c0c9885521d371e9b4c4',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fown_5fmemory_5fbit',['VMA_MEMORY_REQUIREMENT_OWN_MEMORY_BIT',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619eda9831d98a698347b0cd1594db6a29e8ed',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5frequirement_5fpersistent_5fmap_5fbit',['VMA_MEMORY_REQUIREMENT_PERSISTENT_MAP_BIT',['../group__layer1.html#ggadec54ccdb0fd3901e89ac6d38c2619edae75c9dde227c9d4f64693b1e004106dc',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fcpu_5fonly',['VMA_MEMORY_USAGE_CPU_ONLY',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fgpu_5fonly',['VMA_MEMORY_USAGE_GPU_ONLY',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]], ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]], - ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]] + ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../group__layer1.html#ggaa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../group__layer2.html#gga9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../group__layer2.html#gga9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]], + ['vma_5fpool_5fcreate_5fpersistent_5fmap_5fbit',['VMA_POOL_CREATE_PERSISTENT_MAP_BIT',['../group__layer2.html#gga9a7c45f9c863695d98c83fa5ac940fe7a918441f7b40dca90481b114f5d224fe9',1,'vk_mem_alloc.h']]] ]; diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js index 070a2a6..92212fb 100644 --- a/docs/html/search/functions_0.js +++ b/docs/html/search/functions_0.js @@ -1,27 +1,33 @@ var searchData= [ - ['vmaallocatememory',['vmaAllocateMemory',['../group__layer2.html#ga1a7d45920877a53e9a8fbefd6a536119',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../group__layer2.html#ga3536b4da2a2744dc3f3f138be555af02',1,'vk_mem_alloc.h']]], - ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../group__layer2.html#ga801f98c24eb928642742bb1e5615e86e',1,'vk_mem_alloc.h']]], + ['vmaallocatememory',['vmaAllocateMemory',['../group__layer2.html#gabf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../group__layer2.html#ga7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]], + ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../group__layer2.html#ga0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]], ['vmabuildstatsstring',['vmaBuildStatsString',['../group__general.html#gaa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]], ['vmacalculatestats',['vmaCalculateStats',['../group__general.html#ga333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]], ['vmacreateallocator',['vmaCreateAllocator',['../group__general.html#ga200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]], - ['vmacreatebuffer',['vmaCreateBuffer',['../group__layer3.html#ga2f711e32e95cf9bf8dff4917230c2e9b',1,'vk_mem_alloc.h']]], - ['vmacreateimage',['vmaCreateImage',['../group__layer3.html#ga9e34bc318ff4b25d1958e79b9db3f1aa',1,'vk_mem_alloc.h']]], + ['vmacreatebuffer',['vmaCreateBuffer',['../group__layer3.html#gac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]], + ['vmacreateimage',['vmaCreateImage',['../group__layer3.html#ga02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]], + ['vmacreatelostallocation',['vmaCreateLostAllocation',['../group__layer2.html#gae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]], + ['vmacreatepool',['vmaCreatePool',['../group__layer2.html#ga5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]], ['vmadefragment',['vmaDefragment',['../group__layer2.html#ga6aced90fcc7b39882b6654a740a0b9bb',1,'vk_mem_alloc.h']]], ['vmadestroyallocator',['vmaDestroyAllocator',['../group__general.html#gaa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]], ['vmadestroybuffer',['vmaDestroyBuffer',['../group__layer3.html#ga0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]], ['vmadestroyimage',['vmaDestroyImage',['../group__layer3.html#gae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]], - ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../group__layer1.html#gadf80663373e94bcef382f17534b8694e',1,'vk_mem_alloc.h']]], + ['vmadestroypool',['vmaDestroyPool',['../group__layer2.html#ga5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]], + ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../group__layer1.html#gaef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]], ['vmafreememory',['vmaFreeMemory',['../group__layer2.html#ga11f0fbc034fa81a4efedd73d61ce7568',1,'vk_mem_alloc.h']]], ['vmafreestatsstring',['vmaFreeStatsString',['../group__general.html#ga3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]], ['vmagetallocationinfo',['vmaGetAllocationInfo',['../group__layer2.html#ga86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]], ['vmagetmemoryproperties',['vmaGetMemoryProperties',['../group__general.html#gab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]], ['vmagetmemorytypeproperties',['vmaGetMemoryTypeProperties',['../group__general.html#ga8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]], ['vmagetphysicaldeviceproperties',['vmaGetPhysicalDeviceProperties',['../group__general.html#gaecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]], + ['vmagetpoolstats',['vmaGetPoolStats',['../group__layer2.html#gae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]], + ['vmamakepoolallocationslost',['vmaMakePoolAllocationsLost',['../group__layer2.html#ga736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]], ['vmamapmemory',['vmaMapMemory',['../group__layer2.html#gad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]], ['vmamappersistentlymappedmemory',['vmaMapPersistentlyMappedMemory',['../group__layer2.html#ga03366170bb8e186605518d2f5d65b85a',1,'vk_mem_alloc.h']]], ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../group__layer2.html#gaf9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]], + ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../group__general.html#gade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]], ['vmaunmapmemory',['vmaUnmapMemory',['../group__layer2.html#ga9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]], ['vmaunmappersistentlymappedmemory',['vmaUnmapPersistentlyMappedMemory',['../group__layer2.html#ga26b87244491c1fe77f11fe9ab5779c27',1,'vk_mem_alloc.h']]] ]; diff --git a/docs/html/search/typedefs_1.js b/docs/html/search/typedefs_1.js index 639050c..7b9e407 100644 --- a/docs/html/search/typedefs_1.js +++ b/docs/html/search/typedefs_1.js @@ -1,5 +1,8 @@ var searchData= [ + ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../group__layer1.html#gabf6bf6748c7a9fe7ce5b7835c0f56af4',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateflags',['VmaAllocationCreateFlags',['../group__layer1.html#ga5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]], + ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../group__layer1.html#ga86c44f9950b40d50088ed93a17870a7a',1,'vk_mem_alloc.h']]], ['vmaallocationinfo',['VmaAllocationInfo',['../group__layer2.html#ga795e6ff02a21d5486c0565f403dd9255',1,'vk_mem_alloc.h']]], ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../group__general.html#gae0f6d1d733dded220d28134da46b4283',1,'vk_mem_alloc.h']]], ['vmaallocatorflagbits',['VmaAllocatorFlagBits',['../group__general.html#gac51ae2c316ee760ec5aebbae06d31253',1,'vk_mem_alloc.h']]], @@ -7,9 +10,10 @@ var searchData= ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../group__layer2.html#gae67f8573a0cf20f16f0a1eecbca566a0',1,'vk_mem_alloc.h']]], ['vmadefragmentationstats',['VmaDefragmentationStats',['../group__layer2.html#gab0f9b06441c840fee560de4a2967f8c9',1,'vk_mem_alloc.h']]], ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../group__general.html#ga5e2eb68d727cfd4df25702b027b7aa31',1,'vk_mem_alloc.h']]], - ['vmamemoryrequirementflagbits',['VmaMemoryRequirementFlagBits',['../group__layer1.html#gaecb50b7fdb759cc4c4346c40819bf00b',1,'vk_mem_alloc.h']]], - ['vmamemoryrequirementflags',['VmaMemoryRequirementFlags',['../group__layer1.html#gab96b90d34cd1bd0f340fc48f8ca2664a',1,'vk_mem_alloc.h']]], - ['vmamemoryrequirements',['VmaMemoryRequirements',['../group__layer1.html#gae9ee98bebd6e474aa0ef679e10f1d8ca',1,'vk_mem_alloc.h']]], ['vmamemoryusage',['VmaMemoryUsage',['../group__layer1.html#gad63b2113c0bfdbeade1cb498f5a8580d',1,'vk_mem_alloc.h']]], + ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../group__layer2.html#ga8f93195158e0e2ac80ca352064e71c1f',1,'vk_mem_alloc.h']]], + ['vmapoolcreateflags',['VmaPoolCreateFlags',['../group__layer2.html#ga2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]], + ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../group__layer2.html#ga211706e9348dcee25a843ed4ea69bce7',1,'vk_mem_alloc.h']]], + ['vmapoolstats',['VmaPoolStats',['../group__layer2.html#ga2e5612d871d64c5624087b837a338c34',1,'vk_mem_alloc.h']]], ['vmastatinfo',['VmaStatInfo',['../group__general.html#ga810b009a788ee8aac72a25b42ffbe31c',1,'vk_mem_alloc.h']]] ]; diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js index d65975f..36e26b6 100644 --- a/docs/html/search/variables_0.js +++ b/docs/html/search/variables_0.js @@ -1,5 +1,8 @@ var searchData= [ - ['allocationcount',['AllocationCount',['../struct_vma_stat_info.html#a240402222ac6777e4079653c5d542cb0',1,'VmaStatInfo']]], + ['allocationcount',['AllocationCount',['../struct_vma_stat_info.html#a240402222ac6777e4079653c5d542cb0',1,'VmaStatInfo::AllocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()']]], + ['allocationsizeavg',['AllocationSizeAvg',['../struct_vma_stat_info.html#a0019702e4f4ea4ed824aebf250841f21',1,'VmaStatInfo']]], + ['allocationsizemax',['AllocationSizeMax',['../struct_vma_stat_info.html#aba2ef16e2ac09b97305c58a168a3805c',1,'VmaStatInfo']]], + ['allocationsizemin',['AllocationSizeMin',['../struct_vma_stat_info.html#a61a834fa78bcf41fb5a53b286b2e1580',1,'VmaStatInfo']]], ['allocationsmoved',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]] ]; diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js index cb221fc..e73151c 100644 --- a/docs/html/search/variables_1.js +++ b/docs/html/search/variables_1.js @@ -1,5 +1,7 @@ var searchData= [ + ['blockcount',['BlockCount',['../struct_vma_stat_info.html#a9af0d9809007cf4a0009d324b2b8bbc9',1,'VmaStatInfo']]], + ['blocksize',['blockSize',['../struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676',1,'VmaPoolCreateInfo']]], ['bytesfreed',['bytesFreed',['../struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28',1,'VmaDefragmentationStats']]], ['bytesmoved',['bytesMoved',['../struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d',1,'VmaDefragmentationStats']]] ]; diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js index 60408e6..06fd7c5 100644 --- a/docs/html/search/variables_3.js +++ b/docs/html/search/variables_3.js @@ -1,4 +1,5 @@ var searchData= [ - ['flags',['flags',['../struct_vma_allocator_create_info.html#a35d3b42ac5a3be3758926819dc053859',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_memory_requirements.html#a53c9ea8c3cbcc12dddbe9ae23bb85eb6',1,'VmaMemoryRequirements::flags()']]] + ['flags',['flags',['../struct_vma_allocator_create_info.html#a35d3b42ac5a3be3758926819dc053859',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]], + ['frameinusecount',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]] ]; diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js index b23ec17..1002ad2 100644 --- a/docs/html/search/variables_4.js +++ b/docs/html/search/variables_4.js @@ -1,7 +1,10 @@ var searchData= [ ['maxallocationstomove',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]], + ['maxblockcount',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]], ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]], ['memoryheap',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]], - ['memorytype',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]] + ['memorytype',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], + ['memorytypeindex',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], + ['minblockcount',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]] ]; diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js index 7119d4d..2b404e1 100644 --- a/docs/html/search/variables_6.js +++ b/docs/html/search/variables_6.js @@ -6,8 +6,9 @@ var searchData= ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]], ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]], ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]], - ['preferredflags',['preferredFlags',['../struct_vma_memory_requirements.html#a6e105f836c2288034c711815b18226dc',1,'VmaMemoryRequirements']]], + ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]], + ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]], ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]], ['preferredsmallheapblocksize',['preferredSmallHeapBlockSize',['../struct_vma_allocator_create_info.html#ab435423d84d5ab26e2c347c51771f90a',1,'VmaAllocatorCreateInfo']]], - ['puserdata',['pUserData',['../struct_vma_memory_requirements.html#a8470093e93ed07ed2557490cdc67566a',1,'VmaMemoryRequirements::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]] + ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]] ]; diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js index 0a576b4..9505699 100644 --- a/docs/html/search/variables_7.js +++ b/docs/html/search/variables_7.js @@ -1,4 +1,4 @@ var searchData= [ - ['requiredflags',['requiredFlags',['../struct_vma_memory_requirements.html#a8876c1b0f112e13a277f16967064cfe0',1,'VmaMemoryRequirements']]] + ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]] ]; diff --git a/docs/html/search/variables_8.js b/docs/html/search/variables_8.js index 5261aad..740c955 100644 --- a/docs/html/search/variables_8.js +++ b/docs/html/search/variables_8.js @@ -1,8 +1,4 @@ var searchData= [ - ['size',['size',['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo']]], - ['suballocationcount',['SuballocationCount',['../struct_vma_stat_info.html#a09fb04b5491661c2e838d098d51bcead',1,'VmaStatInfo']]], - ['suballocationsizeavg',['SuballocationSizeAvg',['../struct_vma_stat_info.html#abb6c3e160a136787f474a18a8264d83b',1,'VmaStatInfo']]], - ['suballocationsizemax',['SuballocationSizeMax',['../struct_vma_stat_info.html#a6be7faf2b7fcff5a9bc017d90aed9271',1,'VmaStatInfo']]], - ['suballocationsizemin',['SuballocationSizeMin',['../struct_vma_stat_info.html#a9dc0b50fab2f10ab99366b79424bf14b',1,'VmaStatInfo']]] + ['size',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]] ]; diff --git a/docs/html/search/variables_a.js b/docs/html/search/variables_a.js index cc1a3e7..91686af 100644 --- a/docs/html/search/variables_a.js +++ b/docs/html/search/variables_a.js @@ -1,10 +1,11 @@ var searchData= [ ['unusedbytes',['UnusedBytes',['../struct_vma_stat_info.html#a394d2aef4348cb58abf73764804b4f2d',1,'VmaStatInfo']]], - ['unusedrangecount',['UnusedRangeCount',['../struct_vma_stat_info.html#a56c4fb4dba646479180b601854cde2a6',1,'VmaStatInfo']]], + ['unusedrangecount',['UnusedRangeCount',['../struct_vma_stat_info.html#a56c4fb4dba646479180b601854cde2a6',1,'VmaStatInfo::UnusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]], ['unusedrangesizeavg',['UnusedRangeSizeAvg',['../struct_vma_stat_info.html#a88ad9bdc2b3a98964a4d0c338c0c9060',1,'VmaStatInfo']]], ['unusedrangesizemax',['UnusedRangeSizeMax',['../struct_vma_stat_info.html#a10c52c0841f01ca704e8ddb1ea6a635d',1,'VmaStatInfo']]], ['unusedrangesizemin',['UnusedRangeSizeMin',['../struct_vma_stat_info.html#a07c508f42a4d3424bd0c259784a7f2d6',1,'VmaStatInfo']]], - ['usage',['usage',['../struct_vma_memory_requirements.html#ab588497177a57847ed04e0a1aef54bbe',1,'VmaMemoryRequirements']]], + ['unusedsize',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]], + ['usage',['usage',['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo']]], ['usedbytes',['UsedBytes',['../struct_vma_stat_info.html#a86f82cb9cffd456b9da63eaf26c9ff04',1,'VmaStatInfo']]] ]; diff --git a/docs/html/struct_vma_allocation_create_info-members.html b/docs/html/struct_vma_allocation_create_info-members.html new file mode 100644 index 0000000..1b63856 --- /dev/null +++ b/docs/html/struct_vma_allocation_create_info-members.html @@ -0,0 +1,82 @@ + + + + + + + +Vulkan Memory Allocator: Member List + + + + + + + + + +
      +
      + + + + + + +
      +
      Vulkan Memory Allocator +
      +
      +
      + + + + + + + + +
      +
      + + +
      + +
      + +
      +
      +
      +
      VmaAllocationCreateInfo Member List
      +
      + + + + + diff --git a/docs/html/struct_vma_allocation_create_info.html b/docs/html/struct_vma_allocation_create_info.html new file mode 100644 index 0000000..691f0eb --- /dev/null +++ b/docs/html/struct_vma_allocation_create_info.html @@ -0,0 +1,208 @@ + + + + + + + +Vulkan Memory Allocator: VmaAllocationCreateInfo Struct Reference + + + + + + + + + +
      +
      + + + + + + +
      +
      Vulkan Memory Allocator +
      +
      +
      + + + + + + + + +
      +
      + + +
      + +
      + +
      +
      + +
      +
      VmaAllocationCreateInfo Struct Reference
      +
      +
      + +

      #include <vk_mem_alloc.h>

      + + + + + + + + + + + + + + + + + + + + +

      +Public Attributes

      VmaAllocationCreateFlags flags
       Use VmaAllocationCreateFlagBits enum. More...
       
      VmaMemoryUsage usage
       Intended usage of memory. More...
       
      VkMemoryPropertyFlags requiredFlags
       Flags that must be set in a Memory Type chosen for an allocation. More...
       
      VkMemoryPropertyFlags preferredFlags
       Flags that preferably should be set in a Memory Type chosen for an allocation. More...
       
      void * pUserData
       Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo::pUserData and changed using vmaSetAllocationUserData(). More...
       
      VmaPool pool
       Pool that this allocation should be created in. More...
       
      +

      Member Data Documentation

      + +

      ◆ flags

      + +
      +
      + + + + +
      VmaAllocationCreateFlags VmaAllocationCreateInfo::flags
      +
      + +

      Use VmaAllocationCreateFlagBits enum.

      + +
      +
      + +

      ◆ pool

      + +
      +
      + + + + +
      VmaPool VmaAllocationCreateInfo::pool
      +
      + +

      Pool that this allocation should be created in.

      +

      Leave VK_NULL_HANDLE to allocate from general memory.

      + +
      +
      + +

      ◆ preferredFlags

      + +
      +
      + + + + +
      VkMemoryPropertyFlags VmaAllocationCreateInfo::preferredFlags
      +
      + +

      Flags that preferably should be set in a Memory Type chosen for an allocation.

      +

      Set to 0 if no additional flags are prefered and only requiredFlags should be used.
      +If not 0, it must be a superset or equal to requiredFlags.
      +If pool is not null, this member is ignored.

      + +
      +
      + +

      ◆ pUserData

      + +
      +
      + + + + +
      void* VmaAllocationCreateInfo::pUserData
      +
      + +

      Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo::pUserData and changed using vmaSetAllocationUserData().

      + +
      +
      + +

      ◆ requiredFlags

      + +
      +
      + + + + +
      VkMemoryPropertyFlags VmaAllocationCreateInfo::requiredFlags
      +
      + +

      Flags that must be set in a Memory Type chosen for an allocation.

      +

      Leave 0 if you specify requirement via usage.
      +If pool is not null, this member is ignored.

      + +
      +
      + +

      ◆ usage

      + +
      +
      + + + + +
      VmaMemoryUsage VmaAllocationCreateInfo::usage
      +
      + +

      Intended usage of memory.

      +

      Leave VMA_MEMORY_USAGE_UNKNOWN if you specify requiredFlags. You can also use both.
      +If pool is not null, this member is ignored.

      + +
      +
      +
      The documentation for this struct was generated from the following file: +
      + + + + diff --git a/docs/html/struct_vma_allocation_info.html b/docs/html/struct_vma_allocation_info.html index aff38a5..9b32904 100644 --- a/docs/html/struct_vma_allocation_info.html +++ b/docs/html/struct_vma_allocation_info.html @@ -66,7 +66,7 @@ $(function() {
      -

      Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). +

      Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). More...

      #include <vk_mem_alloc.h>

      @@ -89,11 +89,11 @@ Public Attributes  Pointer to the beginning of this allocation as mapped data. Null if this alloaction is not persistently mapped. More...
        void * pUserData - Custom general-purpose pointer that was passed as VmaMemoryRequirements::pUserData or set using vmaSetAllocationUserData(). More...
      + Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vmaSetAllocationUserData(). More...
       

      Detailed Description

      -

      Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().

      +

      Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().

      Member Data Documentation

      ◆ deviceMemory

      @@ -109,7 +109,8 @@ Public Attributes

      Handle to Vulkan memory object.

      Same memory object can be shared by multiple allocations.

      -

      It can change after call to vmaDefragment() if this allocation is passed to the function.

      +

      It can change after call to vmaDefragment() if this allocation is passed to the function, or if allocation is lost.

      +

      If the allocation is lost, it is equal to VK_NULL_HANDLE.

      @@ -143,7 +144,7 @@ Public Attributes

      Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation.

      -

      It can change after call to vmaDefragment() if this allocation is passed to the function.

      +

      It can change after call to vmaDefragment() if this allocation is passed to the function, or if allocation is lost.

      @@ -160,7 +161,7 @@ Public Attributes

      Pointer to the beginning of this allocation as mapped data. Null if this alloaction is not persistently mapped.

      -

      It can change after call to vmaUnmapPersistentlyMappedMemory(), vmaMapPersistentlyMappedMemory(). It can also change after call to vmaDefragment() if this allocation is passed to the function.

      +

      It can change after call to vmaUnmapPersistentlyMappedMemory(), vmaMapPersistentlyMappedMemory(). It can also change after call to vmaDefragment() if this allocation is passed to the function.

      @@ -176,7 +177,7 @@ Public Attributes
      -

      Custom general-purpose pointer that was passed as VmaMemoryRequirements::pUserData or set using vmaSetAllocationUserData().

      +

      Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vmaSetAllocationUserData().

      It can change after call to vmaSetAllocationUserData() for this allocation.

      @@ -194,7 +195,7 @@ Public Attributes

      Size of this allocation, in bytes.

      -

      It never changes.

      +

      It never changes, unless allocation is lost.

      diff --git a/docs/html/struct_vma_allocator_create_info-members.html b/docs/html/struct_vma_allocator_create_info-members.html index dbc84dd..63f4c83 100644 --- a/docs/html/struct_vma_allocator_create_info-members.html +++ b/docs/html/struct_vma_allocator_create_info-members.html @@ -67,11 +67,12 @@ $(function() { - - - - - + + + + + +
      deviceVmaAllocatorCreateInfo
      flagsVmaAllocatorCreateInfo
      pAllocationCallbacksVmaAllocatorCreateInfo
      pDeviceMemoryCallbacksVmaAllocatorCreateInfo
      physicalDeviceVmaAllocatorCreateInfo
      preferredLargeHeapBlockSizeVmaAllocatorCreateInfo
      preferredSmallHeapBlockSizeVmaAllocatorCreateInfo
      frameInUseCountVmaAllocatorCreateInfo
      pAllocationCallbacksVmaAllocatorCreateInfo
      pDeviceMemoryCallbacksVmaAllocatorCreateInfo
      physicalDeviceVmaAllocatorCreateInfo
      preferredLargeHeapBlockSizeVmaAllocatorCreateInfo
      preferredSmallHeapBlockSizeVmaAllocatorCreateInfo