package Ġplot čĊč Ċ import Ġplatform . posix .* č Ċ import Ġplatform . windows . Get Module Handle č Ċ import Ġkotlinx . c interop .* č Ċ import Ġkotlin . native . concurrent . Detached Object Graph č Ċ import Ġkotlin . native . concurrent . attach čĊč Ċ import Ġv ulkan .* č Ċ import Ġglfw .* čĊč Ċ fun Ġload Shader ( fileName : String , Ġvk _ l device : VkDevice ) Ġ= Ġmem Scoped Ġ{ čĊĠĠĠ Ġfun Ġfail (): ĠNothing Ġ= Ġthrow ĠError (" Cannot Ġread Ġinput Ġfile Ġ$ fileName ") čĊčĊĠĠĠ Ġval Ġsize Ġ= Ġalloc < stat >(). also Ġ{ Ġif Ġ( stat ( fileName , Ġit . ptr ) Ġ!= Ġ 0 ) Ġfail () Ġ}. st _ size čĊĠĠĠ Ġval Ġfile Ġ= Ġplatform . posix . fopen ( fileName , Ġ" rb ") Ġ?: Ġfail () čĊĠĠĠ Ġval Ġbuf Ġ= ĠByteArray ( size . toInt ()). also Ġ{ čĊĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġf read ( it . ref To ( 0 ), Ġ 1 , Ġsize . convert (), Ġfile ) čĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfclose ( file ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġval Ġshader Module Ġ= Ġalloc < Vk Shader Module Var >() čĊĠĠĠ Ġbuf . use Pin ned Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġcreate Info Ġ= Ġalloc < Vk Shader Module CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ SHADER _ MODULE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode Size Ġ= Ġsize . to UL ong () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Code Ġ= Ġit . address Of ( 0 ) Ġas ĠC Pointer < uint 3 2 _ t Var > čĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġif ( vk Create Shader Module ( vk _ l device , Ġcreate Info . ptr , Ġnull , Ġshader Module . ptr )!= VK _ SUCCESS ) ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Failed Ġto Ġload Ġshader Ġvertex Ġshader ") čĊĠĠĠ Ġ} čĊĠĠĠ Ġshader Module . value č Ċ } čĊč Ċ fun Ġver ( a : ĠUInt , Ġb : ĠUInt , Ġc : ĠUInt ): ĠUInt Ġ= Ġ(( a Ġshl Ġ 2 2 ) Ġor Ġ( b Ġshl Ġ 1 2 ) Ġor Ġc ) č Ċ fun Ġma ( version : ĠUInt ): ĠUInt Ġ= Ġ( version Ġshr Ġ 2 2 ) č Ċ fun Ġmi ( version : ĠUInt ): ĠUInt Ġ= Ġ(( version Ġshr Ġ 1 2 ) Ġand Ġ( 0 x 3 ff ). to UInt ()) č Ċ fun Ġpa ( version : ĠUInt ): ĠUInt Ġ= Ġ( version Ġand Ġ( 0 xfff ). to UInt ()) čĊč Ċ fun Ġfind Mem Index ( l bits : UInt , Ġmemory Properties : Vk PhysicalDevice Memory Properties , Ġproperties : Vk Memory Property Flags ): UInt Ġ{ čĊĠĠĠ Ġvar Ġmem Index Ġ= Ġ 0 u čĊĠĠĠ Ġvar Ġbits Ġ= Ġl bits čĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 u Ġuntil Ġmemory Properties . memory Type Count ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(( bits Ġand Ġ 1 u ) Ġ== Ġ 1 u ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( memory Properties . memory Types [ i . toInt ()]. property Flags Ġand Ġproperties ) Ġ== Ġproperties ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Index Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġbits Ġ= Ġbits Ġshr Ġ( 1 ) čĊĠĠĠ Ġ} čĊĠĠĠ Ġreturn Ġmem Index č Ċ } čĊč Ċ fun Ġcreate Buffer And Memory ( čĊĠĠĠ Ġscope : Mem Scope , čĊĠĠĠ Ġi buffer : Vk Buffer Var , čĊĠĠĠ Ġ ime m ory : VkDevice Memory Var , čĊĠĠĠ Ġvk _ l device : VkDevice , čĊĠĠĠ Ġvk _ p device : Vk PhysicalDevice , čĊĠĠĠ Ġis ize : UL ong , ĠčĊĠĠĠ Ġo buffer : ĠVk Buffer Var , ĠčĊĠĠĠ Ġo memory : ĠVk Device Memory Var , čĊĠĠĠ Ġbuffer : ĠAny , čĊĠĠĠ Ġbit Usage : ĠVk Buffer Usage Flag Bits čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠ Ġwith ( scope ) Ġ{ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvertex Buffer Info Ġ= Ġalloc < Vk Buffer CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ BUFFER _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġis ize čĊĠĠĠĠĠĠĠĠĠĠĠ Ġusage Ġ= ĠVK _ BUFFER _ USAGE _ TRANSFER _ SRC _ BIT čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Buffer ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Buffer Info . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi buffer . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġbuffer ") čĊčĊĠĠĠĠĠĠĠ Ġval Ġmem Req s : ĠVk Memory Requirements Ġ= Ġalloc () čĊĠĠĠĠĠĠĠ ĠvkGet Buffer Memory Requirements ( vk _ l device , Ġi buffer . value , Ġmem Req s . ptr ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġval Ġmemory Allocate Info Ġ= Ġalloc < Vk Memory Allocate Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ MEMORY _ ALLOC ATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġallocation Size Ġ= Ġmem Req s . size čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġmemory Properties : ĠVk PhysicalDevice Memory Properties Ġ= Ġalloc () čĊĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Memory Properties ( vk _ p device , Ġmemory Properties . ptr ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġmemory Allocate Info . memory Type Index Ġ= Ġfind Mem Index ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Req s . memory Type Bits , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Properties , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ MEMORY _ PROPERTY _ HOST _ VISIBLE _ BIT Ġor ĠVK _ MEMORY _ PROPERTY _ HOST _ CO HER ENT _ BIT čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġmapped Ġ= Ġalloc < CO pa que Pointer Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Allocate Memory ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Allocate Info . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ ime m ory . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Fail d Ġallocate Ġmemory ") čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Map Memory ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ ime m ory . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 u , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Allocate Info . allocation Size , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 u , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapped . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= VK _ SUCCESS čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Fail d Ġmap Ġmemory ") čĊĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġif ( buffer Ġis ĠFloat Array ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . use Pin ned Ġ{ Ġbuf Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplatform . posix . memcpy ( mapped . value , Ġbuf . address Of ( 0 ), Ġis ize ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} else Ġif ( buffer Ġis ĠUInt Array ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . use Pin ned Ġ{ Ġbuf Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplatform . posix . memcpy ( mapped . value , Ġbuf . address Of ( 0 ), Ġis ize ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġvk Un map Memory ( vk _ l device , Ġ ime m ory . value ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Bind Buffer Memory ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi buffer . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ ime m ory . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" failed Ġbind Ġmemory ") čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġvertex Buffer Info . usage Ġ= Ġbit Usage čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġif Ġ( vk Create Buffer ( vk _ l device , Ġvertex Buffer Info . ptr , Ġnull , Ġo buffer . ptr )!= VK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġbuffer ") čĊĠĠĠĠĠĠĠ ĠvkGet Buffer Memory Requirements ( vk _ l device , Ġo buffer . value , Ġmem Req s . ptr ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġmemory Allocate Info . allocation Size Ġ= Ġmem Req s . size čĊĠĠĠĠĠĠĠ Ġmemory Allocate Info . memory Type Index Ġ= Ġfind Mem Index ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Req s . memory Type Bits , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Properties , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ MEMORY _ PROPERTY _ DEVICE _ LOCAL _ BIT čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġif Ġ( vk Allocate Memory ( vk _ l device , Ġmemory Allocate Info . ptr , Ġnull , Ġo memory . ptr )!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Fail d Ġallocate Ġmemory ") čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġif Ġ( vk Bind Buffer Memory ( vk _ l device , Ġo buffer . value , Ġo memory . value , Ġ 0 u )!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" failed Ġbind Ġmemory ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠ Ġ} č Ċ } čĊč Ċ val Ġmodes : ĠArrayList < Vk Present Mode KHR > Ġ= ĠArrayList () č Ċ var Ġpresent et ion Mode : ĠVk Present Mode KHR Ġ= ĠVK _ PRESENT _ MODE _ FIFO _ KHR č Ċ var Ġcolor Space : ĠVk Color Space KHR Ġ= ĠUInt . MAX _ VALUE č Ċ var Ġswap Chain Format : ĠVk Format Ġ= ĠUInt . MAX _ VALUE čĊč Ċ fun Ġmain () Ġ= Ġmem Scoped Ġ{ čĊčĊĠĠĠ Ġ// # 1 Ġcreate ĠGLFW Ġinstance čĊĠĠĠ Ġif Ġ( glfw Init () Ġ== ĠGLFW _ FALSE ) Ġ{ čĊĠĠĠĠĠĠĠ Ġthrow ĠError (" Failed Ġto Ġinitialize ĠGLFW ") čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġglfw Window Hint ( GLFW _ CLIENT _ API , ĠGLFW _ NO _ API ) čĊĠĠĠ Ġglfw Window Hint ( GLFW _ RE SIZ ABLE , ĠGLFW _ FALSE ) čĊčĊĠĠĠ Ġval Ġwindow Ġ= Ġglfw Create Window ( 6 4 0 , Ġ 4 8 0 , Ġ" Vulkan ", Ġnull , Ġnull ) Ġ?: čĊĠĠĠ Ġthrow ĠError (" Failed Ġto Ġopen ĠGLFW Ġwindow . ĠIf Ġyou Ġhave Ġan ĠIntel ĠGPU , Ġthey Ġare Ġnot Ġ 3 . 3 Ġcompatible . ĠTry Ġthe Ġ 2 . 1 Ġversion Ġof Ġthe Ġtutorials .") čĊčĊĠĠĠ Ġglfw Make Context Current ( window ) čĊĠĠĠĠčĊĠĠĠ Ġval Ġextensions : ĠMutable List < String > Ġ= ĠArrayList () čĊĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġext Ġ= Ġglfw Get Required Instance Extensions ( count . ptr ); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions . addAll ( Array ( count . value . toInt ()) Ġ{ Ġext ! ![ it ] !!. to K String () Ġ}) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextensions Count Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions Count . value Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠVk Result čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġvk Enumerate Instance Extension Properties ( null , Ġextensions Count . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġresult Ġ!= ĠVK _ SUCCESS Ġ) Ġthrow ĠRuntimeException (" Could Ġnot Ġenumerate Ġinstance Ġextensions .") čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extensions Count . value Ġ== Ġ 0 u ) Ġbreak čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġalloc Array < Vk Extension Properties >( extensions Count . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġvk Enumerate Instance Extension Properties ( null , Ġextensions Count . ptr , Ġbuffer ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġextensions Count . value . toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġext Ġ= Ġbuffer [ i ]. extension Name . to K String () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! extensions . contains ( ext )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextensions . add ( ext ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( result Ġ== ĠVK _ IN COMPLETE ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln ( extensions ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġdebug Supported Ġ= Ġextensions . contains (" VK _ EXT _ debug _ report ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġavailable Layers Ġ= Ġmutable ListOf < String >() čĊĠĠĠĠĠĠĠ Ġvar Ġcallback Ġ= Ġalloc < Vk Debug Report Callback EXT Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 2 Ġcreate ĠV ul can Ġinstance Ġand Ġdebug Ġcallback čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvk _ instance Ġ= Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġac Info Ġ= Ġalloc < Vk Instance CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ INSTANCE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Application Info Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Layer Count Ġ= Ġ 0 U čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpp Enabled Layer Names Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Extension Count Ġ= Ġextensions . size . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpp Enabled Extension Names Ġ= Ġextensions . to CString Array ( mem Scope ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( debug Supported ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayers Ġ= ĠarrayOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VK _ LAYER _ GOOGLE _ threading ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VK _ LAYER _ L UN ARG _ parameter _ validation ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VK _ LAYER _ L UN ARG _ object _ tracker ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VK _ LAYER _ L UN ARG _ core _ validation ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VK _ LAYER _ GOOGLE _ unique _ objects ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VK _ LAYER _ L UN ARG _ standard _ validation " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayers Count Ġ= Ġalloc < UInt Var >() čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult 1 : ĠVk Result čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġfailure @{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult 1 Ġ= Ġvk Enumerate Instance Layer Properties ( layers Count . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result 1 Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Failed Ġto Ġenumerate Ġdebug Ġlayers ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Layers . clear () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ failure Ġ// Ġfailed Ġto Ġget Ġlayers Ġbreak Ġthe Ġloop čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġalloc Array < Vk Layer Properties >( layers Count . value . toInt ()) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult 1 Ġ= Ġvk Enumerate Instance Layer Properties ( layers Count . ptr , Ġbuffer ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result 1 Ġ!= VK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" File d Ġto Ġenumerate ĠDebug ĠLay ers Ġto Ġbuffer ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Layers . clear () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ failure Ġ// Ġfailed Ġto Ġget Ġlayers Ġbreak Ġthe Ġloop čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlayers Count . value . toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= Ġbuffer [ i ]. layer Name . to K String () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Found Ġ$ layer Ġlayer ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! available Layers . contains ( layer ) Ġ&& Ġlayers . contains ( layer )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Layers . add ( layer ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ layer Ġadded ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( result 1 Ġ== ĠVK _ IN COMPLETE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( available Layers . size Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( available Layers . contains (" VK _ LAYER _ L UN ARG _ standard _ validation ")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Layers . removeAll Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= Ġ" VK _ LAYER _ L UN ARG _ standard _ validation " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Layers . sortBy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayers . indexOf ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Setting Ġup ĠLay ers :") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Layers . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġac Info . enabled Layer Count Ġ= Ġavailable Layers . size . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġac Info . pp Enabled Layer Names Ġ= Ġavailable Layers . to CString Array ( mem Scope ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġalloc < Vk Instance Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġvk CreateInstance ( ac Info . ptr , Ġnull , Ġoutput . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result != VK _ SUCCESS ) ĠčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Error Ġinitializing ĠVulkan ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( debug Supported Ġ&& Ġavailable Layers . size Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdbg CreateInfo Ġ= Ġalloc < Vk Debug Report Callback CreateInfo EXT >(). apply Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ DEBUG _ REPORT _ CALLBACK _ CREATE _ INFO _ EXT . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠVK _ DEBUG _ REPORT _ INFORMATION _ BIT _ EXT Ġor ĠVK _ DEBUG _ REPORT _ WARNING _ BIT _ EXT Ġor čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ DEBUG _ REPORT _ PER FORMANCE _ WARNING _ BIT _ EXT Ġor ĠVK _ DEBUG _ REPORT _ ERROR _ BIT _ EXT Ġor čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ DEBUG _ REPORT _ DEBUG _ BIT _ EXT čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp fn Callback Ġ= Ġstatic C Function Ġ{ Ġflags , Ġ_, Ġ_, Ġ_, Ġmsg Code , Ġp Layer Prefix , Ġp Msg , Ġ_ Ġ-> čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprefix Ġ= Ġ" k var c -" čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠVK _ DEBUG _ REPORT _ ERROR _ BIT _ EXT Ġ> Ġ 0 u Ġ-> Ġprefix Ġ+= Ġ" ERROR :" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠVK _ DEBUG _ REPORT _ WARNING _ BIT _ EXT Ġ> Ġ 0 u Ġ-> Ġprefix Ġ+= Ġ" WARNING :" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠVK _ DEBUG _ REPORT _ PER FORMANCE _ WARNING _ BIT _ EXT Ġ> Ġ 0 u Ġ-> Ġprefix Ġ+= Ġ" PER FORMANCE :" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠVK _ DEBUG _ REPORT _ INFORMATION _ BIT _ EXT Ġ> Ġ 0 u Ġ-> Ġprefix Ġ+= Ġ" INFO :" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠVK _ DEBUG _ REPORT _ DEBUG _ BIT _ EXT Ġ> Ġ 0 u Ġ-> Ġprefix Ġ+= Ġ" DEBUG :" čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdebug Message Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ prefix Ġ[ ${ p Layer Prefix ?. to K String () Ġ?: Ġ"" }] ĠCode Ġ$ msg Code :${ p Msg ?. to K String () Ġ?: Ġ"" }" čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand ĠVK _ DEBUG _ REPORT _ ERROR _ BIT _ EXT Ġ> Ġ 0 . to UInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( debug Message ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( debug Message ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Creating Ġdebug Ġcallback ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġk vk Create Debug Report Callback EXT : ĠPFN _ vk Create Debug Report Callback EXT ? Ġ= Ġnull čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk GetInstance Proc Addr ( output . value , Ġ" vk Create Debug Report Callback EXT ") ?. let Ġ{ Ġvoid Fun Ġ-> čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk vk Create Debug Report Callback EXT Ġ= Ġvoid Fun Ġas ĠPFN _ vk Create Debug Report Callback EXT čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk vk Create Debug Report Callback EXT ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdbg CreateInfo . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!= VK _ SUCCESS čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Add Ġlayers Ġcallback Ġfailed .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġkotlin . run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Add Ġlayers Ġcallback Ġfailed .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . value čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Vulkan Ġsuccessfully Ġinitialized ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! extensions . contains (" VK _ KHR _ surface ") Ġ|| ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! extensions . contains (" VK _ KHR _ win 3 2 _ surface ") čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Needed Ġextensions Ġnot Ġsupported ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 3 Ġcreate ĠV ul can Ġsurface čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvk _ surface Ġ= Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġalloc < Vk Surface KHR Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreate Info Ġ= Ġalloc < Vk Win 3 2 Surface CreateInfo KHR > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ WIN 3 2 _ SURFACE _ CREATE _ INFO _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh instance Ġ= ĠGet Module Handle !! ( null ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhwnd Ġ= Ġglfw Get Win 3 2 Window ( window ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġvk Create Win 3 2 Surface KHR ( vk _ instance , Ġcreate Info . ptr , Ġnull , Ġoutput . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġvk Ġsurface ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . value čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Vulkan Ġsurface Ġinitialized ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 4 Ġcreate ĠV ul can Ġphysical Ġsurface čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvk _ p device Ġ= Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= ĠVK _ IN COMPLETE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgpu Count Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġalloc < Vk PhysicalDevice Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer : ĠC Array Pointer < Vk PhysicalDevice Var >? Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( result Ġ== ĠVK _ IN COMPLETE ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġvk Enumerate Physical Devices ( vk _ instance , Ġgpu Count . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result Ġ!= ĠVK _ SUCCESS ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Could Ġnot Ġenumerate ĠGP Us .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Heap . free ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġnative Heap . alloc Array ( gpu Count . value . toInt ()) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġvk Enumerate Physical Devices ( vk _ instance , Ġgpu Count . ptr , Ġbuffer ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠVK _ IN COMPLETE Ġ&& Ġresult Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Could Ġnot Ġenumerate ĠGP Us .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . value Ġ= Ġbuffer ! ![ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġgpu Count . value . toInt ()) Ġ{ čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprops 1 Ġ= Ġalloc < Vk PhysicalDevice Properties >() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Properties ( buffer ! ![ i ], Ġprops 1 . ptr ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( props 1 . device Type Ġ== ĠVK _ PHYSICAL _ DEVICE _ TYPE _ DIS CRE TE _ GPU ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . value Ġ= Ġbuffer ! ![ i ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Selected Ġdevice Ġnumber Ġ${ i } Ġ- Ġsuccess ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Heap . free ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . value čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Vulkan Ġphysical Ġdevice Ġinitialized ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġprops : ĠVk PhysicalDevice Properties Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġalloc < Vk PhysicalDevice Properties >() čĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Properties ( vk _ p device , Ġoutput . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvk _ dev f trs Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġalloc < Vk PhysicalDevice Features >() čĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Features ( vk _ p device , Ġoutput . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcaps : ĠVk Surface Capabilities KHR Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Ġ= Ġalloc < Vk Surface Capabilities KHR >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠvkGet PhysicalDevice Surface Capabilities KHR ( vk _ p device , Ġvk _ surface , Ġoutput . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result Ġ!= ĠVK _ SUCCESS ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Failed Ġto Ġget Ġsurface Ġcapabilities ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġvk _ ext props Ġ= Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput : ĠArrayList < String > Ġ= ĠArrayList () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Enumerate Device Extension Properties ( vk _ p device , Ġnull , Ġcount . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġalloc Array < Vk Extension Properties >( count . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Enumerate Device Extension Properties ( vk _ p device , Ġnull , Ġcount . ptr , Ġarr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( arr [ i ]. extension Name . to K String ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġqueue F amilies Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠArrayList < Vk Queue Family Properties > Ġ= ĠArrayList () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount : ĠUInt Var Ġ= Ġalloc () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Queue Family Properties ( vk _ p device , Ġcount . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( count . value Ġ> Ġ 0 u ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġalloc Array < Vk Queue Family Properties >( count . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Queue Family Properties ( vk _ p device , Ġcount . ptr , Ġbuffer ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount . value . toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( buffer [ i ]) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġfound Graphics Queue Family Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġvar Ġfound Present Queue Family Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġvar Ġgraphics Queue Family Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠ Ġvar Ġpresent Queue Family Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 u Ġuntil Ġqueue F amilies . size . to UInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpresent Support Ġ= Ġalloc < Vk Bool 3 2 Var >(); čĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Surface Support KHR ( vk _ p device , Ġi , Ġvk _ surface , Ġpresent Support . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue F amilies [ i . toInt ()]. queue Count . toInt () Ġ> Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& ĠčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĠčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue F amilies [ i . toInt ()]. queue Flags . toInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand ĠčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ QUEUE _ GRAPH ICS _ BIT . toInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ> Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraphics Queue Family Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Graphics Queue Family Ġ= Ġtrue čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( present Support . value Ġ== Ġ 1 u ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent Queue Family Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Present Queue Family Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! found Present Queue Family Ġ&& Ġpresent Support . value Ġ== Ġ 1 u ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent Queue Family Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Present Queue Family Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( found Graphics Queue Family ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" queue Ġfamily Ġ# ${ graphics Queue Family } Ġsupports Ġgraphics ") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Present Queue Family ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" queue Ġfamily Ġ# ${ present Queue Family } Ġsupports Ġpresentation ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" could Ġnot Ġfind Ġa Ġvalid Ġqueue Ġfamily Ġwith Ġpresent Ġsupport ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" could Ġnot Ġfind Ġa Ġvalid Ġqueue Ġfamily Ġwith Ġgraphics Ġsupport ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġdev Fe ats : ĠVk PhysicalDevice Features Ġ= Ġvk _ dev f trs čĊĠĠĠĠĠĠĠ Ġvar Ġdev Ex ts : ĠArrayList < String > Ġ= Ġvk _ ext props čĊĠĠĠĠĠĠĠ Ġval Ġqueue C Infos : ĠArrayList < VkDevice Queue CreateInfo > Ġ= ĠArrayList () čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 5 Ġcreate ĠV ul can Ġlogical Ġdevice čĊĠĠĠĠĠĠĠ Ġval Ġvk _ l device Ġ= Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl device : ĠVk Device Var Ġ= Ġalloc < VkDevice Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Priority Ġ= Ġalloc ArrayOf ( 1 . 0 f ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Info Ġ= Ġalloc < VkDevice Queue CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ DEVICE _ QUEUE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Queue Prior ities Ġ= Ġqueue Priority čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue C Infos . add ( queue Info ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dev Ex ts . contains ( VK _ KHR _ SWAP CHAIN _ EXTENSION _ NAME )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdev Ex ts . add ( VK _ KHR _ SWAP CHAIN _ EXTENSION _ NAME ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Infos Ġ= Ġalloc Array < VkDevice Queue CreateInfo >( queue C Infos . size ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġqueue C Infos [ idx ++] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . flags Ġ= Ġinfo . flags čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . sType Ġ= Ġinfo . sType čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . flags Ġ= Ġinfo . flags čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pNext Ġ= Ġinfo . pNext čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . p Queue Prior ities Ġ= Ġinfo . p Queue Prior ities čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . queue Count Ġ= Ġinfo . queue Count čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . queue Family Index Ġ= Ġinfo . queue Family Index čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Info Ġ= Ġalloc < VkDevice CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ DEVICE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue CreateInfo Count Ġ= Ġqueue C Infos . size . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Queue Create Infos Ġ= Ġqueue Infos čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Enabled Features Ġ= Ġdev Fe ats . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Layer Count Ġ= Ġ 0 U čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dev Ex ts . size Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Info . enabled Extension Count Ġ= Ġdev Ex ts . size . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Info . pp Enabled Extension Names Ġ= Ġdev Ex ts . to CString Array ( mem Scope ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġvk Create Device ( vk _ p device , Ġd Info . ptr , Ġnull , Ġl device . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result != VK _ SUCCESS ) Ġthrow ĠError (" Logical Ġdevice Ġfailure ") čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġl device . value čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Vulkan Ġlogical Ġdevice Ġinitialized ") čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġgraphics Queue Ġ= Ġalloc < Vk Queue Var >() čĊĠĠĠĠĠĠĠ Ġval Ġpresent Queue Ġ= Ġalloc < Vk Queue Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvk GetDevice Queue ( vk _ l device , Ġgraphics Queue Family . to UInt (), Ġ 0 u , Ġgraphics Queue . ptr ) čĊĠĠĠĠĠĠĠ Ġvk GetDevice Queue ( vk _ l device , Ġpresent Queue Family . to UInt (), Ġ 0 u , Ġpresent Queue . ptr ) čĊčĊĠĠĠĠĠĠĠ Ġprintln (" Created Ġgraphics Queue Ġ${ graphics Queue . value . to Long (). toString ( 1 6 )} ") čĊĠĠĠĠĠĠĠ Ġprintln (" Created Ġpresent Queue Ġ${ present Queue . value . to Long (). toString ( 1 6 )} ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġmemory Properties : ĠVk PhysicalDevice Memory Properties Ġ= Ġalloc () čĊĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Memory Properties ( vk _ p device , Ġmemory Properties . ptr ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 6 Ġcreate ĠSem aph ores čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġimage Available Semaphore Ġ= Ġalloc < Vk Semaphore Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġrendering Finished Semaphore Ġ= Ġalloc < Vk Semaphore Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsemaphore CreateInfo Ġ= Ġalloc < Vk Semaphore CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ SE MAP HO RE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Semaphore ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemaphore CreateInfo . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Available Semaphore . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Semaphore ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemaphore CreateInfo . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrendering Finished Semaphore . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ ĠRuntimeException (" Failed Ġto Ġcreate Ġimage Available Semaphore Ġor Ġrendering Finished Semaphore ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 7 ĠCreate Ġgraphics Ġcommand Ġpool ĠčĊĠĠĠĠĠĠĠ Ġval Ġcommand Pool Var Ġ= Ġalloc < Vk Command Pool Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcommand Pool CreateInfo Ġ= Ġalloc < Vk Command Pool CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ COMMAND _ POOL _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Family Index Ġ= Ġgraphics Queue Family . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġ 0 U čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( Ġvk Create Command Pool ( vk _ l device , Ġcommand Pool CreateInfo . ptr , Ġnull , Ġcommand Pool Var . ptr ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġcommand Ġpool ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġprintln (" Created Ġcommand Ġpool Ġ${ command Pool Var . value . to Long (). toString ( 1 6 )} ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 8 ĠSetup Ġvertices Ġbuffers čĊĠĠĠĠĠĠĠ Ġval Ġvertex Buffer Ġ= Ġfloat ArrayOf ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 8 f , Ġ- 0 . 8 f , Ġ 0 . 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 f , Ġ- 0 . 8 f , Ġ 0 . 0 f , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 f , ĠĠ 0 . 8 f , Ġ 0 . 0 f čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġindex Buffer Ġ= Ġuint ArrayOf ( 0 u , 2 u , 1 u ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvertex BufferSize Ġ= Ġ( vertex Buffer . size Ġ* Ġsize Of < Float Var > ()). to UL ong (); čĊĠĠĠĠĠĠĠ Ġvar Ġindex BufferSize Ġ= Ġ( index Buffer . size Ġ* Ġsize Of < UInt Var > ()). to UL ong () čĊĠĠĠĠĠĠĠ Ġval Ġindices Count Ġby Ġlazy Ġ{ Ġindex Buffer . size Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġv I Buffer Ġ= Ġalloc < Vk Buffer Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġv I Memory Ġ= Ġalloc < VkDevice Memory Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġv O Buffer Ġ= Ġalloc < Vk Buffer Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġv O Memory Ġ= Ġalloc < VkDevice Memory Var >() čĊčĊĠĠĠĠĠĠĠ Ġcreate Buffer And Memory ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Scope , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġv I Buffer , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġv I Memory , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device !! , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ p device !! , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex BufferSize , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġv O Buffer , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġv O Memory , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Buffer , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ BUFFER _ USAGE _ VERTEX _ BUFFER _ BIT Ġor ĠVK _ BUFFER _ USAGE _ TRANSFER _ DST _ BIT čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġi I Buffer Ġ= Ġalloc < Vk Buffer Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġi I Memory Ġ= Ġalloc < VkDevice Memory Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġi O Buffer Ġ= Ġalloc < Vk Buffer Var >() čĊĠĠĠĠĠĠĠ Ġvar Ġi O Memory Ġ= Ġalloc < VkDevice Memory Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġcreate Buffer And Memory ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmem Scope , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġi I Buffer , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġi I Memory , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ p device , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex BufferSize , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġi O Buffer , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġi O Memory , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Buffer , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ BUFFER _ USAGE _ INDEX _ BUFFER _ BIT Ġor ĠVK _ BUFFER _ USAGE _ TRANSFER _ DST _ BIT čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcopy Cmd Buf Info Ġ= Ġalloc < Vk CommandBuffer Allocate Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ COMMAND _ BUFFER _ ALLOC ATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Pool Ġ= Ġcommand Pool Var . value čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠVK _ COMMAND _ BUFFER _ LEVEL _ PRIMARY čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Buffer Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġcopy CommandBuffer Ġ= Ġalloc Array < Vk CommandBuffer Var >( 1 ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( Ġvk Allocate Command Buffers ( vk _ l device , Ġcopy Cmd Buf Info . ptr , Ġcopy CommandBuffer ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġcopy Ġcommand Ġbuffer ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcopy Begin Buf Info : ĠVk CommandBuffer Begin Info Ġ= Ġalloc < Vk CommandBuffer Begin Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ COMMAND _ BUFFER _ BEGIN _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠVK _ COMMAND _ BUFFER _ USAGE _ ONE _ TIME _ SUBMIT _ BIT čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( Ġvk Begin CommandBuffer ( copy CommandBuffer [ 0 ], Ġcopy Begin Buf Info . ptr ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġstart Ġbegin Ġcommand Ġbuffer ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġval Ġcopy Region Ġ= Ġalloc < Vk Buffer Copy >() čĊčĊĠĠĠĠĠĠĠ Ġcopy Region . size Ġ= Ġvertex BufferSize . to UL ong () čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ ĠvkCmd Copy Buffer ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy CommandBuffer [ 0 ], čĊĠĠĠĠĠĠĠĠĠĠĠ Ġv I Buffer . value , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġv O Buffer . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 u , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Region . ptr čĊĠĠĠĠĠĠĠ Ġ) čĊčĊĠĠĠĠĠĠĠ Ġcopy Region . size Ġ= Ġindex BufferSize . to UL ong () čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ ĠvkCmd Copy Buffer ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy CommandBuffer [ 0 ], čĊĠĠĠĠĠĠĠĠĠĠĠ Ġi I Buffer . value , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġi O Buffer . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 u , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Region . ptr čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Command Ġ= Ġalloc < Vk CommandBuffer Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Command . value Ġ= Ġcopy CommandBuffer [ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk End CommandBuffer ( copy Command . value ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġend Ġcopy Ġcommand Ġbuffer ") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubmit Info Ġ= Ġalloc < Vk Submit Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ SUBMIT _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Buffer Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Command Buffers Ġ= Ġcopy Command . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk Queue Submit ( graphics Queue . value , Ġ 1 u , Ġsubmit Info . ptr , Ġnull )!= VK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Failed Ġsubmit Ġcopy Ġqueue ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Queue Wait Idle ( graphics Queue . value ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Free Command Buffers ( vk _ l device , Ġcommand Pool Var . value , Ġ 1 u , Ġcopy Command . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Buffer ( vk _ l device , Ġv I Buffer . value , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Free Memory ( vk _ l device , Ġv I Memory . value , Ġnull ) čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Buffer ( vk _ l device , Ġi I Buffer . value , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Free Memory ( vk _ l device , Ġi I Memory . value , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 0 ĠSetup Ġswap Ġchain čĊĠĠĠĠĠĠĠ Ġvar Ġswap Chain Extent : ĠVk Extent 2 D čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( caps . current Extent . width Ġ== Ġ(- 1 ). to UInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Extent Ġ= Ġalloc < Vk Extent 2 D >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Extent . width Ġ= Ġ 6 4 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Extent . height Ġ= Ġ 4 8 0 u čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Extent Ġ= Ġcaps . current Extent čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (""" čĊĠĠĠĠĠĠĠ ĠDevice : Ġ${ props . device Name . to K String ()} čĊĠĠĠĠĠĠĠ ĠDriver : Ġ${ ma ( props . driver Version )}. ${ mi ( props . driver Version )}. ${ pa ( props . driver Version )} čĊĠĠĠĠĠĠĠ ĠVulkan : Ġ${ ma ( props . apiVersion )}. ${ mi ( props . apiVersion )}. ${ pa ( props . apiVersion )} čĊĠĠĠĠĠĠĠ ĠGLFW ĠSize : Ġ${ caps . current Extent . width } x ${ caps . current Extent . height } čĊĠĠĠĠĠĠĠ Ġ"" ") čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġformats Count Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠVk Result čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodes Count Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer 1 : ĠC Array Pointer < Vk Present Mode KHR Var >? Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠvkGet PhysicalDevice Surface Present Modes KHR ( vk _ p device , Ġvk _ surface , Ġmodes Count . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġresult Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġget Ġsurface Ġpresent Ġmodes .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( modes Count . value Ġ== Ġ 0 u ) Ġbreak čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer 1 ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Heap . free ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer 1 Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer 1 Ġ= Ġnative Heap . alloc Array ( modes Count . value . toInt ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠvkGet PhysicalDevice Surface Present Modes KHR ( vk _ p device , Ġvk _ surface , Ġmodes Count . ptr , Ġbuffer 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġget Ġsurface Ġpresent Ġmodes .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( result Ġ== ĠVK _ IN COMPLETE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmodes Count . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodes . add ( buffer 1 ! ![ i ]) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer 1 ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Heap . free ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġswap Chain Images Ġ= ĠArrayList < Vk Image >() čĊĠĠĠĠĠĠĠ Ġvar Ġswap Chain Image Views Ġ= ĠArrayList < Vk ImageView >() čĊĠĠĠĠĠĠĠ Ġvar Ġswap Chain Frame buffers Ġ= ĠArrayList < Vk Framebuffer >() čĊĠĠĠĠĠĠĠ Ġval Ġswap Chain Images Count : ĠUInt Var Ġ= Ġalloc () čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvk _ swap chain Ġ= Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" display Ġchosen Ġfor Ġswap chain Ġ${ swap Chain Extent . width } x ${ swap Chain Extent . height }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswap chain : ĠVk Swap chain KHR Var Ġ= Ġalloc () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠVk Result čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer : ĠC Array Pointer < Vk Surface Format KHR >? Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠvkGet PhysicalDevice Surface Formats KHR ( vk _ p device , Ġvk _ surface , Ġformats Count . ptr , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Surface Ġformats Ġfailure !") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( formats Count . value Ġ== Ġ 0 u ) Ġbreak čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Heap . free ( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġnative Heap . alloc Array ( formats Count . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠvkGet PhysicalDevice Surface Formats KHR ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ p device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ surface , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformats Count . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer !!. get Pointer ( mem Scope ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Surface Ġformats Ġfailure !") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( result Ġ== ĠVK _ IN COMPLETE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( formats Count . value Ġ== Ġ 1 u ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Format Ġ= Ġbuffer ! ![ 0 ]. format čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Space Ġ= Ġbuffer ! ![ 0 ]. color Space čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" only Ġone Ġformats Count Ġ${ formats Count . value }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchosen Format : ĠUInt ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 u Ġuntil Ġformats Count . value ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer ! ![ i . toInt ()]. format Ġ== ĠVK _ FORMAT _ R 8 G 8 B 8 A 8 _ UN ORM ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchosen Format Ġ= Ġi čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchosen Format ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Format Ġ= Ġbuffer ! ![ it . toInt ()]. format čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Space Ġ= Ġbuffer ! ![ it . toInt ()]. color Space čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġkotlin . run Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Format Ġ= Ġbuffer ! ![ 0 ]. format čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Space Ġ= Ġbuffer ! ![ 0 ]. color Space čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative Heap . free ( buffer !! ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġmail @{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodes . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠVK _ PRESENT _ MODE _ MAIL BOX _ KHR ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent et ion Mode Ġ= ĠVK _ PRESENT _ MODE _ MAIL BOX _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ mail čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( present et ion Mode Ġ!= ĠVK _ PRESENT _ MODE _ MAIL BOX _ KHR ) Ġ&& Ġ( it Ġ== ĠVK _ PRESENT _ MODE _ IM MEDI ATE _ KHR )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent et ion Mode Ġ= ĠVK _ PRESENT _ MODE _ IM MEDI ATE _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġimages Needed Ġ= Ġcaps . max Image Count Ġ+ Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( caps . max Image Count Ġ> Ġ 0 u ) Ġ&& Ġ( images Needed Ġ> Ġcaps . max Image Count )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages Needed Ġ= Ġcaps . max Image Count čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurface Transform : ĠVk Surface Transform Flags KHR Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( caps . supported Transforms Ġand ĠVK _ SURFACE _ TRANSFORM _ IDENTITY _ BIT _ KHR ) Ġ> Ġ 0 u ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ SURFACE _ TRANSFORM _ IDENTITY _ BIT _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaps . current Transform čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomposite Alpha Bit Ġ= ĠVK _ COMP OS ITE _ ALPHA _ OP A QUE _ BIT _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposite Alpha Flags Ġ= ĠarrayOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ COMP OS ITE _ ALPHA _ OP A QUE _ BIT _ KHR , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ COMP OS ITE _ ALPHA _ PRE _ MULTI P LIED _ BIT _ KHR , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ COMP OS ITE _ ALPHA _ POST _ MULTI P LIED _ BIT _ KHR , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ COMP OS ITE _ ALPHA _ IN HER IT _ BIT _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Ġfound @{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Alpha Flags . forEach Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( caps . supported Composite Alpha Ġand Ġit ) Ġ> Ġ 0 u ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Alpha Bit Ġ= Ġit čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ found čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiscard Swap chain Ġ= Ġalloc < Vk Swap chain KHR Var >() čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġswap chain CreateInfo : ĠVk Swap chain CreateInfo KHR Ġ= Ġalloc < Vk Swap chain CreateInfo KHR >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ SWAP CHAIN _ CREATE _ INFO _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . surface Ġ= Ġvk _ surface čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Image Count Ġ= Ġimages Needed čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Format Ġ= Ġswap Chain Format čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Color Space Ġ= Ġcolor Space čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Extent . width Ġ= Ġswap Chain Extent . width čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Extent . height Ġ= Ġswap Chain Extent . height čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Usage Ġ= ĠVK _ IMAGE _ USAGE _ COLOR _ ATTACHMENT _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Array Layers Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Transform Ġ= Ġsurface Transform čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Family Index Count Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Queue Family Indices Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresent Mode Ġ= Ġpresent et ion Mode čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Swap chain Ġ= Ġdiscard Swap chain . value čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcli pped Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Alpha Ġ= Ġcomposite Alpha Bit čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap chain CreateInfo . image Sharing Mode Ġ= ĠVK _ SH AR ING _ MODE _ EXCL USIVE čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( caps . supported Usage Flags Ġand ĠVK _ IMAGE _ USAGE _ TRANSFER _ SRC _ BIT ) Ġ> Ġ 0 u ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap chain CreateInfo . image Usage Ġ= Ġswap chain CreateInfo . image Usage Ġor ĠVK _ IMAGE _ USAGE _ TRANSFER _ SRC _ BIT čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( caps . supported Usage Flags Ġand ĠVK _ IMAGE _ USAGE _ TRANSFER _ DST _ BIT ) Ġ> Ġ 0 u ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap chain CreateInfo . image Usage Ġ= Ġswap chain CreateInfo . image Usage Ġor ĠVK _ IMAGE _ USAGE _ TRANSFER _ DST _ BIT čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk Create Swap chain KHR ( vk _ l device , Ġswap chain CreateInfo . ptr , Ġnull , Ġswap chain . ptr ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Failed Ġto Ġcreate Ġswap chain ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Swap Ġchain Ġcreated Ġsuccessfully ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( discard Swap chain . value Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Swap chain KHR ( vk _ l device , Ġdiscard Swap chain . value , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vkGet Swap chain Images KHR ( vk _ l device , Ġswap chain . value , Ġswap Chain Images Count . ptr , Ġnull ) Ġ!= ĠVK _ SUCCESS Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġinitialize Ġv ulkan . ĠNo Ġimages ") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocal Images Buffer Ġ= Ġalloc Array < Vk Image Var >( swap Chain Images Count . value . toInt ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĠvkGet Swap chain Images KHR ( vk _ l device , Ġswap chain . value , Ġswap Chain Images Count . ptr , Ġlocal Images Buffer ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" No Ġv ulkan Ġimages ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġswap Chain Images Count . value . toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Images . add ( local Images Buffer [ i ] !! ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġswap chain . value čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Swap Ġchain Ġimages Ġcount Ġ" Ġ+ Ġswap Chain Images . size ); čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 1 ĠCreate ĠRender Ġpass čĊĠĠĠĠĠĠĠ Ġval Ġattachments Ġ= Ġalloc Array < Vk Attachment Description >( 1 ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġattachments [ 0 ]. apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . format Ġ= Ġswap Chain Format čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . final Layout Ġ= ĠVK _ IMAGE _ LAYOUT _ PRESENT _ SRC _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . initial Layout Ġ= ĠVK _ IMAGE _ LAYOUT _ UNDEFINED čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . load Op Ġ= ĠVK _ ATTACHMENT _ LOAD _ OP _ CLEAR čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . samples Ġ= ĠVK _ SAMPLE _ COUNT _ 1 _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stencil Load Op Ġ= ĠVK _ ATTACHMENT _ LOAD _ OP _ D ONT _ C ARE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stencil Store Op Ġ= ĠVK _ ATTACHMENT _ STORE _ OP _ D ONT _ C ARE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . store Op Ġ= ĠVK _ ATTACHMENT _ STORE _ OP _ STORE čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcolor Reference Ġ= Ġalloc < Vk Attachment Reference >() čĊĠĠĠĠĠĠĠ Ġcolor Reference . attachment Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠ Ġcolor Reference . layout Ġ= ĠVK _ IMAGE _ LAYOUT _ COLOR _ ATTACHMENT _ OP TIM AL čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġsub pass Ġ= Ġalloc < Vk Sub pass Description >() čĊĠĠĠĠĠĠĠ Ġsub pass . pipeline Bind Point Ġ= ĠVK _ PIPELINE _ BIND _ POINT _ GRAPH ICS čĊĠĠĠĠĠĠĠ Ġsub pass . color Attachment Count Ġ= Ġ 1 u ; čĊĠĠĠĠĠĠĠ Ġsub pass . p Color Attachments Ġ= Ġcolor Reference . ptr čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġalloc Array < Vk Sub pass Dependency >( 1 ). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. src Sub pass Ġ= ĠVK _ SUB PASS _ EXTERNAL čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. dst Sub pass Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. src Stage Mask Ġ= ĠVK _ PIPELINE _ STAGE _ BOTTOM _ OF _ PIPE _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. dst Stage Mask Ġ= ĠVK _ PIPELINE _ STAGE _ COLOR _ ATTACHMENT _ OUTPUT _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. src Access Mask Ġ= ĠVK _ ACCESS _ MEMORY _ READ _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. dst Access Mask Ġ= ĠVK _ ACCESS _ COLOR _ ATTACHMENT _ READ _ BIT Ġor ĠVK _ ACCESS _ COLOR _ ATTACHMENT _ WRITE _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ]. dependency Flags Ġ= ĠVK _ DEPEND ENCY _ BY _ REGION _ BIT čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġrender Pass Info Ġ= Ġalloc < Vk RenderPass CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ RENDER _ PASS _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Attachments Ġ= Ġattachments čĊĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub pass Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Sub passes Ġ= Ġsub pass . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Dependencies Ġ= Ġdependencies čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġrender Pass Ref Ġ= Ġalloc < Vk RenderPass Var >() čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( Ġvk Create RenderPass ( vk _ l device , Ġrender Pass Info . ptr , Ġnull , Ġrender Pass Ref . ptr ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate ĠRender pass ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" after Ġvk Create RenderPass ") čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 2 ĠCreate ĠImage ĠViews čĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġswap Chain Images Count . value . toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageView CreateInfo : ĠVk ImageView CreateInfo Ġ= Ġalloc < Vk ImageView CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ IMAGE _ VIEW _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Type Ġ= ĠVK _ IMAGE _ VIEW _ TYPE _ 2 D čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Ġ= Ġswap Chain Format čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents . r Ġ= ĠVK _ COMPONENT _ SW IZ Z LE _ IDENTITY čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents . g Ġ= ĠVK _ COMPONENT _ SW IZ Z LE _ IDENTITY čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents . b Ġ= ĠVK _ COMPONENT _ SW IZ Z LE _ IDENTITY čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents . a Ġ= ĠVK _ COMPONENT _ SW IZ Z LE _ IDENTITY čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub resource Range . aspect Mask Ġ= ĠVK _ IMAGE _ AS PECT _ COLOR _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub resource Range . base Mip Level Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub resource Range . level Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub resource Range . base Array Layer Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub resource Range . layer Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= Ġswap Chain Images [ i ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageView Ġ= Ġalloc < Vk ImageView Var >() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk Create ImageView ( vk _ l device , ĠimageView CreateInfo . ptr , Ġnull , ĠimageView . ptr ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" image Ġview (${ i }) Ġerror !! ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Image Views . add ( imageView . value !! ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Swap Ġchain Ġview Ġcount Ġ" Ġ+ Ġswap Chain Image Views . size ); čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 3 ĠCreate ĠFrame ĠBu ffers čĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġswap Chain Image Views . size ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattachments 1 Ġ= Ġalloc Array < Vk ImageView Var >( 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachments 1 [ 0 ] Ġ= Ġswap Chain Image Views [ i ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Buffer CreateInfo Ġ= Ġalloc < Vk Framebuffer CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ FRAMEBUFFER _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Pass Ġ= Ġrender Pass Ref . value čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Attachments Ġ= Ġattachments 1 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġswap Chain Extent . width čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġswap Chain Extent . height čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayers Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġframebuffer Ġ= Ġalloc < Vk Framebuffer Var >() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ĠĠĠ Ġvk Create Framebuffer ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Buffer CreateInfo . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframebuffer . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" failed Ġto Ġcreate Ġframebuffer (${ i }) Ġ! "); čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Frame buffers . add ( framebuffer . value !! ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" after Ġvk Create Framebuffer ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 4 ĠCreate ĠGraphics ĠPipeline čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcwd Ġ= ĠByteArray ( 1 0 2 4 ) čĊĠĠĠĠĠĠĠ Ġcwd . use Pin ned Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġget cwd ( it . address Of ( 0 ), Ġ 1 0 2 4 ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġvert Shader Module Ġ= Ġload Shader ("${ cwd . to K String ()} \\ shaders \\ vert . sp v ", Ġvk _ l device ) čĊĠĠĠĠĠĠĠ Ġvar Ġfrag Shader Module Ġ= Ġload Shader ("${ cwd . to K String ()} \\ shaders \\ frag . sp v ", Ġvk _ l device ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġshader Stages Ġ= Ġalloc Array < Vk Pipeline Shader Stage CreateInfo >( 2 ) čĊčĊĠĠĠĠĠĠĠ Ġshader Stages [ 0 ]. sType Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ SHADER _ STAGE _ CREATE _ INFO čĊĠĠĠĠĠĠĠ Ġshader Stages [ 0 ]. stage Ġ= ĠVK _ SHADER _ STAGE _ VERTEX _ BIT čĊĠĠĠĠĠĠĠ Ġshader Stages [ 0 ]. module Ġ= Ġvert Shader Module čĊĠĠĠĠĠĠĠ Ġshader Stages [ 0 ]. p Name Ġ= Ġ" main ". cstr . ptr čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġshader Stages [ 1 ]. sType Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ SHADER _ STAGE _ CREATE _ INFO čĊĠĠĠĠĠĠĠ Ġshader Stages [ 1 ]. stage Ġ= ĠVK _ SHADER _ STAGE _ FRAGMENT _ BIT čĊĠĠĠĠĠĠĠ Ġshader Stages [ 1 ]. module Ġ= Ġfrag Shader Module čĊĠĠĠĠĠĠĠ Ġshader Stages [ 1 ]. p Name Ġ= Ġ" main ". cstr . ptr čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġvertex Input Info Ġ= Ġalloc < Vk Pipeline Vertex Input State CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ VERTEX _ INPUT _ STATE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Binding Description Count Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Vertex Binding Descriptions Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Attribute Description Count Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Vertex Attribute Descriptions Ġ= Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġinput Assembly Ġ= Ġalloc < Vk Pipeline Input Assembly State CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ INPUT _ AS SE MB LY _ STATE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtopology Ġ= ĠVK _ PR IMIT IVE _ TO PO LOG Y _ TRI ANGLE _ LIST čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive Restart Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġviewport 1 Ġ= Ġalloc < Vk Viewport >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġswap Chain Extent . width . toFloat () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġswap Chain Extent . height . toFloat () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Depth Ġ= Ġ 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Depth Ġ= Ġ 1 f čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġsc issor 1 Ġ= Ġalloc < Vk Rect 2 D >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset . x Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset . y Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġextent . width Ġ= Ġswap Chain Extent . width čĊĠĠĠĠĠĠĠĠĠĠĠ Ġextent . height Ġ= Ġswap Chain Extent . height čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġviewport State Ġ= Ġalloc < Vk Pipeline Viewport State CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ VIEW PORT _ STATE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġviewport Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsc issor Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp View ports Ġ= Ġviewport 1 . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Sc iss ors Ġ= Ġsc issor 1 . ptr čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġraster izer Ġ= Ġalloc < Vk Pipeline Raster ization State CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ R ASTER IZATION _ STATE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepth Clamp Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġraster izer Discard Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Mode Ġ= ĠVK _ POLYGON _ MODE _ FILL čĊĠĠĠĠĠĠĠĠĠĠĠ Ġc ull Mode Ġ= ĠVK _ C ULL _ MODE _ BACK _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfront Face Ġ= ĠVK _ FRONT _ FACE _ COUNTER _ CLOCK WISE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepth Bias Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġ 1 . 0 f čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġmultis ampling Ġ= Ġalloc < Vk Pipeline Mult is ample State CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ MULT IS AMPLE _ STATE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġraster ization Samples Ġ= ĠVK _ SAMPLE _ COUNT _ 1 _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Sample Mask Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsample Shading Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġblend Attachment State Ġ= Ġalloc Array < Vk Pipeline Color Blend Attachment State >( 1 ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġblend Attachment State [ 0 ]. apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Color Blend Factor Ġ= ĠVK _ BLEND _ FACTOR _ ONE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Color Blend Factor Ġ= ĠVK _ BLEND _ FACTOR _ ZERO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Blend Op Ġ= ĠVK _ BLEND _ OP _ ADD čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Alpha Blend Factor Ġ= ĠVK _ BLEND _ FACTOR _ ONE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst Alpha Blend Factor Ġ= ĠVK _ BLEND _ FACTOR _ ZERO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Blend Op Ġ= ĠVK _ BLEND _ OP _ ADD čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Write Mask Ġ= ĠVK _ COLOR _ COMPONENT _ R _ BIT Ġor ĠVK _ COLOR _ COMPONENT _ G _ BIT Ġor ĠVK _ COLOR _ COMPONENT _ B _ BIT Ġor ĠVK _ COLOR _ COMPONENT _ A _ BIT čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġcolor Bl ending Ġ= Ġalloc < Vk Pipeline Color Blend State CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ COLOR _ BLEND _ STATE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Attachments Ġ= Ġblend Attachment State čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogic Op Enable Ġ= ĠVK _ FALSE . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogic Op Ġ= ĠVK _ LOGIC _ OP _ COPY čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Constants [ 0 ] Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Constants [ 1 ] Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Constants [ 2 ] Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Constants [ 3 ] Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġpipeline Layout CreateInfo Ġ= Ġalloc < Vk Pipeline Layout CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ PIPELINE _ LAYOUT _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Layout Count Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Set Layouts Ġ= Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġpipeline Layout : ĠVk Pipeline Layout Var Ġ= Ġalloc () čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Pipeline Layout ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Layout CreateInfo . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Layout . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠError (" Pipeline Ġlayout Ġfailed !! ") čĊĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġprintln (" after Ġvk Create Pipeline Layout ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġpipeline CreateInfo Ġ= Ġalloc < Vk Graphics Pipeline CreateInfo >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ GRAPH ICS _ PIPELINE _ CREATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage Count Ġ= Ġ 2 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Stages Ġ= Ġshader Stages čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Vertex Input State Ġ= Ġvertex Input Info . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Input Assembly State Ġ= Ġinput Assembly . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Viewport State Ġ= Ġviewport State . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Raster ization State Ġ= Ġraster izer . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Mult is ample State Ġ= Ġmultis ampling . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Color Blend State Ġ= Ġcolor Bl ending . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Depth Stencil State Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Dynamic State Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Ġ= Ġpipeline Layout . value čĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Pass Ġ= Ġrender Pass Ref . value čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Pipeline Handle Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Pipeline Index Ġ= Ġ(- 1 ). toInt () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġvar Ġgraphics Pipeline Ġ= Ġalloc < Vk Pipeline Var >() čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk Create Graphics P ipelines ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 u , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline CreateInfo . ptr , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraphics Pipeline . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠVK _ SUCCESS čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" failed Ġcreate Ġpipeline ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvk Destroy Shader Module ( vk _ l device , Ġshader Stages [ 0 ]. module , Ġnull ) čĊĠĠĠĠĠĠĠ Ġvk Destroy Shader Module ( vk _ l device , Ġshader Stages [ 1 ]. module , Ġnull ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprintln (" Graphics Ġpipeline Ġcreated Ġsuccessfully ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 5 ĠCreate ĠDescriptor ĠPool čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// IG NO RED Ġfor Ġthis Ġsimple Ġdemo čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 6 ĠCreate ĠDescriptor ĠSet čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// IG NO RED Ġfor Ġthis Ġsimple Ġdemo čĊčĊĠĠĠĠĠĠĠ Ġ// # 1 7 ĠCreate ĠCommand ĠBu ffers čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvar Ġgraphics Command Buffers Ġ= Ġalloc Array < Vk CommandBuffer Var >( swap Chain Images Count . value . toInt ()) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcommand Buffer Allocate Info Ġ= Ġalloc < Vk CommandBuffer Allocate Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ COMMAND _ BUFFER _ ALLOC ATE _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Pool Ġ= Ġcommand Pool Var . value čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= ĠVK _ COMMAND _ BUFFER _ LEVEL _ PRIMARY čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Buffer Count Ġ= Ġswap Chain Images Count . value . to UInt () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġprintln (" before Ġvk Allocate Command Buffers ") čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( Ġvk Allocate Command Buffers ( vk _ l device , Ġcommand Buffer Allocate Info . ptr , Ġgraphics Command Buffers ) Ġ!= ĠVK _ SUCCESS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Failed Ġto Ġcreate Ġgraphics Command Buffers ") čĊĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġval Ġgraphics Cmd Buffer Begin Info Ġ= Ġalloc < Vk CommandBuffer Begin Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ COMMAND _ BUFFER _ BEGIN _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠVK _ COMMAND _ BUFFER _ USAGE _ SIM ULT AN EO US _ USE _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp Inheritance Info Ġ= Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġclear Color Ġ= Ġalloc Array < Vk Clear Value >( 1 ) čĊĠĠĠĠĠĠĠ Ġclear Color [ 0 ]. color . float 3 2 . apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ] Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 1 ] Ġ= Ġ 0 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 2 ] Ġ= Ġ 0 . 2 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 3 ] Ġ= Ġ 1 . 0 f čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġswap Chain Images . size ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Begin CommandBuffer ( graphics Command Buffers [ i ], Ġgraphics Cmd Buffer Begin Info . ptr ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrender Pass Begin Info Ġ= Ġalloc < Vk RenderPass Begin Info >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Type Ġ= ĠVK _ STRUCTURE _ TYPE _ RENDER _ PASS _ BEGIN _ INFO čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Next Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Pass Ġ= Ġrender Pass Ref . value čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Area . offset . x Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Area . offset . y Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Area . extent . width Ġ= Ġswap Chain Extent . width . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Area . extent . height Ġ= Ġswap Chain Extent . height . to UInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Value Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp Clear Values Ġ= Ġclear Color čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframebuffer Ġ= Ġswap Chain Frame buffers [ i ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd Begin RenderPass ( graphics Command Buffers [ i ], Ġrender Pass Begin Info . ptr , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ SUB PASS _ CONTENTS _ INLINE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd Bind Pipeline ( graphics Command Buffers [ i ], ĠVK _ PIPELINE _ BIND _ POINT _ GRAPH ICS , ĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraphics Pipeline . value ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġalloc Array < VkDevice Size Var >( 1 ) Ġ{ Ġ_: ĠInt Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġ 0 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd Bind Vertex Buffers ( graphics Command Buffers [ i ], Ġ 0 u , Ġ 1 u , Ġv O Buffer . ptr , Ġoffset ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd Bind Index Buffer ( graphics Command Buffers [ i ], Ġi O Buffer . value , Ġ 0 u , ĠVK _ INDEX _ TYPE _ UINT 3 2 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd Draw Indexed ( graphics Command Buffers [ i ], Ġindices Count . to UInt (), Ġ 1 u , Ġ 0 u , Ġ 0 , Ġ 1 u ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ ĠvkCmd End RenderPass ( graphics Command Buffers [ i ]) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk End CommandBuffer ( graphics Command Buffers [ i ]) Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" failed Ġto Ġrecord Ġcommand Ġbuffer "); čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġprintln (" re corded Ġcommand Ġbuffers ") čĊĠĠĠĠĠĠĠ Ġvk Destroy Pipeline Layout ( vk _ l device , Ġpipeline Layout . value , Ġnull ) čĊĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ// # 1 8 ĠDraw čĊĠĠĠĠĠĠĠ Ġwhile Ġ( glfw GetKey ( window , ĠGLFW _ KEY _ ESCAPE ) Ġ!= ĠGLFW _ PRESS Ġ&& Ġglfw Window Should Close ( window ) Ġ== Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġimage Index Ġ= Ġalloc < UInt Var >() čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġres 1 Ġ= Ġ Ġvk Acquire Next Image KHR ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ l device , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvk _ swap chain , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUINT 6 4 _ MAX , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Available Semaphore . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Index . ptr čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( res 1 Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" failed Ġto Ġacquire Ġimage ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdraw Submit Info Ġ= Ġalloc < Vk Submit Info >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . sType Ġ= ĠVK _ STRUCTURE _ TYPE _ SUBMIT _ INFO čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . wait Semaphore Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . p Wait Sem aph ores Ġ= Ġimage Available Semaphore . ptr čĊĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . signal Semaphore Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . p Signal Sem aph ores Ġ= Ġrendering Finished Semaphore . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdraw Stage Wait Flags Ġ= Ġalloc < Vk Pipeline Stage Flags Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Stage Wait Flags . value Ġ= ĠVK _ PIPELINE _ STAGE _ TOP _ OF _ PIPE _ BIT čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . p Wait Dst Stage Mask Ġ= Ġdraw Stage Wait Flags . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgraphics Cmd Buffer Ġ= Ġalloc < Vk CommandBuffer Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraphics Cmd Buffer . value Ġ= Ġgraphics Command Buffers [ image Index . value . toInt ()] čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . commandBuffer Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Submit Info . p Command Buffers Ġ= Ġgraphics Cmd Buffer . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk Queue Submit ( graphics Queue . value , Ġ 1 u , Ġdraw Submit Info . ptr , Ġnull ) Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" failed Ġto Ġsubmit Ġdraw Ġcommand Ġbuffer ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdraw Present Info Ġ= Ġalloc < Vk Present Info KHR >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Present Info . sType Ġ= ĠVK _ STRUCTURE _ TYPE _ PRESENT _ INFO _ KHR čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Present Info . wait Semaphore Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Present Info . p Wait Sem aph ores Ġ= Ġrendering Finished Semaphore . ptr čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġswap Ch ains Ġ= Ġalloc Array < Vk Swap chain KHR Var >( 1 . toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvk _ swap chain čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Present Info . swap chain Count Ġ= Ġ 1 u čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Present Info . p Swap chains Ġ= Ġswap Ch ains čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Present Info . p Image Indices Ġ= Ġimage Index . ptr ; čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vk Queue Present KHR ( present Queue . value , Ġdraw Present Info . ptr ) Ġ!= ĠVK _ SUCCESS ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" failed Ġto Ġsubmit Ġpresent Ġcommand Ġbuffer ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġglfw Swap Buffers ( window ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġglfw Poll Events () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif Ġ( command Pool Var . value Ġ!= Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Command Pool ( vk _ l device , Ġcommand Pool Var . value , Ġnull ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk Destroy Device ( vk _ l device , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠĠ čĊĠĠĠĠĠĠĠ Ġif Ġ( callback . value Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Destroy ing Ġcallback ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġk vk Destroy Debug Report Callback EXT : ĠPFN _ vk Destroy Debug Report Callback EXT ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġvk GetInstance Proc Addr ( vk _ instance , Ġ" vk Destroy Debug Report Callback EXT ") ?. let Ġ{ Ġvoid Fun Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk vk Destroy Debug Report Callback EXT Ġ= Ġvoid Fun Ġas ĠPFN _ vk Destroy Debug Report Callback EXT čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġk vk Destroy Debug Report Callback EXT ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( vk _ instance , Ġcallback . value , Ġnull ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġvk Destroy Instance ( vk _ instance , Ġnull ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġglfw Terminate () ĠĠĠĠĠĠĠ č Ċ }