package Ġv ulkan . common Ċ Ċ import Ġorg . lwjgl . v ulkan . VK 1 0 . VK _ PIPELINE _ BIND _ POINT _ COMPUTE Ċ import Ġorg . lwjgl . v ulkan . VK 1 0 . VK _ PIPELINE _ BIND _ POINT _ GRAPH ICS Ċ import Ġorg . lwjgl . v ulkan . Vk CommandBuffer Ċ import Ġv ulkan . api . buffer . Buffer Alloc Ċ import Ġv ulkan . api . buffer . copy Buffer Ċ import Ġv ulkan . api . buffer . update Buffer Ċ import Ġv ulkan . api . descriptor . Vk DescriptorSet Ċ import Ġv ulkan . api . descriptor . bind Descriptor Sets Ċ import Ġv ulkan . api . pipeline . Compute Pipeline Ċ import Ġv ulkan . api . pipeline . Graphics Pipeline Ċ import Ġv ulkan . misc . Vk Shader Stage Flags Ċ import Ġv ulkan . misc . or Throw Ċ import Ġv ulkan . misc . sizeof Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ Ċ /** Ċ Ġ* ĠShader Ġprintf Ġfunctionality . Ċ Ġ* Ċ Ġ* ĠRequires : Ċ Ġ* ĠĠĠĠĠĠ 4 Ġmeg aby tes Ġ+ Ġ 1 6 Ġof ĠST AGING _ DOWNLOAD Ġbuffer Ċ Ġ* ĠĠĠĠĠĠ 4 Ġmeg aby tes Ġ+ Ġ 1 6 Ġof ĠSTORAGE Ġbuffer Ċ Ġ* Ċ Ġ* ĠUsage : Ċ Ġ* ĠĠĠĠĠ Ġshader Printf . init ( context ); Ċ Ġ* ĠĠĠĠĠ Ġshader Printf . create Layout ( descriptors , Ġshader Stage ); Ċ Ġ* ĠĠĠĠĠ Ġshader Printf . create DescriptorSet ( descriptors , Ġlayout Number ); Ċ Ġ* Ċ Ġ* ĠWith in Ġthe ĠCommand Buffer : Ċ Ġ* ĠĠĠĠĠ Ġshader Printf . bind DescriptorSet ( Vk CommandBuffer , Ġpipeline , Ġ 1 ) Ċ Ġ* ĠĠĠĠĠ Ġshader Printf . clear Buffers ( Vk CommandBuffer ) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġ// Ġdispatch Ġhere Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġshader Printf . fetch Buffers ( Vk CommandBuffer ) Ċ Ġ* Ċ Ġ*/ Ċ class ĠShader Printf Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBUFFER _ SIZE Ġ= Ġ 4 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : Render Context ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstaging Buffer : Buffer Alloc ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstaging Stats Buffer : Buffer Alloc ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice Buffer : Buffer Alloc ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice Stats Buffer : Buffer Alloc ĊĠĠĠ Ġprivate Ġvar Ġdescriptor Set Ġ= Ġnull Ġas ĠVk DescriptorSet ? ĊĊĠĠĠ Ġinternal Ġval Ġzero Buffer Ġ= ĠByteBuffer . allocate Direct ( 4 * Int . sizeof ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Int Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( int ArrayOf ( 0 , 0 , 0 , 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flip () ĊĊĠĠĠ Ġfun Ġinit ( context : Render Context ) Ġ: ĠShader Printf Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext ĊĊĠĠĠĠĠĠĠ Ġthis . staging Buffer ĠĠĠĠĠ Ġ= Ġcontext . buffers . get ( Vulkan Buffers . ST AGING _ DOWNLOAD ). allocate ( BUFFER _ SIZE ). or Throw () ĊĠĠĠĠĠĠĠ Ġthis . staging Stats Buffer Ġ= Ġcontext . buffers . get ( Vulkan Buffers . ST AGING _ DOWNLOAD ). allocate ( zero Buffer . limit ()* Int . sizeof ()). or Throw () ĊĊĠĠĠĠĠĠĠ Ġthis . device Buffer ĠĠĠĠĠĠ Ġ= Ġcontext . buffers . get ( Vulkan Buffers . STORAGE ). allocate ( BUFFER _ SIZE ). or Throw () ĊĠĠĠĠĠĠĠ Ġthis . device Stats Buffer Ġ Ġ= Ġcontext . buffers . get ( Vulkan Buffers . STORAGE ). allocate ( zero Buffer . limit ()* Int . sizeof ()). or Throw () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġstaging Buffer . free () ĊĠĠĠĠĠĠĠ Ġstaging Stats Buffer . free () ĊĠĠĠĠĠĠĠ Ġdevice Buffer . free () ĊĠĠĠĠĠĠĠ Ġdevice Stats Buffer . free () ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġcreate Layout ( d Ġ: ĠDes cript ors , Ġstage : Vk Shader Stage Flags ) Ġ{ ĊĠĠĠĠĠĠĠ Ġd . create Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. storage Buffer ( stage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. storage Buffer ( stage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. num Sets ( 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġclear Buffers ( cmd : Vk CommandBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcmd . update Buffer ( device Stats Buffer . buffer , Ġdevice Stats Buffer . buffer Offset , Ġzero Buffer ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġfetch Buffers ( cmd : Vk CommandBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcmd . copy Buffer ( device Stats Buffer , Ġstaging Stats Buffer ) ĊĠĠĠĠĠĠĠ Ġcmd . copy Buffer ( device Buffer , Ġstaging Buffer ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġcreate DescriptorSet ( d : Descriptors , Ġlayout Number : Int Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġd . layout ( layout Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( device Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( device Stats Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. write () ĊĊĠĠĠĠĠĠĠ Ġthis . descriptor Set Ġ= Ġs . set ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġbind DescriptorSet ( cmd : Vk CommandBuffer , Ġpipeline : Graphics Pipeline , Ġset Index : Int ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcmd . bind Descriptor Sets ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ PIPELINE _ BIND _ POINT _ GRAPH ICS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Index , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( descriptor Set !! ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġbind DescriptorSet ( cmd : Vk CommandBuffer , Ġpipeline : Compute Pipeline , Ġset Index : Int ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcmd . bind Descriptor Sets ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVK _ PIPELINE _ BIND _ POINT _ COMPUTE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Index , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( descriptor Set !! ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġget Output () Ġ: ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġsuffix Ġ= Ġ'\ n ' ĊĠĠĠĠĠĠĠ Ġvar Ġlength Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġstaging Stats Buffer . map For Reading Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġints Ġ= Ġb . as Int Buffer () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlength Ġ= Ġints [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstaging Buffer . map For Reading Ġ{ Ġbytes -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġptr Ġ= Ġbytes . as Float Buffer () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( i Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype ĠĠĠĠĠĠ Ġ= Ġptr . get ( i ++ ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomponents Ġ= Ġptr . get ( i ++ ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ Ġ// Ġchar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( ptr . get ( i ++ ). to Char ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ Ġ// Ġuint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( components Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ("[ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( String . format ("% 0 8 x ", Ġptr . get ( i ++ ). toInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile (-- components Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (", Ġ"). append ( String . format ("% 0 8 x ", Ġptr . get ( i ++ ). toInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( String . format ("% 0 8 x ", Ġptr . get ( i ++ ). toInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ Ġ// Ġint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( components Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ("[ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( ptr . get ( i ++ ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile (-- components Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (", Ġ"). append ( ptr . get ( i ++ ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( ptr . get ( i ++ ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ Ġ// Ġfloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( components Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ("[ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( ptr . get ( i ++ )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile (-- components Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (", Ġ"). append ( ptr . get ( i ++ )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( ptr . get ( i ++ )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 Ġ-> Ġ{ Ġ// Ġmatrix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcols Ġ= Ġptr . get ( i ++ ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġptr . get ( i ++ ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġall Ġthe Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArray ( size Ġ= Ġcols * rows , Ġinit Ġ= Ġ{ Ġ 0 f Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( j Ġin Ġvalues . indices ) Ġvalues [ j ] Ġ= Ġptr . get ( i ++) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( j Ġin Ġ 0 Ġuntil Ġrows * cols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġj Ġ% Ġcols ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġj Ġ/ Ġcols ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( c > 0 ) Ġresult . append (", Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( values [ c * rows + r ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( c Ġ== Ġcols - 1 ) Ġresult . append ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 Ġ-> Ġ{ Ġ// Ġset Ġsuffix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuffix Ġ= Ġptr . get ( i ++ ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Unhandled Ġtype Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( suffix . toInt ()!= 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( suffix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . toString () ĊĠĠĠ Ġ} Ċ } Ċ