package Ġde . fab max . k ool . platform . vk Ċ Ċ import Ġde . fab max . k ool . util . log D Ċ import Ġorg . lwjgl . Pointer Buffer Ċ import Ġorg . lwjgl . system . Memory Util Ċ import Ġorg . lwjgl . util . v ma . V ma .* Ċ import Ġorg . lwjgl . util . v ma . V ma Allocation CreateInfo Ċ import Ġorg . lwjgl . util . v ma . V ma Allocator CreateInfo Ċ import Ġorg . lwjgl . util . v ma . V ma Vulkan Functions Ċ import Ġorg . lwjgl . v ulkan . VK 1 0 .* Ċ import Ġorg . lwjgl . v ulkan . Vk Buffer CreateInfo Ċ import Ġorg . lwjgl . v ulkan . Vk Image CreateInfo Ċ import Ġorg . lwjgl . v ulkan . Vk Memory Requirements Ċ import Ġjava . nio . Long Buffer Ċ Ċ class ĠMemory Manager ( val Ġsys : ĠVk System ) Ġ: ĠVk Resource () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġimpl : ĠI Mem Manager ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġimpl Ġ= ĠV ma Mem Manager ( sys ) ĊĠĠĠĠĠĠĠ Ġ// impl Ġ= ĠNa ive Mem Manager ( sys ) ĊĠĠĠĠĠĠĠ Ġsys . device . add Depend ing Resource ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Buffer ( buffer Info : ĠVk Buffer CreateInfo , Ġalloc Usage : ĠInt , Ġp Buffer : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ) Ġ= ĊĠĠĠĠĠĠĠ Ġimpl . create Buffer ( buffer Info , Ġalloc Usage , Ġp Buffer , Ġp Allocation ) ĊĠĠĠ Ġfun Ġfree Buffer ( buffer : ĠLong , Ġallocation : ĠLong ) Ġ= Ġimpl . free Buffer ( buffer , Ġallocation ) ĊĊĠĠĠ Ġfun Ġcreate Image ( image Info : ĠVk Image CreateInfo , Ġalloc Usage : ĠInt , Ġp Image : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ) Ġ= ĊĠĠĠĠĠĠĠ Ġimpl . create Image ( image Info , Ġalloc Usage , Ġp Image , Ġp Allocation ) ĊĠĠĠ Ġfun Ġfree Image ( image : ĠLong , Ġallocation : ĠLong ) Ġ= Ġimpl . free Image ( image , Ġallocation ) ĊĊĠĠĠ Ġfun Ġmap Memory ( allocation : ĠLong ) Ġ= Ġimpl . map Memory ( allocation ) ĊĠĠĠ Ġfun Ġun map Memory ( allocation : ĠLong ) Ġ= Ġimpl . un map Memory ( allocation ) ĊĊĠĠĠ Ġoverride Ġfun Ġfree Resources () Ġ= Ġimpl . free Resources () ĊĊĠĠĠ Ġinterface ĠI Mem Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Buffer ( buffer Info : ĠVk Buffer CreateInfo , Ġalloc Usage : ĠInt , Ġp Buffer : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ): ĠInt ĊĠĠĠĠĠĠĠ Ġfun Ġfree Buffer ( buffer : ĠLong , Ġallocation : ĠLong ) ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Image ( image Info : ĠVk Image CreateInfo , Ġalloc Usage : ĠInt , Ġp Image : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ): ĠInt ĊĠĠĠĠĠĠĠ Ġfun Ġfree Image ( image : ĠLong , Ġallocation : ĠLong ) ĊĠĠĠĠĠĠĠ Ġfun Ġmap Memory ( allocation : ĠLong ): ĠLong ĊĠĠĠĠĠĠĠ Ġfun Ġun map Memory ( allocation : ĠLong ) ĊĠĠĠĠĠĠĠ Ġfun Ġfree Resources () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠV ma Mem Manager ( val Ġsys : ĠVk System ) Ġ: ĠI Mem Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġallocator : ĠLong ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvk Functions Ġ= ĠV ma Vulkan Functions . calloc Stack ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Caps Ġ= Ġsys . physical Device . vk PhysicalDevice . capabilities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Caps Ġ= Ġsys . device . vk Device . capabilities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Memory Properties ( p Caps . vkGet PhysicalDevice Memory Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Properties ( p Caps . vkGet PhysicalDevice Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Allocate Memory ( d Caps . vk Allocate Memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Bind Buffer Memory ( d Caps . vk Bind Buffer Memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Bind Image Memory ( d Caps . vk Bind Image Memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd Copy Buffer ( d Caps . vkCmd Copy Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Buffer ( d Caps . vk Create Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Image ( d Caps . vk Create Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Buffer ( d Caps . vk Destroy Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Image ( d Caps . vk Destroy Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Flush Mapped Memory Ranges ( d Caps . vk Flush Mapped Memory Ranges ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Free Memory ( d Caps . vk Free Memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet Buffer Memory Requirements ( d Caps . vkGet Buffer Memory Requirements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet Buffer Memory Requirements 2 KHR ( d Caps . vkGet Buffer Memory Requirements 2 KHR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet Image Memory Requirements ( d Caps . vkGet Image Memory Requirements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet Image Memory Requirements 2 KHR ( d Caps . vkGet Image Memory Requirements 2 KHR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Invalidate Mapped Memory Ranges ( d Caps . vk Invalidate Mapped Memory Ranges ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Map Memory ( d Caps . vk Map Memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Un map Memory ( d Caps . vk Un map Memory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallocator Info Ġ= ĠV ma Allocator CreateInfo . calloc Stack ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġphysical Device ( sys . physical Device . vk PhysicalDevice ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice ( sys . device . vk Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Vulkan Functions ( vk Functions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpp Ġ= Ġmalloc Pointer ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Create Allocator ( allocator Info , Ġpp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallocator Ġ= Ġpp [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D Ġ{ Ġ" Created ĠV MA Ġmemory Ġallocator " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Buffer ( buffer Info : ĠVk Buffer CreateInfo , Ġalloc Usage : ĠInt , Ġp Buffer : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalloc Info Ġ= ĠV ma Allocation CreateInfo . calloc Stack ( this ). apply Ġ{ Ġusage ( alloc Usage ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Create Buffer ( allocator , Ġbuffer Info , Ġalloc Info , Ġp Buffer , Ġp Allocation , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfree Buffer ( buffer : ĠLong , Ġallocation : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Destroy Buffer ( allocator , Ġbuffer , Ġallocation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Image ( image Info : ĠVk Image CreateInfo , Ġalloc Usage : ĠInt , Ġp Image : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalloc Info Ġ= ĠV ma Allocation CreateInfo . calloc Stack ( this ). apply Ġ{ Ġusage ( alloc Usage ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Create Image ( allocator , Ġimage Info , Ġalloc Info , Ġp Image , Ġp Allocation , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfree Image ( image : ĠLong , Ġallocation : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Destroy Image ( allocator , Ġimage , Ġallocation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmap Memory ( allocation : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpp Ġ= Ġmalloc Pointer ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Map Memory ( allocator , Ġallocation , Ġpp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpp [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġun map Memory ( allocation : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Un map Memory ( allocator , Ġallocation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġprint Memory Stats () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpp Ġ= Ġmalloc Pointer ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Build Stats String ( allocator , Ġpp , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠMemory Util . mem ASCII ( pp [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Free Stats String ( allocator , ĠMemory Util . mem ByteBuffer ( pp [ 0 ], Ġstr . length Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfree Resources () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ma Destroy Allocator ( allocator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D Ġ{ Ġ" Destroyed ĠV MA Ġmemory Ġallocator " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNa ive Mem Manager ( val Ġsys : ĠVk System ) Ġ: ĠI Mem Manager Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclass ĠBuffer Info ( val Ġbuffer : ĠLong , Ġval Ġmemory : ĠLong , Ġval Ġsize : ĠLong , Ġval Ġalloc Usage : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġallocated Buffers Ġ= Ġmutable Map Of < Long , ĠBuffer Info >() ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D Ġ{ Ġ" Created Ġna ive Ġmemory Ġallocator " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Buffer ( buffer Info : ĠVk Buffer CreateInfo , Ġalloc Usage : ĠInt , Ġp Buffer : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġvk Create Buffer ( sys . device . vk Device , Ġbuffer Info , Ġnull , Ġp Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= ĠVK _ SUCCESS ) Ġ{ Ġreturn Ġres Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġget Properties For Allocation Usage ( alloc Usage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Requirements Ġ= ĠVk Memory Requirements . malloc Stack ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet Buffer Memory Requirements ( sys . device . vk Device , Ġp Buffer [ 0 ], Ġmem Requirements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalloc Info Ġ= Ġcalloc Vk Memory Allocate Info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type ( VK _ STRUCTURE _ TYPE _ MEMORY _ ALLOC ATE _ INFO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallocation Size ( mem Requirements . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Type Index ( sys . physical Device . find Memory Type ( mem Requirements . memory Type Bits (), Ġproperties )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġmalloc Long ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ= Ġvk Allocate Memory ( sys . device . vk Device , Ġalloc Info , Ġnull , Ġlp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= ĠVK _ SUCCESS ) Ġ{ Ġreturn Ġres Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Allocation . put ( 0 , Ġlp [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ= Ġvk Bind Buffer Memory ( sys . device . vk Device , Ġp Buffer [ 0 ], Ġlp [ 0 ], Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= ĠVK _ SUCCESS ) Ġ{ Ġreturn Ġres Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallocated Buffers [ p Allocation [ 0 ]] Ġ= ĠBuffer Info ( p Buffer [ 0 ], Ġp Allocation [ 0 ], Ġbuffer Info . size (), Ġalloc Usage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVK _ SUCCESS ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfree Buffer ( buffer : ĠLong , Ġallocation : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Info Ġ= Ġallocated Buffers . remove ( allocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Buffer ( sys . device . vk Device , Ġbuffer , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Free Memory ( sys . device . vk Device , Ġit . memory , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Image ( image Info : ĠVk Image CreateInfo , Ġalloc Usage : ĠInt , Ġp Image : ĠLong Buffer , Ġp Allocation : ĠPointer Buffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres Ġ= Ġvk Create Image ( sys . device . vk Device , Ġimage Info , Ġnull , Ġp Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= ĠVK _ SUCCESS ) Ġ{ Ġreturn Ġres Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġget Properties For Allocation Usage ( alloc Usage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Requirements Ġ= ĠVk Memory Requirements . malloc Stack ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet Image Memory Requirements ( sys . device . vk Device , Ġp Image [ 0 ], Ġmem Requirements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalloc Info Ġ= Ġcalloc Vk Memory Allocate Info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type ( VK _ STRUCTURE _ TYPE _ MEMORY _ ALLOC ATE _ INFO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallocation Size ( mem Requirements . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Type Index ( sys . physical Device . find Memory Type ( mem Requirements . memory Type Bits (), Ġproperties )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġmalloc Long ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ= Ġvk Allocate Memory ( sys . device . vk Device , Ġalloc Info , Ġnull , Ġlp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= ĠVK _ SUCCESS ) Ġ{ Ġreturn Ġres Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Allocation . put ( 0 , Ġlp [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ= Ġvk Bind Image Memory ( sys . device . vk Device , Ġp Image [ 0 ], Ġlp [ 0 ], Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= ĠVK _ SUCCESS ) Ġ{ Ġreturn Ġres Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallocated Buffers [ p Allocation [ 0 ]] Ġ= ĠBuffer Info ( p Image [ 0 ], Ġp Allocation [ 0 ], Ġmem Requirements . size (), Ġalloc Usage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVK _ SUCCESS ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfree Image ( image : ĠLong , Ġallocation : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Info Ġ= Ġallocated Buffers . remove ( allocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Image ( sys . device . vk Device , Ġimage , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Free Memory ( sys . device . vk Device , Ġit . memory , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmap Memory ( allocation : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Info Ġ= Ġallocated Buffers [ allocation ] Ġ?: Ġthrow ĠIllegalArgumentException (" Invalid Ġallocation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmem Stack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmalloc Pointer ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Map Memory ( sys . device . vk Device , Ġallocation , Ġ 0 L , Ġbuffer Info . size , Ġ 0 , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġun map Memory ( allocation : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Un map Memory ( sys . device . vk Device , Ġallocation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfree Resources () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D Ġ{ Ġ" Destroyed Ġna ive Ġmemory Ġallocator " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Properties For Allocation Usage ( alloc Usage : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( alloc Usage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV MA _ MEMORY _ USAGE _ CPU _ ONLY Ġ-> ĠVK _ MEMORY _ PROPERTY _ HOST _ VISIBLE _ BIT Ġor ĠVK _ MEMORY _ PROPERTY _ HOST _ CO HER ENT _ BIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV MA _ MEMORY _ USAGE _ CPU _ TO _ GPU Ġ-> ĠVK _ MEMORY _ PROPERTY _ HOST _ VISIBLE _ BIT Ġor ĠVK _ MEMORY _ PROPERTY _ HOST _ CO HER ENT _ BIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV MA _ MEMORY _ USAGE _ GPU _ ONLY Ġ-> ĠVK _ MEMORY _ PROPERTY _ DEVICE _ LOCAL _ BIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġallocation Ġusage : Ġ$ alloc Usage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }