vulkan.go 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. //go:build linux || freebsd
  3. // +build linux freebsd
  4. package vk
  5. /*
  6. #cgo linux freebsd LDFLAGS: -ldl
  7. #cgo freebsd CFLAGS: -I/usr/local/include
  8. #cgo CFLAGS: -Werror -Werror=return-type
  9. #define VK_NO_PROTOTYPES 1
  10. #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
  11. #include <vulkan/vulkan.h>
  12. #define __USE_GNU
  13. #include <dlfcn.h>
  14. #include <stdlib.h>
  15. static VkResult vkCreateInstance(PFN_vkCreateInstance f, VkInstanceCreateInfo pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
  16. return f(&pCreateInfo, pAllocator, pInstance);
  17. }
  18. static void vkDestroyInstance(PFN_vkDestroyInstance f, VkInstance instance, const VkAllocationCallbacks *pAllocator) {
  19. f(instance, pAllocator);
  20. }
  21. static VkResult vkEnumeratePhysicalDevices(PFN_vkEnumeratePhysicalDevices f, VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) {
  22. return f(instance, pPhysicalDeviceCount, pPhysicalDevices);
  23. }
  24. static void vkGetPhysicalDeviceQueueFamilyProperties(PFN_vkGetPhysicalDeviceQueueFamilyProperties f, VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties *pQueueFamilyProperties) {
  25. f(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
  26. }
  27. static void vkGetPhysicalDeviceFormatProperties(PFN_vkGetPhysicalDeviceFormatProperties f, VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) {
  28. f(physicalDevice, format, pFormatProperties);
  29. }
  30. static VkResult vkCreateDevice(PFN_vkCreateDevice f, VkPhysicalDevice physicalDevice, VkDeviceCreateInfo pCreateInfo, VkDeviceQueueCreateInfo qinf, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
  31. pCreateInfo.pQueueCreateInfos = &qinf;
  32. return f(physicalDevice, &pCreateInfo, pAllocator, pDevice);
  33. }
  34. static void vkDestroyDevice(PFN_vkDestroyDevice f, VkDevice device, const VkAllocationCallbacks *pAllocator) {
  35. f(device, pAllocator);
  36. }
  37. static void vkGetDeviceQueue(PFN_vkGetDeviceQueue f, VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) {
  38. f(device, queueFamilyIndex, queueIndex, pQueue);
  39. }
  40. static VkResult vkCreateImageView(PFN_vkCreateImageView f, VkDevice device, const VkImageViewCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
  41. return f(device, pCreateInfo, pAllocator, pView);
  42. }
  43. static void vkDestroyImageView(PFN_vkDestroyImageView f, VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) {
  44. f(device, imageView, pAllocator);
  45. }
  46. static VkResult vkCreateFramebuffer(PFN_vkCreateFramebuffer f, VkDevice device, VkFramebufferCreateInfo pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) {
  47. return f(device, &pCreateInfo, pAllocator, pFramebuffer);
  48. }
  49. static void vkDestroyFramebuffer(PFN_vkDestroyFramebuffer f, VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) {
  50. f(device, framebuffer, pAllocator);
  51. }
  52. static VkResult vkDeviceWaitIdle(PFN_vkDeviceWaitIdle f, VkDevice device) {
  53. return f(device);
  54. }
  55. static VkResult vkQueueWaitIdle(PFN_vkQueueWaitIdle f, VkQueue queue) {
  56. return f(queue);
  57. }
  58. static VkResult vkCreateSemaphore(PFN_vkCreateSemaphore f, VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
  59. return f(device, pCreateInfo, pAllocator, pSemaphore);
  60. }
  61. static void vkDestroySemaphore(PFN_vkDestroySemaphore f, VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
  62. f(device, semaphore, pAllocator);
  63. }
  64. static VkResult vkCreateRenderPass(PFN_vkCreateRenderPass f, VkDevice device, VkRenderPassCreateInfo pCreateInfo, VkSubpassDescription subpassInf, const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
  65. pCreateInfo.pSubpasses = &subpassInf;
  66. return f(device, &pCreateInfo, pAllocator, pRenderPass);
  67. }
  68. static void vkDestroyRenderPass(PFN_vkDestroyRenderPass f, VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
  69. f(device, renderPass, pAllocator);
  70. }
  71. static VkResult vkCreateCommandPool(PFN_vkCreateCommandPool f, VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) {
  72. return f(device, pCreateInfo, pAllocator, pCommandPool);
  73. }
  74. static void vkDestroyCommandPool(PFN_vkDestroyCommandPool f, VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) {
  75. f(device, commandPool, pAllocator);
  76. }
  77. static VkResult vkAllocateCommandBuffers(PFN_vkAllocateCommandBuffers f, VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
  78. return f(device, pAllocateInfo, pCommandBuffers);
  79. }
  80. static void vkFreeCommandBuffers(PFN_vkFreeCommandBuffers f, VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
  81. f(device, commandPool, commandBufferCount, pCommandBuffers);
  82. }
  83. static VkResult vkBeginCommandBuffer(PFN_vkBeginCommandBuffer f, VkCommandBuffer commandBuffer, VkCommandBufferBeginInfo pBeginInfo) {
  84. return f(commandBuffer, &pBeginInfo);
  85. }
  86. static VkResult vkEndCommandBuffer(PFN_vkEndCommandBuffer f, VkCommandBuffer commandBuffer) {
  87. return f(commandBuffer);
  88. }
  89. static VkResult vkQueueSubmit(PFN_vkQueueSubmit f, VkQueue queue, VkSubmitInfo pSubmits, VkFence fence) {
  90. return f(queue, 1, &pSubmits, fence);
  91. }
  92. static void vkCmdBeginRenderPass(PFN_vkCmdBeginRenderPass f, VkCommandBuffer commandBuffer, VkRenderPassBeginInfo pRenderPassBegin, VkSubpassContents contents) {
  93. f(commandBuffer, &pRenderPassBegin, contents);
  94. }
  95. static void vkCmdEndRenderPass(PFN_vkCmdEndRenderPass f, VkCommandBuffer commandBuffer) {
  96. f(commandBuffer);
  97. }
  98. static void vkCmdCopyBuffer(PFN_vkCmdCopyBuffer f, VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy *pRegions) {
  99. f(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
  100. }
  101. static void vkCmdCopyBufferToImage(PFN_vkCmdCopyBufferToImage f, VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
  102. f(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
  103. }
  104. static void vkCmdPipelineBarrier(PFN_vkCmdPipelineBarrier f, VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) {
  105. f(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
  106. }
  107. static void vkCmdPushConstants(PFN_vkCmdPushConstants f, VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void *pValues) {
  108. f(commandBuffer, layout, stageFlags, offset, size, pValues);
  109. }
  110. static void vkCmdBindPipeline(PFN_vkCmdBindPipeline f, VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
  111. f(commandBuffer, pipelineBindPoint, pipeline);
  112. }
  113. static void vkCmdBindVertexBuffers(PFN_vkCmdBindVertexBuffers f, VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) {
  114. f(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
  115. }
  116. static void vkCmdSetViewport(PFN_vkCmdSetViewport f, VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) {
  117. f(commandBuffer, firstViewport, viewportCount, pViewports);
  118. }
  119. static void vkCmdBindIndexBuffer(PFN_vkCmdBindIndexBuffer f, VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
  120. f(commandBuffer, buffer, offset, indexType);
  121. }
  122. static void vkCmdDraw(PFN_vkCmdDraw f, VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
  123. f(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
  124. }
  125. static void vkCmdDrawIndexed(PFN_vkCmdDrawIndexed f, VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
  126. f(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
  127. }
  128. static void vkCmdBindDescriptorSets(PFN_vkCmdBindDescriptorSets f, VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
  129. f(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
  130. }
  131. static void vkCmdCopyImageToBuffer(PFN_vkCmdCopyImageToBuffer f, VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
  132. f(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
  133. }
  134. static void vkCmdDispatch(PFN_vkCmdDispatch f, VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) {
  135. f(commandBuffer, groupCountX, groupCountY, groupCountZ);
  136. }
  137. static VkResult vkCreateImage(PFN_vkCreateImage f, VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
  138. return f(device, pCreateInfo, pAllocator, pImage);
  139. }
  140. static void vkDestroyImage(PFN_vkDestroyImage f, VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
  141. f(device, image, pAllocator);
  142. }
  143. static void vkGetImageMemoryRequirements(PFN_vkGetImageMemoryRequirements f, VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
  144. f(device, image, pMemoryRequirements);
  145. }
  146. static VkResult vkAllocateMemory(PFN_vkAllocateMemory f, VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
  147. return f(device, pAllocateInfo, pAllocator, pMemory);
  148. }
  149. static VkResult vkBindImageMemory(PFN_vkBindImageMemory f, VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
  150. return f(device, image, memory, memoryOffset);
  151. }
  152. static void vkFreeMemory(PFN_vkFreeMemory f, VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) {
  153. f(device, memory, pAllocator);
  154. }
  155. static void vkGetPhysicalDeviceMemoryProperties(PFN_vkGetPhysicalDeviceMemoryProperties f, VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
  156. f(physicalDevice, pMemoryProperties);
  157. }
  158. static VkResult vkCreateSampler(PFN_vkCreateSampler f,VkDevice device, const VkSamplerCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
  159. return f(device, pCreateInfo, pAllocator, pSampler);
  160. }
  161. static void vkDestroySampler(PFN_vkDestroySampler f, VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) {
  162. f(device, sampler, pAllocator);
  163. }
  164. static VkResult vkCreateBuffer(PFN_vkCreateBuffer f, VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
  165. return f(device, pCreateInfo, pAllocator, pBuffer);
  166. }
  167. static void vkDestroyBuffer(PFN_vkDestroyBuffer f, VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
  168. f(device, buffer, pAllocator);
  169. }
  170. static void vkGetBufferMemoryRequirements(PFN_vkGetBufferMemoryRequirements f, VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
  171. f(device, buffer, pMemoryRequirements);
  172. }
  173. static VkResult vkBindBufferMemory(PFN_vkBindBufferMemory f, VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
  174. return f(device, buffer, memory, memoryOffset);
  175. }
  176. static VkResult vkCreateShaderModule(PFN_vkCreateShaderModule f, VkDevice device, VkShaderModuleCreateInfo pCreateInfo, const VkAllocationCallbacks *pAllocator, VkShaderModule *pShaderModule) {
  177. return f(device, &pCreateInfo, pAllocator, pShaderModule);
  178. }
  179. static void vkDestroyShaderModule(PFN_vkDestroyShaderModule f, VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) {
  180. f(device, shaderModule, pAllocator);
  181. }
  182. static VkResult vkCreateGraphicsPipelines(PFN_vkCreateGraphicsPipelines f, VkDevice device, VkPipelineCache pipelineCache, VkGraphicsPipelineCreateInfo pCreateInfo, VkPipelineDynamicStateCreateInfo dynInf, VkPipelineColorBlendStateCreateInfo blendInf, VkPipelineVertexInputStateCreateInfo vertexInf, VkPipelineViewportStateCreateInfo viewportInf, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
  183. pCreateInfo.pDynamicState = &dynInf;
  184. pCreateInfo.pViewportState = &viewportInf;
  185. pCreateInfo.pColorBlendState = &blendInf;
  186. pCreateInfo.pVertexInputState = &vertexInf;
  187. return f(device, pipelineCache, 1, &pCreateInfo, pAllocator, pPipelines);
  188. }
  189. static void vkDestroyPipeline(PFN_vkDestroyPipeline f, VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) {
  190. f(device, pipeline, pAllocator);
  191. }
  192. static VkResult vkCreatePipelineLayout(PFN_vkCreatePipelineLayout f, VkDevice device, VkPipelineLayoutCreateInfo pCreateInfo, const VkAllocationCallbacks *pAllocator, VkPipelineLayout *pPipelineLayout) {
  193. return f(device, &pCreateInfo, pAllocator, pPipelineLayout);
  194. }
  195. static void vkDestroyPipelineLayout(PFN_vkDestroyPipelineLayout f, VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) {
  196. f(device, pipelineLayout, pAllocator);
  197. }
  198. static VkResult vkCreateDescriptorSetLayout(PFN_vkCreateDescriptorSetLayout f, VkDevice device, VkDescriptorSetLayoutCreateInfo pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) {
  199. return f(device, &pCreateInfo, pAllocator, pSetLayout);
  200. }
  201. static void vkDestroyDescriptorSetLayout(PFN_vkDestroyDescriptorSetLayout f, VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) {
  202. f(device, descriptorSetLayout, pAllocator);
  203. }
  204. static VkResult vkMapMemory(PFN_vkMapMemory f, VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) {
  205. return f(device, memory, offset, size, flags, ppData);
  206. }
  207. static void vkUnmapMemory(PFN_vkUnmapMemory f, VkDevice device, VkDeviceMemory memory) {
  208. f(device, memory);
  209. }
  210. static VkResult vkResetCommandBuffer(PFN_vkResetCommandBuffer f, VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
  211. return f(commandBuffer, flags);
  212. }
  213. static VkResult vkCreateDescriptorPool(PFN_vkCreateDescriptorPool f, VkDevice device, VkDescriptorPoolCreateInfo pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDescriptorPool *pDescriptorPool) {
  214. return f(device, &pCreateInfo, pAllocator, pDescriptorPool);
  215. }
  216. static void vkDestroyDescriptorPool(PFN_vkDestroyDescriptorPool f, VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) {
  217. f(device, descriptorPool, pAllocator);
  218. }
  219. static VkResult vkAllocateDescriptorSets(PFN_vkAllocateDescriptorSets f, VkDevice device, VkDescriptorSetAllocateInfo pAllocateInfo, VkDescriptorSet *pDescriptorSets) {
  220. return f(device, &pAllocateInfo, pDescriptorSets);
  221. }
  222. static VkResult vkFreeDescriptorSets(PFN_vkFreeDescriptorSets f, VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets) {
  223. return f(device, descriptorPool, descriptorSetCount, pDescriptorSets);
  224. }
  225. static void vkUpdateDescriptorSets(PFN_vkUpdateDescriptorSets f, VkDevice device, VkWriteDescriptorSet pDescriptorWrite, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) {
  226. f(device, 1, &pDescriptorWrite, descriptorCopyCount, pDescriptorCopies);
  227. }
  228. static VkResult vkResetDescriptorPool(PFN_vkResetDescriptorPool f, VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
  229. return f(device, descriptorPool, flags);
  230. }
  231. static void vkCmdBlitImage(PFN_vkCmdBlitImage f, VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter) {
  232. f(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
  233. }
  234. static void vkCmdCopyImage(PFN_vkCmdCopyImage f, VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) {
  235. f(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
  236. }
  237. static VkResult vkCreateComputePipelines(PFN_vkCreateComputePipelines f, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) {
  238. return f(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
  239. }
  240. static VkResult vkCreateFence(PFN_vkCreateFence f, VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
  241. return f(device, pCreateInfo, pAllocator, pFence);
  242. }
  243. static void vkDestroyFence(PFN_vkDestroyFence f, VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
  244. f(device, fence, pAllocator);
  245. }
  246. static VkResult vkWaitForFences(PFN_vkWaitForFences f, VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) {
  247. return f(device, fenceCount, pFences, waitAll, timeout);
  248. }
  249. static VkResult vkResetFences(PFN_vkResetFences f, VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
  250. return f(device, fenceCount, pFences);
  251. }
  252. static void vkGetPhysicalDeviceProperties(PFN_vkGetPhysicalDeviceProperties f, VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) {
  253. f(physicalDevice, pProperties);
  254. }
  255. static VkResult vkGetPhysicalDeviceSurfaceSupportKHR(PFN_vkGetPhysicalDeviceSurfaceSupportKHR f, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32 *pSupported) {
  256. return f(physicalDevice, queueFamilyIndex, surface, pSupported);
  257. }
  258. static void vkDestroySurfaceKHR(PFN_vkDestroySurfaceKHR f, VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
  259. f(instance, surface, pAllocator);
  260. }
  261. static VkResult vkGetPhysicalDeviceSurfaceFormatsKHR(PFN_vkGetPhysicalDeviceSurfaceFormatsKHR f, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats) {
  262. return f(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
  263. }
  264. static VkResult vkGetPhysicalDeviceSurfacePresentModesKHR(PFN_vkGetPhysicalDeviceSurfacePresentModesKHR f, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) {
  265. return f(physicalDevice, surface, pPresentModeCount, pPresentModes);
  266. }
  267. static VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR(PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR f, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) {
  268. return f(physicalDevice, surface, pSurfaceCapabilities);
  269. }
  270. static VkResult vkCreateSwapchainKHR(PFN_vkCreateSwapchainKHR f, VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
  271. return f(device, pCreateInfo, pAllocator, pSwapchain);
  272. }
  273. static void vkDestroySwapchainKHR(PFN_vkDestroySwapchainKHR f, VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) {
  274. f(device, swapchain, pAllocator);
  275. }
  276. static VkResult vkGetSwapchainImagesKHR(PFN_vkGetSwapchainImagesKHR f, VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages) {
  277. return f(device, swapchain, pSwapchainImageCount, pSwapchainImages);
  278. }
  279. // indexAndResult holds both an integer and a result returned by value, to
  280. // avoid Go heap allocation of the integer with Vulkan's return style.
  281. struct intAndResult {
  282. uint32_t uint;
  283. VkResult res;
  284. };
  285. static struct intAndResult vkAcquireNextImageKHR(PFN_vkAcquireNextImageKHR f, VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence) {
  286. struct intAndResult res;
  287. res.res = f(device, swapchain, timeout, semaphore, fence, &res.uint);
  288. return res;
  289. }
  290. static VkResult vkQueuePresentKHR(PFN_vkQueuePresentKHR f, VkQueue queue, const VkPresentInfoKHR pPresentInfo) {
  291. return f(queue, &pPresentInfo);
  292. }
  293. */
  294. import "C"
  295. import (
  296. "errors"
  297. "fmt"
  298. "image"
  299. "math"
  300. "reflect"
  301. "runtime"
  302. "sync"
  303. "unsafe"
  304. )
  305. type (
  306. AttachmentLoadOp = C.VkAttachmentLoadOp
  307. AccessFlags = C.VkAccessFlags
  308. BlendFactor = C.VkBlendFactor
  309. Buffer = C.VkBuffer
  310. BufferImageCopy = C.VkBufferImageCopy
  311. BufferMemoryBarrier = C.VkBufferMemoryBarrier
  312. BufferUsageFlags = C.VkBufferUsageFlags
  313. CommandPool = C.VkCommandPool
  314. CommandBuffer = C.VkCommandBuffer
  315. DependencyFlags = C.VkDependencyFlags
  316. DescriptorPool = C.VkDescriptorPool
  317. DescriptorPoolSize = C.VkDescriptorPoolSize
  318. DescriptorSet = C.VkDescriptorSet
  319. DescriptorSetLayout = C.VkDescriptorSetLayout
  320. DescriptorType = C.VkDescriptorType
  321. Device = C.VkDevice
  322. DeviceMemory = C.VkDeviceMemory
  323. DeviceSize = C.VkDeviceSize
  324. Fence = C.VkFence
  325. Queue = C.VkQueue
  326. IndexType = C.VkIndexType
  327. Image = C.VkImage
  328. ImageBlit = C.VkImageBlit
  329. ImageCopy = C.VkImageCopy
  330. ImageLayout = C.VkImageLayout
  331. ImageMemoryBarrier = C.VkImageMemoryBarrier
  332. ImageUsageFlags = C.VkImageUsageFlags
  333. ImageView = C.VkImageView
  334. Instance = C.VkInstance
  335. Filter = C.VkFilter
  336. Format = C.VkFormat
  337. FormatFeatureFlags = C.VkFormatFeatureFlags
  338. Framebuffer = C.VkFramebuffer
  339. MemoryBarrier = C.VkMemoryBarrier
  340. MemoryPropertyFlags = C.VkMemoryPropertyFlags
  341. Pipeline = C.VkPipeline
  342. PipelineBindPoint = C.VkPipelineBindPoint
  343. PipelineLayout = C.VkPipelineLayout
  344. PipelineStageFlags = C.VkPipelineStageFlags
  345. PhysicalDevice = C.VkPhysicalDevice
  346. PrimitiveTopology = C.VkPrimitiveTopology
  347. PushConstantRange = C.VkPushConstantRange
  348. QueueFamilyProperties = C.VkQueueFamilyProperties
  349. QueueFlags = C.VkQueueFlags
  350. RenderPass = C.VkRenderPass
  351. Sampler = C.VkSampler
  352. SamplerMipmapMode = C.VkSamplerMipmapMode
  353. Semaphore = C.VkSemaphore
  354. ShaderModule = C.VkShaderModule
  355. ShaderStageFlags = C.VkShaderStageFlags
  356. SubpassDependency = C.VkSubpassDependency
  357. Viewport = C.VkViewport
  358. WriteDescriptorSet = C.VkWriteDescriptorSet
  359. Surface = C.VkSurfaceKHR
  360. SurfaceCapabilities = C.VkSurfaceCapabilitiesKHR
  361. Swapchain = C.VkSwapchainKHR
  362. )
  363. type VertexInputBindingDescription struct {
  364. Binding int
  365. Stride int
  366. }
  367. type VertexInputAttributeDescription struct {
  368. Location int
  369. Binding int
  370. Format Format
  371. Offset int
  372. }
  373. type DescriptorSetLayoutBinding struct {
  374. Binding int
  375. DescriptorType DescriptorType
  376. StageFlags ShaderStageFlags
  377. }
  378. type Error C.VkResult
  379. const (
  380. FORMAT_R8G8B8A8_UNORM Format = C.VK_FORMAT_R8G8B8A8_UNORM
  381. FORMAT_B8G8R8A8_SRGB Format = C.VK_FORMAT_B8G8R8A8_SRGB
  382. FORMAT_R8G8B8A8_SRGB Format = C.VK_FORMAT_R8G8B8A8_SRGB
  383. FORMAT_R16_SFLOAT Format = C.VK_FORMAT_R16_SFLOAT
  384. FORMAT_R32_SFLOAT Format = C.VK_FORMAT_R32_SFLOAT
  385. FORMAT_R32G32_SFLOAT Format = C.VK_FORMAT_R32G32_SFLOAT
  386. FORMAT_R32G32B32_SFLOAT Format = C.VK_FORMAT_R32G32B32_SFLOAT
  387. FORMAT_R32G32B32A32_SFLOAT Format = C.VK_FORMAT_R32G32B32A32_SFLOAT
  388. FORMAT_FEATURE_COLOR_ATTACHMENT_BIT FormatFeatureFlags = C.VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
  389. FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT FormatFeatureFlags = C.VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
  390. FORMAT_FEATURE_SAMPLED_IMAGE_BIT FormatFeatureFlags = C.VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
  391. FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT FormatFeatureFlags = C.VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
  392. IMAGE_USAGE_SAMPLED_BIT ImageUsageFlags = C.VK_IMAGE_USAGE_SAMPLED_BIT
  393. IMAGE_USAGE_COLOR_ATTACHMENT_BIT ImageUsageFlags = C.VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
  394. IMAGE_USAGE_STORAGE_BIT ImageUsageFlags = C.VK_IMAGE_USAGE_STORAGE_BIT
  395. IMAGE_USAGE_TRANSFER_DST_BIT ImageUsageFlags = C.VK_IMAGE_USAGE_TRANSFER_DST_BIT
  396. IMAGE_USAGE_TRANSFER_SRC_BIT ImageUsageFlags = C.VK_IMAGE_USAGE_TRANSFER_SRC_BIT
  397. FILTER_NEAREST Filter = C.VK_FILTER_NEAREST
  398. FILTER_LINEAR Filter = C.VK_FILTER_LINEAR
  399. ATTACHMENT_LOAD_OP_CLEAR AttachmentLoadOp = C.VK_ATTACHMENT_LOAD_OP_CLEAR
  400. ATTACHMENT_LOAD_OP_DONT_CARE AttachmentLoadOp = C.VK_ATTACHMENT_LOAD_OP_DONT_CARE
  401. ATTACHMENT_LOAD_OP_LOAD AttachmentLoadOp = C.VK_ATTACHMENT_LOAD_OP_LOAD
  402. IMAGE_LAYOUT_UNDEFINED ImageLayout = C.VK_IMAGE_LAYOUT_UNDEFINED
  403. IMAGE_LAYOUT_PRESENT_SRC_KHR ImageLayout = C.VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
  404. IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL ImageLayout = C.VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
  405. IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL ImageLayout = C.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
  406. IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL ImageLayout = C.VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
  407. IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL ImageLayout = C.VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
  408. IMAGE_LAYOUT_GENERAL ImageLayout = C.VK_IMAGE_LAYOUT_GENERAL
  409. BUFFER_USAGE_TRANSFER_DST_BIT BufferUsageFlags = C.VK_BUFFER_USAGE_TRANSFER_DST_BIT
  410. BUFFER_USAGE_TRANSFER_SRC_BIT BufferUsageFlags = C.VK_BUFFER_USAGE_TRANSFER_SRC_BIT
  411. BUFFER_USAGE_UNIFORM_BUFFER_BIT BufferUsageFlags = C.VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
  412. BUFFER_USAGE_STORAGE_BUFFER_BIT BufferUsageFlags = C.VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
  413. BUFFER_USAGE_INDEX_BUFFER_BIT BufferUsageFlags = C.VK_BUFFER_USAGE_INDEX_BUFFER_BIT
  414. BUFFER_USAGE_VERTEX_BUFFER_BIT BufferUsageFlags = C.VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
  415. ERROR_OUT_OF_DATE_KHR = Error(C.VK_ERROR_OUT_OF_DATE_KHR)
  416. ERROR_SURFACE_LOST_KHR = Error(C.VK_ERROR_SURFACE_LOST_KHR)
  417. ERROR_DEVICE_LOST = Error(C.VK_ERROR_DEVICE_LOST)
  418. SUBOPTIMAL_KHR = Error(C.VK_SUBOPTIMAL_KHR)
  419. FENCE_CREATE_SIGNALED_BIT = 0x00000001
  420. BLEND_FACTOR_ZERO BlendFactor = C.VK_BLEND_FACTOR_ZERO
  421. BLEND_FACTOR_ONE BlendFactor = C.VK_BLEND_FACTOR_ONE
  422. BLEND_FACTOR_ONE_MINUS_SRC_ALPHA BlendFactor = C.VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA
  423. BLEND_FACTOR_DST_COLOR BlendFactor = C.VK_BLEND_FACTOR_DST_COLOR
  424. PRIMITIVE_TOPOLOGY_TRIANGLE_LIST PrimitiveTopology = C.VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
  425. PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP PrimitiveTopology = C.VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
  426. SHADER_STAGE_VERTEX_BIT ShaderStageFlags = C.VK_SHADER_STAGE_VERTEX_BIT
  427. SHADER_STAGE_FRAGMENT_BIT ShaderStageFlags = C.VK_SHADER_STAGE_FRAGMENT_BIT
  428. SHADER_STAGE_COMPUTE_BIT ShaderStageFlags = C.VK_SHADER_STAGE_COMPUTE_BIT
  429. DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER DescriptorType = C.VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
  430. DESCRIPTOR_TYPE_UNIFORM_BUFFER DescriptorType = C.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
  431. DESCRIPTOR_TYPE_STORAGE_BUFFER DescriptorType = C.VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
  432. DESCRIPTOR_TYPE_STORAGE_IMAGE DescriptorType = C.VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
  433. MEMORY_PROPERTY_DEVICE_LOCAL_BIT MemoryPropertyFlags = C.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
  434. MEMORY_PROPERTY_HOST_VISIBLE_BIT MemoryPropertyFlags = C.VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
  435. MEMORY_PROPERTY_HOST_COHERENT_BIT MemoryPropertyFlags = C.VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
  436. DEPENDENCY_BY_REGION_BIT DependencyFlags = C.VK_DEPENDENCY_BY_REGION_BIT
  437. PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
  438. PIPELINE_STAGE_TRANSFER_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_TRANSFER_BIT
  439. PIPELINE_STAGE_FRAGMENT_SHADER_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
  440. PIPELINE_STAGE_COMPUTE_SHADER_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
  441. PIPELINE_STAGE_TOP_OF_PIPE_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
  442. PIPELINE_STAGE_HOST_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_HOST_BIT
  443. PIPELINE_STAGE_VERTEX_INPUT_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
  444. PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT PipelineStageFlags = C.VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
  445. ACCESS_MEMORY_READ_BIT AccessFlags = C.VK_ACCESS_MEMORY_READ_BIT
  446. ACCESS_MEMORY_WRITE_BIT AccessFlags = C.VK_ACCESS_MEMORY_WRITE_BIT
  447. ACCESS_TRANSFER_READ_BIT AccessFlags = C.VK_ACCESS_TRANSFER_READ_BIT
  448. ACCESS_TRANSFER_WRITE_BIT AccessFlags = C.VK_ACCESS_TRANSFER_WRITE_BIT
  449. ACCESS_SHADER_READ_BIT AccessFlags = C.VK_ACCESS_SHADER_READ_BIT
  450. ACCESS_SHADER_WRITE_BIT AccessFlags = C.VK_ACCESS_SHADER_WRITE_BIT
  451. ACCESS_COLOR_ATTACHMENT_READ_BIT AccessFlags = C.VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
  452. ACCESS_COLOR_ATTACHMENT_WRITE_BIT AccessFlags = C.VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
  453. ACCESS_HOST_READ_BIT AccessFlags = C.VK_ACCESS_HOST_READ_BIT
  454. ACCESS_HOST_WRITE_BIT AccessFlags = C.VK_ACCESS_HOST_WRITE_BIT
  455. ACCESS_VERTEX_ATTRIBUTE_READ_BIT AccessFlags = C.VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
  456. ACCESS_INDEX_READ_BIT AccessFlags = C.VK_ACCESS_INDEX_READ_BIT
  457. PIPELINE_BIND_POINT_COMPUTE PipelineBindPoint = C.VK_PIPELINE_BIND_POINT_COMPUTE
  458. PIPELINE_BIND_POINT_GRAPHICS PipelineBindPoint = C.VK_PIPELINE_BIND_POINT_GRAPHICS
  459. INDEX_TYPE_UINT16 IndexType = C.VK_INDEX_TYPE_UINT16
  460. INDEX_TYPE_UINT32 IndexType = C.VK_INDEX_TYPE_UINT32
  461. QUEUE_GRAPHICS_BIT QueueFlags = C.VK_QUEUE_GRAPHICS_BIT
  462. QUEUE_COMPUTE_BIT QueueFlags = C.VK_QUEUE_COMPUTE_BIT
  463. SAMPLER_MIPMAP_MODE_NEAREST SamplerMipmapMode = C.VK_SAMPLER_MIPMAP_MODE_NEAREST
  464. SAMPLER_MIPMAP_MODE_LINEAR SamplerMipmapMode = C.VK_SAMPLER_MIPMAP_MODE_LINEAR
  465. REMAINING_MIP_LEVELS = -1
  466. )
  467. var (
  468. once sync.Once
  469. loadErr error
  470. loadFuncs []func(dlopen func(name string) *[0]byte)
  471. )
  472. var funcs struct {
  473. vkCreateInstance C.PFN_vkCreateInstance
  474. vkDestroyInstance C.PFN_vkDestroyInstance
  475. vkEnumeratePhysicalDevices C.PFN_vkEnumeratePhysicalDevices
  476. vkGetPhysicalDeviceQueueFamilyProperties C.PFN_vkGetPhysicalDeviceQueueFamilyProperties
  477. vkGetPhysicalDeviceFormatProperties C.PFN_vkGetPhysicalDeviceFormatProperties
  478. vkCreateDevice C.PFN_vkCreateDevice
  479. vkDestroyDevice C.PFN_vkDestroyDevice
  480. vkGetDeviceQueue C.PFN_vkGetDeviceQueue
  481. vkCreateImageView C.PFN_vkCreateImageView
  482. vkDestroyImageView C.PFN_vkDestroyImageView
  483. vkCreateFramebuffer C.PFN_vkCreateFramebuffer
  484. vkDestroyFramebuffer C.PFN_vkDestroyFramebuffer
  485. vkDeviceWaitIdle C.PFN_vkDeviceWaitIdle
  486. vkQueueWaitIdle C.PFN_vkQueueWaitIdle
  487. vkCreateSemaphore C.PFN_vkCreateSemaphore
  488. vkDestroySemaphore C.PFN_vkDestroySemaphore
  489. vkCreateRenderPass C.PFN_vkCreateRenderPass
  490. vkDestroyRenderPass C.PFN_vkDestroyRenderPass
  491. vkCreateCommandPool C.PFN_vkCreateCommandPool
  492. vkDestroyCommandPool C.PFN_vkDestroyCommandPool
  493. vkAllocateCommandBuffers C.PFN_vkAllocateCommandBuffers
  494. vkFreeCommandBuffers C.PFN_vkFreeCommandBuffers
  495. vkBeginCommandBuffer C.PFN_vkBeginCommandBuffer
  496. vkEndCommandBuffer C.PFN_vkEndCommandBuffer
  497. vkQueueSubmit C.PFN_vkQueueSubmit
  498. vkCmdBeginRenderPass C.PFN_vkCmdBeginRenderPass
  499. vkCmdEndRenderPass C.PFN_vkCmdEndRenderPass
  500. vkCmdCopyBuffer C.PFN_vkCmdCopyBuffer
  501. vkCmdCopyBufferToImage C.PFN_vkCmdCopyBufferToImage
  502. vkCmdPipelineBarrier C.PFN_vkCmdPipelineBarrier
  503. vkCmdPushConstants C.PFN_vkCmdPushConstants
  504. vkCmdBindPipeline C.PFN_vkCmdBindPipeline
  505. vkCmdBindVertexBuffers C.PFN_vkCmdBindVertexBuffers
  506. vkCmdSetViewport C.PFN_vkCmdSetViewport
  507. vkCmdBindIndexBuffer C.PFN_vkCmdBindIndexBuffer
  508. vkCmdDraw C.PFN_vkCmdDraw
  509. vkCmdDrawIndexed C.PFN_vkCmdDrawIndexed
  510. vkCmdBindDescriptorSets C.PFN_vkCmdBindDescriptorSets
  511. vkCmdCopyImageToBuffer C.PFN_vkCmdCopyImageToBuffer
  512. vkCmdDispatch C.PFN_vkCmdDispatch
  513. vkCreateImage C.PFN_vkCreateImage
  514. vkDestroyImage C.PFN_vkDestroyImage
  515. vkGetImageMemoryRequirements C.PFN_vkGetImageMemoryRequirements
  516. vkAllocateMemory C.PFN_vkAllocateMemory
  517. vkBindImageMemory C.PFN_vkBindImageMemory
  518. vkFreeMemory C.PFN_vkFreeMemory
  519. vkGetPhysicalDeviceMemoryProperties C.PFN_vkGetPhysicalDeviceMemoryProperties
  520. vkCreateSampler C.PFN_vkCreateSampler
  521. vkDestroySampler C.PFN_vkDestroySampler
  522. vkCreateBuffer C.PFN_vkCreateBuffer
  523. vkDestroyBuffer C.PFN_vkDestroyBuffer
  524. vkGetBufferMemoryRequirements C.PFN_vkGetBufferMemoryRequirements
  525. vkBindBufferMemory C.PFN_vkBindBufferMemory
  526. vkCreateShaderModule C.PFN_vkCreateShaderModule
  527. vkDestroyShaderModule C.PFN_vkDestroyShaderModule
  528. vkCreateGraphicsPipelines C.PFN_vkCreateGraphicsPipelines
  529. vkDestroyPipeline C.PFN_vkDestroyPipeline
  530. vkCreatePipelineLayout C.PFN_vkCreatePipelineLayout
  531. vkDestroyPipelineLayout C.PFN_vkDestroyPipelineLayout
  532. vkCreateDescriptorSetLayout C.PFN_vkCreateDescriptorSetLayout
  533. vkDestroyDescriptorSetLayout C.PFN_vkDestroyDescriptorSetLayout
  534. vkMapMemory C.PFN_vkMapMemory
  535. vkUnmapMemory C.PFN_vkUnmapMemory
  536. vkResetCommandBuffer C.PFN_vkResetCommandBuffer
  537. vkCreateDescriptorPool C.PFN_vkCreateDescriptorPool
  538. vkDestroyDescriptorPool C.PFN_vkDestroyDescriptorPool
  539. vkAllocateDescriptorSets C.PFN_vkAllocateDescriptorSets
  540. vkFreeDescriptorSets C.PFN_vkFreeDescriptorSets
  541. vkUpdateDescriptorSets C.PFN_vkUpdateDescriptorSets
  542. vkResetDescriptorPool C.PFN_vkResetDescriptorPool
  543. vkCmdBlitImage C.PFN_vkCmdBlitImage
  544. vkCmdCopyImage C.PFN_vkCmdCopyImage
  545. vkCreateComputePipelines C.PFN_vkCreateComputePipelines
  546. vkCreateFence C.PFN_vkCreateFence
  547. vkDestroyFence C.PFN_vkDestroyFence
  548. vkWaitForFences C.PFN_vkWaitForFences
  549. vkResetFences C.PFN_vkResetFences
  550. vkGetPhysicalDeviceProperties C.PFN_vkGetPhysicalDeviceProperties
  551. vkGetPhysicalDeviceSurfaceSupportKHR C.PFN_vkGetPhysicalDeviceSurfaceSupportKHR
  552. vkDestroySurfaceKHR C.PFN_vkDestroySurfaceKHR
  553. vkGetPhysicalDeviceSurfaceFormatsKHR C.PFN_vkGetPhysicalDeviceSurfaceFormatsKHR
  554. vkGetPhysicalDeviceSurfacePresentModesKHR C.PFN_vkGetPhysicalDeviceSurfacePresentModesKHR
  555. vkGetPhysicalDeviceSurfaceCapabilitiesKHR C.PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR
  556. vkCreateSwapchainKHR C.PFN_vkCreateSwapchainKHR
  557. vkDestroySwapchainKHR C.PFN_vkDestroySwapchainKHR
  558. vkGetSwapchainImagesKHR C.PFN_vkGetSwapchainImagesKHR
  559. vkAcquireNextImageKHR C.PFN_vkAcquireNextImageKHR
  560. vkQueuePresentKHR C.PFN_vkQueuePresentKHR
  561. }
  562. var (
  563. nilSurface C.VkSurfaceKHR
  564. nilSwapchain C.VkSwapchainKHR
  565. nilSemaphore C.VkSemaphore
  566. nilImageView C.VkImageView
  567. nilRenderPass C.VkRenderPass
  568. nilFramebuffer C.VkFramebuffer
  569. nilCommandPool C.VkCommandPool
  570. nilImage C.VkImage
  571. nilDeviceMemory C.VkDeviceMemory
  572. nilSampler C.VkSampler
  573. nilBuffer C.VkBuffer
  574. nilShaderModule C.VkShaderModule
  575. nilPipeline C.VkPipeline
  576. nilPipelineCache C.VkPipelineCache
  577. nilPipelineLayout C.VkPipelineLayout
  578. nilDescriptorSetLayout C.VkDescriptorSetLayout
  579. nilDescriptorPool C.VkDescriptorPool
  580. nilDescriptorSet C.VkDescriptorSet
  581. nilFence C.VkFence
  582. )
  583. func vkInit() error {
  584. once.Do(func() {
  585. var libName string
  586. switch {
  587. case runtime.GOOS == "android":
  588. libName = "libvulkan.so"
  589. default:
  590. libName = "libvulkan.so.1"
  591. }
  592. lib := dlopen(libName)
  593. if lib == nil {
  594. loadErr = fmt.Errorf("vulkan: %s", C.GoString(C.dlerror()))
  595. return
  596. }
  597. dlopen := func(name string) *[0]byte {
  598. return (*[0]byte)(dlsym(lib, name))
  599. }
  600. must := func(name string) *[0]byte {
  601. ptr := dlopen(name)
  602. if ptr != nil {
  603. return ptr
  604. }
  605. if loadErr == nil {
  606. loadErr = fmt.Errorf("vulkan: function %q not found: %s", name, C.GoString(C.dlerror()))
  607. }
  608. return nil
  609. }
  610. funcs.vkCreateInstance = must("vkCreateInstance")
  611. funcs.vkDestroyInstance = must("vkDestroyInstance")
  612. funcs.vkEnumeratePhysicalDevices = must("vkEnumeratePhysicalDevices")
  613. funcs.vkGetPhysicalDeviceQueueFamilyProperties = must("vkGetPhysicalDeviceQueueFamilyProperties")
  614. funcs.vkGetPhysicalDeviceFormatProperties = must("vkGetPhysicalDeviceFormatProperties")
  615. funcs.vkCreateDevice = must("vkCreateDevice")
  616. funcs.vkDestroyDevice = must("vkDestroyDevice")
  617. funcs.vkGetDeviceQueue = must("vkGetDeviceQueue")
  618. funcs.vkCreateImageView = must("vkCreateImageView")
  619. funcs.vkDestroyImageView = must("vkDestroyImageView")
  620. funcs.vkCreateFramebuffer = must("vkCreateFramebuffer")
  621. funcs.vkDestroyFramebuffer = must("vkDestroyFramebuffer")
  622. funcs.vkDeviceWaitIdle = must("vkDeviceWaitIdle")
  623. funcs.vkQueueWaitIdle = must("vkQueueWaitIdle")
  624. funcs.vkCreateSemaphore = must("vkCreateSemaphore")
  625. funcs.vkDestroySemaphore = must("vkDestroySemaphore")
  626. funcs.vkCreateRenderPass = must("vkCreateRenderPass")
  627. funcs.vkDestroyRenderPass = must("vkDestroyRenderPass")
  628. funcs.vkCreateCommandPool = must("vkCreateCommandPool")
  629. funcs.vkDestroyCommandPool = must("vkDestroyCommandPool")
  630. funcs.vkAllocateCommandBuffers = must("vkAllocateCommandBuffers")
  631. funcs.vkFreeCommandBuffers = must("vkFreeCommandBuffers")
  632. funcs.vkBeginCommandBuffer = must("vkBeginCommandBuffer")
  633. funcs.vkEndCommandBuffer = must("vkEndCommandBuffer")
  634. funcs.vkQueueSubmit = must("vkQueueSubmit")
  635. funcs.vkCmdBeginRenderPass = must("vkCmdBeginRenderPass")
  636. funcs.vkCmdEndRenderPass = must("vkCmdEndRenderPass")
  637. funcs.vkCmdCopyBuffer = must("vkCmdCopyBuffer")
  638. funcs.vkCmdCopyBufferToImage = must("vkCmdCopyBufferToImage")
  639. funcs.vkCmdPipelineBarrier = must("vkCmdPipelineBarrier")
  640. funcs.vkCmdPushConstants = must("vkCmdPushConstants")
  641. funcs.vkCmdBindPipeline = must("vkCmdBindPipeline")
  642. funcs.vkCmdBindVertexBuffers = must("vkCmdBindVertexBuffers")
  643. funcs.vkCmdSetViewport = must("vkCmdSetViewport")
  644. funcs.vkCmdBindIndexBuffer = must("vkCmdBindIndexBuffer")
  645. funcs.vkCmdDraw = must("vkCmdDraw")
  646. funcs.vkCmdDrawIndexed = must("vkCmdDrawIndexed")
  647. funcs.vkCmdBindDescriptorSets = must("vkCmdBindDescriptorSets")
  648. funcs.vkCmdCopyImageToBuffer = must("vkCmdCopyImageToBuffer")
  649. funcs.vkCmdDispatch = must("vkCmdDispatch")
  650. funcs.vkCreateImage = must("vkCreateImage")
  651. funcs.vkDestroyImage = must("vkDestroyImage")
  652. funcs.vkGetImageMemoryRequirements = must("vkGetImageMemoryRequirements")
  653. funcs.vkAllocateMemory = must("vkAllocateMemory")
  654. funcs.vkBindImageMemory = must("vkBindImageMemory")
  655. funcs.vkFreeMemory = must("vkFreeMemory")
  656. funcs.vkGetPhysicalDeviceMemoryProperties = must("vkGetPhysicalDeviceMemoryProperties")
  657. funcs.vkCreateSampler = must("vkCreateSampler")
  658. funcs.vkDestroySampler = must("vkDestroySampler")
  659. funcs.vkCreateBuffer = must("vkCreateBuffer")
  660. funcs.vkDestroyBuffer = must("vkDestroyBuffer")
  661. funcs.vkGetBufferMemoryRequirements = must("vkGetBufferMemoryRequirements")
  662. funcs.vkBindBufferMemory = must("vkBindBufferMemory")
  663. funcs.vkCreateShaderModule = must("vkCreateShaderModule")
  664. funcs.vkDestroyShaderModule = must("vkDestroyShaderModule")
  665. funcs.vkCreateGraphicsPipelines = must("vkCreateGraphicsPipelines")
  666. funcs.vkDestroyPipeline = must("vkDestroyPipeline")
  667. funcs.vkCreatePipelineLayout = must("vkCreatePipelineLayout")
  668. funcs.vkDestroyPipelineLayout = must("vkDestroyPipelineLayout")
  669. funcs.vkCreateDescriptorSetLayout = must("vkCreateDescriptorSetLayout")
  670. funcs.vkDestroyDescriptorSetLayout = must("vkDestroyDescriptorSetLayout")
  671. funcs.vkMapMemory = must("vkMapMemory")
  672. funcs.vkUnmapMemory = must("vkUnmapMemory")
  673. funcs.vkResetCommandBuffer = must("vkResetCommandBuffer")
  674. funcs.vkCreateDescriptorPool = must("vkCreateDescriptorPool")
  675. funcs.vkDestroyDescriptorPool = must("vkDestroyDescriptorPool")
  676. funcs.vkAllocateDescriptorSets = must("vkAllocateDescriptorSets")
  677. funcs.vkFreeDescriptorSets = must("vkFreeDescriptorSets")
  678. funcs.vkUpdateDescriptorSets = must("vkUpdateDescriptorSets")
  679. funcs.vkResetDescriptorPool = must("vkResetDescriptorPool")
  680. funcs.vkCmdBlitImage = must("vkCmdBlitImage")
  681. funcs.vkCmdCopyImage = must("vkCmdCopyImage")
  682. funcs.vkCreateComputePipelines = must("vkCreateComputePipelines")
  683. funcs.vkCreateFence = must("vkCreateFence")
  684. funcs.vkDestroyFence = must("vkDestroyFence")
  685. funcs.vkWaitForFences = must("vkWaitForFences")
  686. funcs.vkResetFences = must("vkResetFences")
  687. funcs.vkGetPhysicalDeviceProperties = must("vkGetPhysicalDeviceProperties")
  688. funcs.vkGetPhysicalDeviceSurfaceSupportKHR = dlopen("vkGetPhysicalDeviceSurfaceSupportKHR")
  689. funcs.vkDestroySurfaceKHR = dlopen("vkDestroySurfaceKHR")
  690. funcs.vkGetPhysicalDeviceSurfaceFormatsKHR = dlopen("vkGetPhysicalDeviceSurfaceFormatsKHR")
  691. funcs.vkGetPhysicalDeviceSurfacePresentModesKHR = dlopen("vkGetPhysicalDeviceSurfacePresentModesKHR")
  692. funcs.vkGetPhysicalDeviceSurfaceCapabilitiesKHR = dlopen("vkGetPhysicalDeviceSurfaceCapabilitiesKHR")
  693. funcs.vkCreateSwapchainKHR = dlopen("vkCreateSwapchainKHR")
  694. funcs.vkDestroySwapchainKHR = dlopen("vkDestroySwapchainKHR")
  695. funcs.vkGetSwapchainImagesKHR = dlopen("vkGetSwapchainImagesKHR")
  696. funcs.vkAcquireNextImageKHR = dlopen("vkAcquireNextImageKHR")
  697. funcs.vkQueuePresentKHR = dlopen("vkQueuePresentKHR")
  698. for _, f := range loadFuncs {
  699. f(dlopen)
  700. }
  701. })
  702. return loadErr
  703. }
  704. func CreateInstance(exts ...string) (Instance, error) {
  705. if err := vkInit(); err != nil {
  706. return nil, err
  707. }
  708. // VK_MAKE_API_VERSION macro.
  709. makeVer := func(variant, major, minor, patch int) C.uint32_t {
  710. return ((((C.uint32_t)(variant)) << 29) | (((C.uint32_t)(major)) << 22) | (((C.uint32_t)(minor)) << 12) | ((C.uint32_t)(patch)))
  711. }
  712. appInf := C.VkApplicationInfo{
  713. sType: C.VK_STRUCTURE_TYPE_APPLICATION_INFO,
  714. apiVersion: makeVer(0, 1, 0, 0),
  715. }
  716. inf := C.VkInstanceCreateInfo{
  717. sType: C.VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
  718. // pApplicationInfo may be omitted according to the spec, but the Android
  719. // emulator crashes without it.
  720. pApplicationInfo: &appInf,
  721. }
  722. if len(exts) > 0 {
  723. cexts := mallocCStringArr(exts)
  724. defer freeCStringArr(cexts)
  725. inf.enabledExtensionCount = C.uint32_t(len(exts))
  726. inf.ppEnabledExtensionNames = &cexts[0]
  727. }
  728. var inst Instance
  729. if err := vkErr(C.vkCreateInstance(funcs.vkCreateInstance, inf, nil, &inst)); err != nil {
  730. return nil, fmt.Errorf("vulkan: vkCreateInstance: %w", err)
  731. }
  732. return inst, nil
  733. }
  734. func mallocCStringArr(s []string) []*C.char {
  735. carr := make([]*C.char, len(s))
  736. for i, ext := range s {
  737. carr[i] = C.CString(ext)
  738. }
  739. return carr
  740. }
  741. func freeCStringArr(s []*C.char) {
  742. for i := range s {
  743. C.free(unsafe.Pointer(s[i]))
  744. s[i] = nil
  745. }
  746. }
  747. func DestroyInstance(inst Instance) {
  748. C.vkDestroyInstance(funcs.vkDestroyInstance, inst, nil)
  749. }
  750. func GetPhysicalDeviceQueueFamilyProperties(pd PhysicalDevice) []QueueFamilyProperties {
  751. var count C.uint32_t
  752. C.vkGetPhysicalDeviceQueueFamilyProperties(funcs.vkGetPhysicalDeviceQueueFamilyProperties, pd, &count, nil)
  753. if count == 0 {
  754. return nil
  755. }
  756. queues := make([]C.VkQueueFamilyProperties, count)
  757. C.vkGetPhysicalDeviceQueueFamilyProperties(funcs.vkGetPhysicalDeviceQueueFamilyProperties, pd, &count, &queues[0])
  758. return queues
  759. }
  760. func EnumeratePhysicalDevices(inst Instance) ([]PhysicalDevice, error) {
  761. var count C.uint32_t
  762. if err := vkErr(C.vkEnumeratePhysicalDevices(funcs.vkEnumeratePhysicalDevices, inst, &count, nil)); err != nil {
  763. return nil, fmt.Errorf("vulkan: vkEnumeratePhysicalDevices: %w", err)
  764. }
  765. if count == 0 {
  766. return nil, nil
  767. }
  768. devs := make([]C.VkPhysicalDevice, count)
  769. if err := vkErr(C.vkEnumeratePhysicalDevices(funcs.vkEnumeratePhysicalDevices, inst, &count, &devs[0])); err != nil {
  770. return nil, fmt.Errorf("vulkan: vkEnumeratePhysicalDevices: %w", err)
  771. }
  772. return devs, nil
  773. }
  774. func ChoosePhysicalDevice(inst Instance, surf Surface) (PhysicalDevice, int, error) {
  775. devs, err := EnumeratePhysicalDevices(inst)
  776. if err != nil {
  777. return nil, 0, err
  778. }
  779. for _, pd := range devs {
  780. var props C.VkPhysicalDeviceProperties
  781. C.vkGetPhysicalDeviceProperties(funcs.vkGetPhysicalDeviceProperties, pd, &props)
  782. // The lavapipe software implementation doesn't work well rendering to a surface.
  783. // See https://gitlab.freedesktop.org/mesa/mesa/-/issues/5473.
  784. if surf != 0 && props.deviceType == C.VK_PHYSICAL_DEVICE_TYPE_CPU {
  785. continue
  786. }
  787. const caps = C.VK_QUEUE_GRAPHICS_BIT | C.VK_QUEUE_COMPUTE_BIT
  788. queueIdx, ok, err := chooseQueue(pd, surf, caps)
  789. if err != nil {
  790. return nil, 0, err
  791. }
  792. if !ok {
  793. continue
  794. }
  795. if surf != nilSurface {
  796. _, fmtFound, err := chooseFormat(pd, surf)
  797. if err != nil {
  798. return nil, 0, err
  799. }
  800. _, modFound, err := choosePresentMode(pd, surf)
  801. if err != nil {
  802. return nil, 0, err
  803. }
  804. if !fmtFound || !modFound {
  805. continue
  806. }
  807. }
  808. return pd, queueIdx, nil
  809. }
  810. return nil, 0, errors.New("vulkan: no suitable device found")
  811. }
  812. func CreateDeviceAndQueue(pd C.VkPhysicalDevice, queueIdx int, exts ...string) (Device, error) {
  813. priority := C.float(1.0)
  814. qinf := C.VkDeviceQueueCreateInfo{
  815. sType: C.VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
  816. queueCount: 1,
  817. queueFamilyIndex: C.uint32_t(queueIdx),
  818. pQueuePriorities: &priority,
  819. }
  820. inf := C.VkDeviceCreateInfo{
  821. sType: C.VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
  822. queueCreateInfoCount: 1,
  823. enabledExtensionCount: C.uint32_t(len(exts)),
  824. }
  825. if len(exts) > 0 {
  826. cexts := mallocCStringArr(exts)
  827. defer freeCStringArr(cexts)
  828. inf.ppEnabledExtensionNames = &cexts[0]
  829. }
  830. var dev Device
  831. if err := vkErr(C.vkCreateDevice(funcs.vkCreateDevice, pd, inf, qinf, nil, &dev)); err != nil {
  832. return nil, fmt.Errorf("vulkan: vkCreateDevice: %w", err)
  833. }
  834. return dev, nil
  835. }
  836. func GetDeviceQueue(d Device, queueFamily, queueIndex int) Queue {
  837. var queue Queue
  838. C.vkGetDeviceQueue(funcs.vkGetDeviceQueue, d, C.uint32_t(queueFamily), C.uint32_t(queueIndex), &queue)
  839. return queue
  840. }
  841. func GetPhysicalDeviceSurfaceCapabilities(pd PhysicalDevice, surf Surface) (SurfaceCapabilities, error) {
  842. var caps C.VkSurfaceCapabilitiesKHR
  843. err := vkErr(C.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(funcs.vkGetPhysicalDeviceSurfaceCapabilitiesKHR, pd, surf, &caps))
  844. if err != nil {
  845. return SurfaceCapabilities{}, fmt.Errorf("vulkan: vkGetPhysicalDeviceSurfaceCapabilitiesKHR: %w", err)
  846. }
  847. return caps, nil
  848. }
  849. func CreateSwapchain(pd PhysicalDevice, d Device, surf Surface, width, height int, old Swapchain) (Swapchain, []Image, Format, error) {
  850. caps, err := GetPhysicalDeviceSurfaceCapabilities(pd, surf)
  851. if err != nil {
  852. return nilSwapchain, nil, 0, err
  853. }
  854. mode, modeOK, err := choosePresentMode(pd, surf)
  855. if err != nil {
  856. return nilSwapchain, nil, 0, err
  857. }
  858. format, fmtOK, err := chooseFormat(pd, surf)
  859. if err != nil {
  860. return nilSwapchain, nil, 0, err
  861. }
  862. if !modeOK || !fmtOK {
  863. // This shouldn't happen because CreateDeviceAndQueue found at least
  864. // one valid format and present mode.
  865. return nilSwapchain, nil, 0, errors.New("vulkan: no valid format and present mode found")
  866. }
  867. // Find supported alpha composite mode. It doesn't matter which one, because rendering is
  868. // always opaque.
  869. alphaComp := C.VkCompositeAlphaFlagBitsKHR(1)
  870. for caps.supportedCompositeAlpha&C.VkCompositeAlphaFlagsKHR(alphaComp) == 0 {
  871. alphaComp <<= 1
  872. }
  873. trans := C.VkSurfaceTransformFlagBitsKHR(C.VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)
  874. if caps.supportedTransforms&C.VkSurfaceTransformFlagsKHR(trans) == 0 {
  875. return nilSwapchain, nil, 0, errors.New("vulkan: VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR not supported")
  876. }
  877. inf := C.VkSwapchainCreateInfoKHR{
  878. sType: C.VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
  879. surface: surf,
  880. minImageCount: caps.minImageCount,
  881. imageFormat: format.format,
  882. imageColorSpace: format.colorSpace,
  883. imageExtent: C.VkExtent2D{width: C.uint32_t(width), height: C.uint32_t(height)},
  884. imageArrayLayers: 1,
  885. imageUsage: C.VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
  886. imageSharingMode: C.VK_SHARING_MODE_EXCLUSIVE,
  887. preTransform: trans,
  888. presentMode: mode,
  889. compositeAlpha: C.VkCompositeAlphaFlagBitsKHR(alphaComp),
  890. clipped: C.VK_TRUE,
  891. oldSwapchain: old,
  892. }
  893. var swchain Swapchain
  894. if err := vkErr(C.vkCreateSwapchainKHR(funcs.vkCreateSwapchainKHR, d, &inf, nil, &swchain)); err != nil {
  895. return nilSwapchain, nil, 0, fmt.Errorf("vulkan: vkCreateSwapchainKHR: %w", err)
  896. }
  897. var count C.uint32_t
  898. if err := vkErr(C.vkGetSwapchainImagesKHR(funcs.vkGetSwapchainImagesKHR, d, swchain, &count, nil)); err != nil {
  899. DestroySwapchain(d, swchain)
  900. return nilSwapchain, nil, 0, fmt.Errorf("vulkan: vkGetSwapchainImagesKHR: %w", err)
  901. }
  902. if count == 0 {
  903. DestroySwapchain(d, swchain)
  904. return nilSwapchain, nil, 0, errors.New("vulkan: vkGetSwapchainImagesKHR returned no images")
  905. }
  906. imgs := make([]Image, count)
  907. if err := vkErr(C.vkGetSwapchainImagesKHR(funcs.vkGetSwapchainImagesKHR, d, swchain, &count, &imgs[0])); err != nil {
  908. DestroySwapchain(d, swchain)
  909. return nilSwapchain, nil, 0, fmt.Errorf("vulkan: vkGetSwapchainImagesKHR: %w", err)
  910. }
  911. return swchain, imgs, format.format, nil
  912. }
  913. func DestroySwapchain(d Device, swchain Swapchain) {
  914. C.vkDestroySwapchainKHR(funcs.vkDestroySwapchainKHR, d, swchain, nil)
  915. }
  916. func AcquireNextImage(d Device, swchain Swapchain, sem Semaphore, fence Fence) (int, error) {
  917. res := C.vkAcquireNextImageKHR(funcs.vkAcquireNextImageKHR, d, swchain, math.MaxUint64, sem, fence)
  918. if err := vkErr(res.res); err != nil {
  919. return 0, fmt.Errorf("vulkan: vkAcquireNextImageKHR: %w", err)
  920. }
  921. return int(res.uint), nil
  922. }
  923. func PresentQueue(q Queue, swchain Swapchain, sem Semaphore, imgIdx int) error {
  924. cidx := C.uint32_t(imgIdx)
  925. inf := C.VkPresentInfoKHR{
  926. sType: C.VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
  927. swapchainCount: 1,
  928. pSwapchains: &swchain,
  929. pImageIndices: &cidx,
  930. }
  931. if sem != nilSemaphore {
  932. inf.waitSemaphoreCount = 1
  933. inf.pWaitSemaphores = &sem
  934. }
  935. if err := vkErr(C.vkQueuePresentKHR(funcs.vkQueuePresentKHR, q, inf)); err != nil {
  936. return fmt.Errorf("vulkan: vkQueuePresentKHR: %w", err)
  937. }
  938. return nil
  939. }
  940. func CreateImageView(d Device, img Image, format Format) (ImageView, error) {
  941. inf := C.VkImageViewCreateInfo{
  942. sType: C.VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  943. image: img,
  944. viewType: C.VK_IMAGE_VIEW_TYPE_2D,
  945. format: format,
  946. subresourceRange: C.VkImageSubresourceRange{
  947. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  948. levelCount: C.VK_REMAINING_MIP_LEVELS,
  949. layerCount: C.VK_REMAINING_ARRAY_LAYERS,
  950. },
  951. }
  952. var view C.VkImageView
  953. if err := vkErr(C.vkCreateImageView(funcs.vkCreateImageView, d, &inf, nil, &view)); err != nil {
  954. return nilImageView, fmt.Errorf("vulkan: vkCreateImageView: %w", err)
  955. }
  956. return view, nil
  957. }
  958. func DestroyImageView(d Device, view ImageView) {
  959. C.vkDestroyImageView(funcs.vkDestroyImageView, d, view, nil)
  960. }
  961. func CreateRenderPass(d Device, format Format, loadOp AttachmentLoadOp, initialLayout, finalLayout ImageLayout, passDeps []SubpassDependency) (RenderPass, error) {
  962. att := C.VkAttachmentDescription{
  963. format: format,
  964. samples: C.VK_SAMPLE_COUNT_1_BIT,
  965. loadOp: loadOp,
  966. storeOp: C.VK_ATTACHMENT_STORE_OP_STORE,
  967. stencilLoadOp: C.VK_ATTACHMENT_LOAD_OP_DONT_CARE,
  968. stencilStoreOp: C.VK_ATTACHMENT_STORE_OP_DONT_CARE,
  969. initialLayout: initialLayout,
  970. finalLayout: finalLayout,
  971. }
  972. ref := C.VkAttachmentReference{
  973. attachment: 0,
  974. layout: C.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
  975. }
  976. sub := C.VkSubpassDescription{
  977. pipelineBindPoint: C.VK_PIPELINE_BIND_POINT_GRAPHICS,
  978. colorAttachmentCount: 1,
  979. pColorAttachments: &ref,
  980. }
  981. inf := C.VkRenderPassCreateInfo{
  982. sType: C.VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
  983. attachmentCount: 1,
  984. pAttachments: &att,
  985. subpassCount: 1,
  986. }
  987. if n := len(passDeps); n > 0 {
  988. inf.dependencyCount = C.uint32_t(n)
  989. inf.pDependencies = &passDeps[0]
  990. }
  991. var pass RenderPass
  992. if err := vkErr(C.vkCreateRenderPass(funcs.vkCreateRenderPass, d, inf, sub, nil, &pass)); err != nil {
  993. return nilRenderPass, fmt.Errorf("vulkan: vkCreateRenderPass: %w", err)
  994. }
  995. return pass, nil
  996. }
  997. func DestroyRenderPass(d Device, r RenderPass) {
  998. C.vkDestroyRenderPass(funcs.vkDestroyRenderPass, d, r, nil)
  999. }
  1000. func CreateFramebuffer(d Device, rp RenderPass, view ImageView, width, height int) (Framebuffer, error) {
  1001. inf := C.VkFramebufferCreateInfo{
  1002. sType: C.VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
  1003. renderPass: rp,
  1004. attachmentCount: 1,
  1005. pAttachments: &view,
  1006. width: C.uint32_t(width),
  1007. height: C.uint32_t(height),
  1008. layers: 1,
  1009. }
  1010. var fbo Framebuffer
  1011. if err := vkErr(C.vkCreateFramebuffer(funcs.vkCreateFramebuffer, d, inf, nil, &fbo)); err != nil {
  1012. return nilFramebuffer, fmt.Errorf("vulkan: vkCreateFramebuffer: %w", err)
  1013. }
  1014. return fbo, nil
  1015. }
  1016. func DestroyFramebuffer(d Device, f Framebuffer) {
  1017. C.vkDestroyFramebuffer(funcs.vkDestroyFramebuffer, d, f, nil)
  1018. }
  1019. func DeviceWaitIdle(d Device) error {
  1020. if err := vkErr(C.vkDeviceWaitIdle(funcs.vkDeviceWaitIdle, d)); err != nil {
  1021. return fmt.Errorf("vulkan: vkDeviceWaitIdle: %w", err)
  1022. }
  1023. return nil
  1024. }
  1025. func QueueWaitIdle(q Queue) error {
  1026. if err := vkErr(C.vkQueueWaitIdle(funcs.vkQueueWaitIdle, q)); err != nil {
  1027. return fmt.Errorf("vulkan: vkQueueWaitIdle: %w", err)
  1028. }
  1029. return nil
  1030. }
  1031. func CreateSemaphore(d Device) (Semaphore, error) {
  1032. inf := C.VkSemaphoreCreateInfo{
  1033. sType: C.VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
  1034. }
  1035. var sem Semaphore
  1036. err := vkErr(C.vkCreateSemaphore(funcs.vkCreateSemaphore, d, &inf, nil, &sem))
  1037. if err != nil {
  1038. return nilSemaphore, fmt.Errorf("vulkan: vkCreateSemaphore: %w", err)
  1039. }
  1040. return sem, err
  1041. }
  1042. func DestroySemaphore(d Device, sem Semaphore) {
  1043. C.vkDestroySemaphore(funcs.vkDestroySemaphore, d, sem, nil)
  1044. }
  1045. func DestroyDevice(dev Device) {
  1046. C.vkDestroyDevice(funcs.vkDestroyDevice, dev, nil)
  1047. }
  1048. func DestroySurface(inst Instance, s Surface) {
  1049. C.vkDestroySurfaceKHR(funcs.vkDestroySurfaceKHR, inst, s, nil)
  1050. }
  1051. func CreateCommandPool(d Device, queueIndex int) (CommandPool, error) {
  1052. inf := C.VkCommandPoolCreateInfo{
  1053. sType: C.VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
  1054. queueFamilyIndex: C.uint32_t(queueIndex),
  1055. flags: C.VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | C.VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
  1056. }
  1057. var pool CommandPool
  1058. if err := vkErr(C.vkCreateCommandPool(funcs.vkCreateCommandPool, d, &inf, nil, &pool)); err != nil {
  1059. return nilCommandPool, fmt.Errorf("vulkan: vkCreateCommandPool: %w", err)
  1060. }
  1061. return pool, nil
  1062. }
  1063. func DestroyCommandPool(d Device, pool CommandPool) {
  1064. C.vkDestroyCommandPool(funcs.vkDestroyCommandPool, d, pool, nil)
  1065. }
  1066. func AllocateCommandBuffer(d Device, pool CommandPool) (CommandBuffer, error) {
  1067. inf := C.VkCommandBufferAllocateInfo{
  1068. sType: C.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
  1069. commandPool: pool,
  1070. level: C.VK_COMMAND_BUFFER_LEVEL_PRIMARY,
  1071. commandBufferCount: 1,
  1072. }
  1073. var buf CommandBuffer
  1074. if err := vkErr(C.vkAllocateCommandBuffers(funcs.vkAllocateCommandBuffers, d, &inf, &buf)); err != nil {
  1075. return nil, fmt.Errorf("vulkan: vkAllocateCommandBuffers: %w", err)
  1076. }
  1077. return buf, nil
  1078. }
  1079. func FreeCommandBuffers(d Device, pool CommandPool, bufs ...CommandBuffer) {
  1080. if len(bufs) == 0 {
  1081. return
  1082. }
  1083. C.vkFreeCommandBuffers(funcs.vkFreeCommandBuffers, d, pool, C.uint32_t(len(bufs)), &bufs[0])
  1084. }
  1085. func BeginCommandBuffer(buf CommandBuffer) error {
  1086. inf := C.VkCommandBufferBeginInfo{
  1087. sType: C.VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
  1088. flags: C.VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
  1089. }
  1090. if err := vkErr(C.vkBeginCommandBuffer(funcs.vkBeginCommandBuffer, buf, inf)); err != nil {
  1091. return fmt.Errorf("vulkan: vkBeginCommandBuffer: %w", err)
  1092. }
  1093. return nil
  1094. }
  1095. func EndCommandBuffer(buf CommandBuffer) error {
  1096. if err := vkErr(C.vkEndCommandBuffer(funcs.vkEndCommandBuffer, buf)); err != nil {
  1097. return fmt.Errorf("vulkan: vkEndCommandBuffer: %w", err)
  1098. }
  1099. return nil
  1100. }
  1101. func QueueSubmit(q Queue, buf CommandBuffer, waitSems []Semaphore, waitStages []PipelineStageFlags, sigSems []Semaphore, fence Fence) error {
  1102. inf := C.VkSubmitInfo{
  1103. sType: C.VK_STRUCTURE_TYPE_SUBMIT_INFO,
  1104. commandBufferCount: 1,
  1105. pCommandBuffers: &buf,
  1106. }
  1107. if len(waitSems) > 0 {
  1108. if len(waitSems) != len(waitStages) {
  1109. panic("len(waitSems) != len(waitStages)")
  1110. }
  1111. inf.waitSemaphoreCount = C.uint32_t(len(waitSems))
  1112. inf.pWaitSemaphores = &waitSems[0]
  1113. inf.pWaitDstStageMask = &waitStages[0]
  1114. }
  1115. if len(sigSems) > 0 {
  1116. inf.signalSemaphoreCount = C.uint32_t(len(sigSems))
  1117. inf.pSignalSemaphores = &sigSems[0]
  1118. }
  1119. if err := vkErr(C.vkQueueSubmit(funcs.vkQueueSubmit, q, inf, fence)); err != nil {
  1120. return fmt.Errorf("vulkan: vkQueueSubmit: %w", err)
  1121. }
  1122. return nil
  1123. }
  1124. func CmdBeginRenderPass(buf CommandBuffer, rp RenderPass, fbo Framebuffer, width, height int, clearCol [4]float32) {
  1125. cclearCol := [4]C.float{C.float(clearCol[0]), C.float(clearCol[1]), C.float(clearCol[2]), C.float(clearCol[3])}
  1126. inf := C.VkRenderPassBeginInfo{
  1127. sType: C.VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
  1128. renderPass: rp,
  1129. framebuffer: fbo,
  1130. renderArea: C.VkRect2D{extent: C.VkExtent2D{width: C.uint32_t(width), height: C.uint32_t(height)}},
  1131. clearValueCount: 1,
  1132. pClearValues: (*C.VkClearValue)(unsafe.Pointer(&cclearCol)),
  1133. }
  1134. C.vkCmdBeginRenderPass(funcs.vkCmdBeginRenderPass, buf, inf, C.VK_SUBPASS_CONTENTS_INLINE)
  1135. }
  1136. func CmdEndRenderPass(buf CommandBuffer) {
  1137. C.vkCmdEndRenderPass(funcs.vkCmdEndRenderPass, buf)
  1138. }
  1139. func CmdCopyBuffer(cmdBuf CommandBuffer, src, dst Buffer, srcOff, dstOff, size int) {
  1140. C.vkCmdCopyBuffer(funcs.vkCmdCopyBuffer, cmdBuf, src, dst, 1, &C.VkBufferCopy{
  1141. srcOffset: C.VkDeviceSize(srcOff),
  1142. dstOffset: C.VkDeviceSize(dstOff),
  1143. size: C.VkDeviceSize(size),
  1144. })
  1145. }
  1146. func CmdCopyBufferToImage(cmdBuf CommandBuffer, src Buffer, dst Image, layout ImageLayout, copy BufferImageCopy) {
  1147. C.vkCmdCopyBufferToImage(funcs.vkCmdCopyBufferToImage, cmdBuf, src, dst, layout, 1, &copy)
  1148. }
  1149. func CmdPipelineBarrier(cmdBuf CommandBuffer, srcStage, dstStage PipelineStageFlags, flags DependencyFlags, memBarriers []MemoryBarrier, bufBarriers []BufferMemoryBarrier, imgBarriers []ImageMemoryBarrier) {
  1150. var memPtr *MemoryBarrier
  1151. if len(memBarriers) > 0 {
  1152. memPtr = &memBarriers[0]
  1153. }
  1154. var bufPtr *BufferMemoryBarrier
  1155. if len(bufBarriers) > 0 {
  1156. bufPtr = &bufBarriers[0]
  1157. }
  1158. var imgPtr *ImageMemoryBarrier
  1159. if len(imgBarriers) > 0 {
  1160. imgPtr = &imgBarriers[0]
  1161. }
  1162. C.vkCmdPipelineBarrier(funcs.vkCmdPipelineBarrier, cmdBuf, srcStage, dstStage, flags,
  1163. C.uint32_t(len(memBarriers)), memPtr,
  1164. C.uint32_t(len(bufBarriers)), bufPtr,
  1165. C.uint32_t(len(imgBarriers)), imgPtr)
  1166. }
  1167. func CmdPushConstants(cmdBuf CommandBuffer, layout PipelineLayout, stages ShaderStageFlags, offset int, data []byte) {
  1168. if len(data) == 0 {
  1169. return
  1170. }
  1171. C.vkCmdPushConstants(funcs.vkCmdPushConstants, cmdBuf, layout, stages, C.uint32_t(offset), C.uint32_t(len(data)), unsafe.Pointer(&data[0]))
  1172. }
  1173. func CmdBindPipeline(cmdBuf CommandBuffer, bindPoint PipelineBindPoint, pipe Pipeline) {
  1174. C.vkCmdBindPipeline(funcs.vkCmdBindPipeline, cmdBuf, bindPoint, pipe)
  1175. }
  1176. func CmdBindVertexBuffers(cmdBuf CommandBuffer, first int, buffers []Buffer, sizes []DeviceSize) {
  1177. if len(buffers) == 0 {
  1178. return
  1179. }
  1180. C.vkCmdBindVertexBuffers(funcs.vkCmdBindVertexBuffers, cmdBuf, C.uint32_t(first), C.uint32_t(len(buffers)), &buffers[0], &sizes[0])
  1181. }
  1182. func CmdSetViewport(cmdBuf CommandBuffer, first int, viewports ...Viewport) {
  1183. if len(viewports) == 0 {
  1184. return
  1185. }
  1186. C.vkCmdSetViewport(funcs.vkCmdSetViewport, cmdBuf, C.uint32_t(first), C.uint32_t(len(viewports)), &viewports[0])
  1187. }
  1188. func CmdBindIndexBuffer(cmdBuf CommandBuffer, buffer Buffer, offset int, typ IndexType) {
  1189. C.vkCmdBindIndexBuffer(funcs.vkCmdBindIndexBuffer, cmdBuf, buffer, C.VkDeviceSize(offset), typ)
  1190. }
  1191. func CmdDraw(cmdBuf CommandBuffer, vertCount, instCount, firstVert, firstInst int) {
  1192. C.vkCmdDraw(funcs.vkCmdDraw, cmdBuf, C.uint32_t(vertCount), C.uint32_t(instCount), C.uint32_t(firstVert), C.uint32_t(firstInst))
  1193. }
  1194. func CmdDrawIndexed(cmdBuf CommandBuffer, idxCount, instCount, firstIdx, vertOff, firstInst int) {
  1195. C.vkCmdDrawIndexed(funcs.vkCmdDrawIndexed, cmdBuf, C.uint32_t(idxCount), C.uint32_t(instCount), C.uint32_t(firstIdx), C.int32_t(vertOff), C.uint32_t(firstInst))
  1196. }
  1197. func GetPhysicalDeviceFormatProperties(physDev PhysicalDevice, format Format) FormatFeatureFlags {
  1198. var props C.VkFormatProperties
  1199. C.vkGetPhysicalDeviceFormatProperties(funcs.vkGetPhysicalDeviceFormatProperties, physDev, format, &props)
  1200. return FormatFeatureFlags(props.optimalTilingFeatures)
  1201. }
  1202. func CmdBindDescriptorSets(cmdBuf CommandBuffer, point PipelineBindPoint, layout PipelineLayout, firstSet int, sets []DescriptorSet) {
  1203. C.vkCmdBindDescriptorSets(funcs.vkCmdBindDescriptorSets, cmdBuf, point, layout, C.uint32_t(firstSet), C.uint32_t(len(sets)), &sets[0], 0, nil)
  1204. }
  1205. func CmdBlitImage(cmdBuf CommandBuffer, src Image, srcLayout ImageLayout, dst Image, dstLayout ImageLayout, regions []ImageBlit, filter Filter) {
  1206. if len(regions) == 0 {
  1207. return
  1208. }
  1209. C.vkCmdBlitImage(funcs.vkCmdBlitImage, cmdBuf, src, srcLayout, dst, dstLayout, C.uint32_t(len(regions)), &regions[0], filter)
  1210. }
  1211. func CmdCopyImage(cmdBuf CommandBuffer, src Image, srcLayout ImageLayout, dst Image, dstLayout ImageLayout, regions []ImageCopy) {
  1212. if len(regions) == 0 {
  1213. return
  1214. }
  1215. C.vkCmdCopyImage(funcs.vkCmdCopyImage, cmdBuf, src, srcLayout, dst, dstLayout, C.uint32_t(len(regions)), &regions[0])
  1216. }
  1217. func CmdCopyImageToBuffer(cmdBuf CommandBuffer, src Image, srcLayout ImageLayout, dst Buffer, regions []BufferImageCopy) {
  1218. if len(regions) == 0 {
  1219. return
  1220. }
  1221. C.vkCmdCopyImageToBuffer(funcs.vkCmdCopyImageToBuffer, cmdBuf, src, srcLayout, dst, C.uint32_t(len(regions)), &regions[0])
  1222. }
  1223. func CmdDispatch(cmdBuf CommandBuffer, x, y, z int) {
  1224. C.vkCmdDispatch(funcs.vkCmdDispatch, cmdBuf, C.uint32_t(x), C.uint32_t(y), C.uint32_t(z))
  1225. }
  1226. func CreateImage(pd PhysicalDevice, d Device, format Format, width, height, mipmaps int, usage ImageUsageFlags) (Image, DeviceMemory, error) {
  1227. inf := C.VkImageCreateInfo{
  1228. sType: C.VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
  1229. imageType: C.VK_IMAGE_TYPE_2D,
  1230. format: format,
  1231. extent: C.VkExtent3D{
  1232. width: C.uint32_t(width),
  1233. height: C.uint32_t(height),
  1234. depth: 1,
  1235. },
  1236. mipLevels: C.uint32_t(mipmaps),
  1237. arrayLayers: 1,
  1238. samples: C.VK_SAMPLE_COUNT_1_BIT,
  1239. tiling: C.VK_IMAGE_TILING_OPTIMAL,
  1240. usage: usage,
  1241. initialLayout: C.VK_IMAGE_LAYOUT_UNDEFINED,
  1242. }
  1243. var img C.VkImage
  1244. if err := vkErr(C.vkCreateImage(funcs.vkCreateImage, d, &inf, nil, &img)); err != nil {
  1245. return nilImage, nilDeviceMemory, fmt.Errorf("vulkan: vkCreateImage: %w", err)
  1246. }
  1247. var memReqs C.VkMemoryRequirements
  1248. C.vkGetImageMemoryRequirements(funcs.vkGetImageMemoryRequirements, d, img, &memReqs)
  1249. memIdx, found := findMemoryTypeIndex(pd, memReqs.memoryTypeBits, C.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
  1250. if !found {
  1251. DestroyImage(d, img)
  1252. return nilImage, nilDeviceMemory, errors.New("vulkan: no memory type suitable for images found")
  1253. }
  1254. memInf := C.VkMemoryAllocateInfo{
  1255. sType: C.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
  1256. allocationSize: memReqs.size,
  1257. memoryTypeIndex: C.uint32_t(memIdx),
  1258. }
  1259. var imgMem C.VkDeviceMemory
  1260. if err := vkErr(C.vkAllocateMemory(funcs.vkAllocateMemory, d, &memInf, nil, &imgMem)); err != nil {
  1261. DestroyImage(d, img)
  1262. return nilImage, nilDeviceMemory, fmt.Errorf("vulkan: vkAllocateMemory: %w", err)
  1263. }
  1264. if err := vkErr(C.vkBindImageMemory(funcs.vkBindImageMemory, d, img, imgMem, 0)); err != nil {
  1265. FreeMemory(d, imgMem)
  1266. DestroyImage(d, img)
  1267. return nilImage, nilDeviceMemory, fmt.Errorf("vulkan: vkBindImageMemory: %w", err)
  1268. }
  1269. return img, imgMem, nil
  1270. }
  1271. func DestroyImage(d Device, img Image) {
  1272. C.vkDestroyImage(funcs.vkDestroyImage, d, img, nil)
  1273. }
  1274. func FreeMemory(d Device, mem DeviceMemory) {
  1275. C.vkFreeMemory(funcs.vkFreeMemory, d, mem, nil)
  1276. }
  1277. func CreateSampler(d Device, minFilter, magFilter Filter, mipmapMode SamplerMipmapMode) (Sampler, error) {
  1278. inf := C.VkSamplerCreateInfo{
  1279. sType: C.VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
  1280. minFilter: minFilter,
  1281. magFilter: magFilter,
  1282. mipmapMode: mipmapMode,
  1283. maxLod: C.VK_LOD_CLAMP_NONE,
  1284. addressModeU: C.VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
  1285. addressModeV: C.VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
  1286. }
  1287. var s C.VkSampler
  1288. if err := vkErr(C.vkCreateSampler(funcs.vkCreateSampler, d, &inf, nil, &s)); err != nil {
  1289. return nilSampler, fmt.Errorf("vulkan: vkCreateSampler: %w", err)
  1290. }
  1291. return s, nil
  1292. }
  1293. func DestroySampler(d Device, sampler Sampler) {
  1294. C.vkDestroySampler(funcs.vkDestroySampler, d, sampler, nil)
  1295. }
  1296. func CreateBuffer(pd PhysicalDevice, d Device, size int, usage BufferUsageFlags, props MemoryPropertyFlags) (Buffer, DeviceMemory, error) {
  1297. inf := C.VkBufferCreateInfo{
  1298. sType: C.VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
  1299. size: C.VkDeviceSize(size),
  1300. usage: usage,
  1301. }
  1302. var buf C.VkBuffer
  1303. if err := vkErr(C.vkCreateBuffer(funcs.vkCreateBuffer, d, &inf, nil, &buf)); err != nil {
  1304. return nilBuffer, nilDeviceMemory, fmt.Errorf("vulkan: vkCreateBuffer: %w", err)
  1305. }
  1306. var memReqs C.VkMemoryRequirements
  1307. C.vkGetBufferMemoryRequirements(funcs.vkGetBufferMemoryRequirements, d, buf, &memReqs)
  1308. memIdx, found := findMemoryTypeIndex(pd, memReqs.memoryTypeBits, props)
  1309. if !found {
  1310. DestroyBuffer(d, buf)
  1311. return nilBuffer, nilDeviceMemory, errors.New("vulkan: no memory suitable for buffers found")
  1312. }
  1313. memInf := C.VkMemoryAllocateInfo{
  1314. sType: C.VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
  1315. allocationSize: memReqs.size,
  1316. memoryTypeIndex: C.uint32_t(memIdx),
  1317. }
  1318. var mem C.VkDeviceMemory
  1319. if err := vkErr(C.vkAllocateMemory(funcs.vkAllocateMemory, d, &memInf, nil, &mem)); err != nil {
  1320. DestroyBuffer(d, buf)
  1321. return nilBuffer, nilDeviceMemory, fmt.Errorf("vulkan: vkAllocateMemory: %w", err)
  1322. }
  1323. if err := vkErr(C.vkBindBufferMemory(funcs.vkBindBufferMemory, d, buf, mem, 0)); err != nil {
  1324. FreeMemory(d, mem)
  1325. DestroyBuffer(d, buf)
  1326. return nilBuffer, nilDeviceMemory, fmt.Errorf("vulkan: vkBindBufferMemory: %w", err)
  1327. }
  1328. return buf, mem, nil
  1329. }
  1330. func DestroyBuffer(d Device, buf Buffer) {
  1331. C.vkDestroyBuffer(funcs.vkDestroyBuffer, d, buf, nil)
  1332. }
  1333. func CreateShaderModule(d Device, spirv string) (ShaderModule, error) {
  1334. ptr := unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&spirv)).Data)
  1335. inf := C.VkShaderModuleCreateInfo{
  1336. sType: C.VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
  1337. codeSize: C.size_t(len(spirv)),
  1338. pCode: (*C.uint32_t)(ptr),
  1339. }
  1340. var mod C.VkShaderModule
  1341. if err := vkErr(C.vkCreateShaderModule(funcs.vkCreateShaderModule, d, inf, nil, &mod)); err != nil {
  1342. return nilShaderModule, fmt.Errorf("vulkan: vkCreateShaderModule: %w", err)
  1343. }
  1344. return mod, nil
  1345. }
  1346. func DestroyShaderModule(d Device, mod ShaderModule) {
  1347. C.vkDestroyShaderModule(funcs.vkDestroyShaderModule, d, mod, nil)
  1348. }
  1349. func CreateGraphicsPipeline(d Device, pass RenderPass, vmod, fmod ShaderModule, blend bool, srcFactor, dstFactor BlendFactor, topology PrimitiveTopology, bindings []VertexInputBindingDescription, attrs []VertexInputAttributeDescription, layout PipelineLayout) (Pipeline, error) {
  1350. main := C.CString("main")
  1351. defer C.free(unsafe.Pointer(main))
  1352. stages := []C.VkPipelineShaderStageCreateInfo{
  1353. {
  1354. sType: C.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  1355. stage: C.VK_SHADER_STAGE_VERTEX_BIT,
  1356. module: vmod,
  1357. pName: main,
  1358. },
  1359. {
  1360. sType: C.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  1361. stage: C.VK_SHADER_STAGE_FRAGMENT_BIT,
  1362. module: fmod,
  1363. pName: main,
  1364. },
  1365. }
  1366. dynStates := []C.VkDynamicState{C.VK_DYNAMIC_STATE_VIEWPORT}
  1367. dynInf := C.VkPipelineDynamicStateCreateInfo{
  1368. sType: C.VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
  1369. dynamicStateCount: C.uint32_t(len(dynStates)),
  1370. pDynamicStates: &dynStates[0],
  1371. }
  1372. const maxDim = 0x7fffffff
  1373. scissors := []C.VkRect2D{{extent: C.VkExtent2D{width: maxDim, height: maxDim}}}
  1374. viewportInf := C.VkPipelineViewportStateCreateInfo{
  1375. sType: C.VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
  1376. viewportCount: 1,
  1377. scissorCount: C.uint32_t(len(scissors)),
  1378. pScissors: &scissors[0],
  1379. }
  1380. enable := C.VkBool32(0)
  1381. if blend {
  1382. enable = 1
  1383. }
  1384. attBlendInf := C.VkPipelineColorBlendAttachmentState{
  1385. blendEnable: enable,
  1386. srcColorBlendFactor: srcFactor,
  1387. srcAlphaBlendFactor: srcFactor,
  1388. dstColorBlendFactor: dstFactor,
  1389. dstAlphaBlendFactor: dstFactor,
  1390. colorBlendOp: C.VK_BLEND_OP_ADD,
  1391. alphaBlendOp: C.VK_BLEND_OP_ADD,
  1392. colorWriteMask: C.VK_COLOR_COMPONENT_R_BIT | C.VK_COLOR_COMPONENT_G_BIT | C.VK_COLOR_COMPONENT_B_BIT | C.VK_COLOR_COMPONENT_A_BIT,
  1393. }
  1394. blendInf := C.VkPipelineColorBlendStateCreateInfo{
  1395. sType: C.VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
  1396. attachmentCount: 1,
  1397. pAttachments: &attBlendInf,
  1398. }
  1399. var vkBinds []C.VkVertexInputBindingDescription
  1400. var vkAttrs []C.VkVertexInputAttributeDescription
  1401. for _, b := range bindings {
  1402. vkBinds = append(vkBinds, C.VkVertexInputBindingDescription{
  1403. binding: C.uint32_t(b.Binding),
  1404. stride: C.uint32_t(b.Stride),
  1405. })
  1406. }
  1407. for _, a := range attrs {
  1408. vkAttrs = append(vkAttrs, C.VkVertexInputAttributeDescription{
  1409. location: C.uint32_t(a.Location),
  1410. binding: C.uint32_t(a.Binding),
  1411. format: a.Format,
  1412. offset: C.uint32_t(a.Offset),
  1413. })
  1414. }
  1415. vertexInf := C.VkPipelineVertexInputStateCreateInfo{
  1416. sType: C.VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
  1417. }
  1418. if n := len(vkBinds); n > 0 {
  1419. vertexInf.vertexBindingDescriptionCount = C.uint32_t(n)
  1420. vertexInf.pVertexBindingDescriptions = &vkBinds[0]
  1421. }
  1422. if n := len(vkAttrs); n > 0 {
  1423. vertexInf.vertexAttributeDescriptionCount = C.uint32_t(n)
  1424. vertexInf.pVertexAttributeDescriptions = &vkAttrs[0]
  1425. }
  1426. inf := C.VkGraphicsPipelineCreateInfo{
  1427. sType: C.VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
  1428. stageCount: C.uint32_t(len(stages)),
  1429. pStages: &stages[0],
  1430. renderPass: pass,
  1431. layout: layout,
  1432. pRasterizationState: &C.VkPipelineRasterizationStateCreateInfo{
  1433. sType: C.VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
  1434. lineWidth: 1.0,
  1435. },
  1436. pMultisampleState: &C.VkPipelineMultisampleStateCreateInfo{
  1437. sType: C.VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
  1438. rasterizationSamples: C.VK_SAMPLE_COUNT_1_BIT,
  1439. },
  1440. pInputAssemblyState: &C.VkPipelineInputAssemblyStateCreateInfo{
  1441. sType: C.VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
  1442. topology: topology,
  1443. },
  1444. }
  1445. var pipe C.VkPipeline
  1446. if err := vkErr(C.vkCreateGraphicsPipelines(funcs.vkCreateGraphicsPipelines, d, nilPipelineCache, inf, dynInf, blendInf, vertexInf, viewportInf, nil, &pipe)); err != nil {
  1447. return nilPipeline, fmt.Errorf("vulkan: vkCreateGraphicsPipelines: %w", err)
  1448. }
  1449. return pipe, nil
  1450. }
  1451. func DestroyPipeline(d Device, p Pipeline) {
  1452. C.vkDestroyPipeline(funcs.vkDestroyPipeline, d, p, nil)
  1453. }
  1454. func CreatePipelineLayout(d Device, pushRanges []PushConstantRange, sets []DescriptorSetLayout) (PipelineLayout, error) {
  1455. inf := C.VkPipelineLayoutCreateInfo{
  1456. sType: C.VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
  1457. }
  1458. if n := len(sets); n > 0 {
  1459. inf.setLayoutCount = C.uint32_t(n)
  1460. inf.pSetLayouts = &sets[0]
  1461. }
  1462. if n := len(pushRanges); n > 0 {
  1463. inf.pushConstantRangeCount = C.uint32_t(n)
  1464. inf.pPushConstantRanges = &pushRanges[0]
  1465. }
  1466. var l C.VkPipelineLayout
  1467. if err := vkErr(C.vkCreatePipelineLayout(funcs.vkCreatePipelineLayout, d, inf, nil, &l)); err != nil {
  1468. return nilPipelineLayout, fmt.Errorf("vulkan: vkCreatePipelineLayout: %w", err)
  1469. }
  1470. return l, nil
  1471. }
  1472. func DestroyPipelineLayout(d Device, l PipelineLayout) {
  1473. C.vkDestroyPipelineLayout(funcs.vkDestroyPipelineLayout, d, l, nil)
  1474. }
  1475. func CreateDescriptorSetLayout(d Device, bindings []DescriptorSetLayoutBinding) (DescriptorSetLayout, error) {
  1476. var vkbinds []C.VkDescriptorSetLayoutBinding
  1477. for _, b := range bindings {
  1478. vkbinds = append(vkbinds, C.VkDescriptorSetLayoutBinding{
  1479. binding: C.uint32_t(b.Binding),
  1480. descriptorType: b.DescriptorType,
  1481. descriptorCount: 1,
  1482. stageFlags: b.StageFlags,
  1483. })
  1484. }
  1485. inf := C.VkDescriptorSetLayoutCreateInfo{
  1486. sType: C.VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
  1487. }
  1488. if n := len(vkbinds); n > 0 {
  1489. inf.bindingCount = C.uint32_t(len(vkbinds))
  1490. inf.pBindings = &vkbinds[0]
  1491. }
  1492. var l C.VkDescriptorSetLayout
  1493. if err := vkErr(C.vkCreateDescriptorSetLayout(funcs.vkCreateDescriptorSetLayout, d, inf, nil, &l)); err != nil {
  1494. return nilDescriptorSetLayout, fmt.Errorf("vulkan: vkCreateDescriptorSetLayout: %w", err)
  1495. }
  1496. return l, nil
  1497. }
  1498. func DestroyDescriptorSetLayout(d Device, l DescriptorSetLayout) {
  1499. C.vkDestroyDescriptorSetLayout(funcs.vkDestroyDescriptorSetLayout, d, l, nil)
  1500. }
  1501. func MapMemory(d Device, mem DeviceMemory, offset, size int) ([]byte, error) {
  1502. var ptr unsafe.Pointer
  1503. if err := vkErr(C.vkMapMemory(funcs.vkMapMemory, d, mem, C.VkDeviceSize(offset), C.VkDeviceSize(size), 0, &ptr)); err != nil {
  1504. return nil, fmt.Errorf("vulkan: vkMapMemory: %w", err)
  1505. }
  1506. return ((*[1 << 30]byte)(ptr))[:size:size], nil
  1507. }
  1508. func UnmapMemory(d Device, mem DeviceMemory) {
  1509. C.vkUnmapMemory(funcs.vkUnmapMemory, d, mem)
  1510. }
  1511. func ResetCommandBuffer(buf CommandBuffer) error {
  1512. if err := vkErr(C.vkResetCommandBuffer(funcs.vkResetCommandBuffer, buf, 0)); err != nil {
  1513. return fmt.Errorf("vulkan: vkResetCommandBuffer. %w", err)
  1514. }
  1515. return nil
  1516. }
  1517. func CreateDescriptorPool(d Device, maxSets int, sizes []DescriptorPoolSize) (DescriptorPool, error) {
  1518. inf := C.VkDescriptorPoolCreateInfo{
  1519. sType: C.VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
  1520. maxSets: C.uint32_t(maxSets),
  1521. poolSizeCount: C.uint32_t(len(sizes)),
  1522. pPoolSizes: &sizes[0],
  1523. }
  1524. var pool C.VkDescriptorPool
  1525. if err := vkErr(C.vkCreateDescriptorPool(funcs.vkCreateDescriptorPool, d, inf, nil, &pool)); err != nil {
  1526. return nilDescriptorPool, fmt.Errorf("vulkan: vkCreateDescriptorPool: %w", err)
  1527. }
  1528. return pool, nil
  1529. }
  1530. func DestroyDescriptorPool(d Device, pool DescriptorPool) {
  1531. C.vkDestroyDescriptorPool(funcs.vkDestroyDescriptorPool, d, pool, nil)
  1532. }
  1533. func ResetDescriptorPool(d Device, pool DescriptorPool) error {
  1534. if err := vkErr(C.vkResetDescriptorPool(funcs.vkResetDescriptorPool, d, pool, 0)); err != nil {
  1535. return fmt.Errorf("vulkan: vkResetDescriptorPool: %w", err)
  1536. }
  1537. return nil
  1538. }
  1539. func UpdateDescriptorSet(d Device, write WriteDescriptorSet) {
  1540. C.vkUpdateDescriptorSets(funcs.vkUpdateDescriptorSets, d, write, 0, nil)
  1541. }
  1542. func AllocateDescriptorSets(d Device, pool DescriptorPool, layout DescriptorSetLayout, count int) ([]DescriptorSet, error) {
  1543. layouts := make([]DescriptorSetLayout, count)
  1544. for i := range layouts {
  1545. layouts[i] = layout
  1546. }
  1547. inf := C.VkDescriptorSetAllocateInfo{
  1548. sType: C.VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
  1549. descriptorPool: pool,
  1550. descriptorSetCount: C.uint32_t(count),
  1551. pSetLayouts: &layouts[0],
  1552. }
  1553. sets := make([]DescriptorSet, count)
  1554. if err := vkErr(C.vkAllocateDescriptorSets(funcs.vkAllocateDescriptorSets, d, inf, &sets[0])); err != nil {
  1555. return nil, fmt.Errorf("vulkan: vkAllocateDescriptorSets: %w", err)
  1556. }
  1557. return sets, nil
  1558. }
  1559. func CreateComputePipeline(d Device, mod ShaderModule, layout PipelineLayout) (Pipeline, error) {
  1560. main := C.CString("main")
  1561. defer C.free(unsafe.Pointer(main))
  1562. inf := C.VkComputePipelineCreateInfo{
  1563. sType: C.VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
  1564. stage: C.VkPipelineShaderStageCreateInfo{
  1565. sType: C.VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  1566. stage: C.VK_SHADER_STAGE_COMPUTE_BIT,
  1567. module: mod,
  1568. pName: main,
  1569. },
  1570. layout: layout,
  1571. }
  1572. var pipe C.VkPipeline
  1573. if err := vkErr(C.vkCreateComputePipelines(funcs.vkCreateComputePipelines, d, nilPipelineCache, 1, &inf, nil, &pipe)); err != nil {
  1574. return nilPipeline, fmt.Errorf("vulkan: vkCreateComputePipelines: %w", err)
  1575. }
  1576. return pipe, nil
  1577. }
  1578. func CreateFence(d Device, flags int) (Fence, error) {
  1579. inf := C.VkFenceCreateInfo{
  1580. sType: C.VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
  1581. flags: C.VkFenceCreateFlags(flags),
  1582. }
  1583. var f C.VkFence
  1584. if err := vkErr(C.vkCreateFence(funcs.vkCreateFence, d, &inf, nil, &f)); err != nil {
  1585. return nilFence, fmt.Errorf("vulkan: vkCreateFence: %w", err)
  1586. }
  1587. return f, nil
  1588. }
  1589. func DestroyFence(d Device, f Fence) {
  1590. C.vkDestroyFence(funcs.vkDestroyFence, d, f, nil)
  1591. }
  1592. func WaitForFences(d Device, fences ...Fence) error {
  1593. if len(fences) == 0 {
  1594. return nil
  1595. }
  1596. err := vkErr(C.vkWaitForFences(funcs.vkWaitForFences, d, C.uint32_t(len(fences)), &fences[0], C.VK_TRUE, 0xffffffffffffffff))
  1597. if err != nil {
  1598. return fmt.Errorf("vulkan: vkWaitForFences: %w", err)
  1599. }
  1600. return nil
  1601. }
  1602. func ResetFences(d Device, fences ...Fence) error {
  1603. if len(fences) == 0 {
  1604. return nil
  1605. }
  1606. err := vkErr(C.vkResetFences(funcs.vkResetFences, d, C.uint32_t(len(fences)), &fences[0]))
  1607. if err != nil {
  1608. return fmt.Errorf("vulkan: vkResetFences: %w", err)
  1609. }
  1610. return nil
  1611. }
  1612. func BuildSubpassDependency(srcStage, dstStage PipelineStageFlags, srcMask, dstMask AccessFlags, flags DependencyFlags) SubpassDependency {
  1613. return C.VkSubpassDependency{
  1614. srcSubpass: C.VK_SUBPASS_EXTERNAL,
  1615. srcStageMask: srcStage,
  1616. srcAccessMask: srcMask,
  1617. dstSubpass: 0,
  1618. dstStageMask: dstStage,
  1619. dstAccessMask: dstMask,
  1620. dependencyFlags: flags,
  1621. }
  1622. }
  1623. func BuildPushConstantRange(stages ShaderStageFlags, offset, size int) PushConstantRange {
  1624. return C.VkPushConstantRange{
  1625. stageFlags: stages,
  1626. offset: C.uint32_t(offset),
  1627. size: C.uint32_t(size),
  1628. }
  1629. }
  1630. func BuildDescriptorPoolSize(typ DescriptorType, count int) DescriptorPoolSize {
  1631. return C.VkDescriptorPoolSize{
  1632. _type: typ,
  1633. descriptorCount: C.uint32_t(count),
  1634. }
  1635. }
  1636. func BuildWriteDescriptorSetImage(set DescriptorSet, binding int, typ DescriptorType, sampler Sampler, view ImageView, layout ImageLayout) WriteDescriptorSet {
  1637. return C.VkWriteDescriptorSet{
  1638. sType: C.VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
  1639. dstSet: set,
  1640. dstBinding: C.uint32_t(binding),
  1641. descriptorCount: 1,
  1642. descriptorType: typ,
  1643. pImageInfo: &C.VkDescriptorImageInfo{
  1644. sampler: sampler,
  1645. imageView: view,
  1646. imageLayout: layout,
  1647. },
  1648. }
  1649. }
  1650. func BuildWriteDescriptorSetBuffer(set DescriptorSet, binding int, typ DescriptorType, buf Buffer) WriteDescriptorSet {
  1651. return C.VkWriteDescriptorSet{
  1652. sType: C.VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
  1653. dstSet: set,
  1654. dstBinding: C.uint32_t(binding),
  1655. descriptorCount: 1,
  1656. descriptorType: typ,
  1657. pBufferInfo: &C.VkDescriptorBufferInfo{
  1658. buffer: buf,
  1659. _range: C.VK_WHOLE_SIZE,
  1660. },
  1661. }
  1662. }
  1663. func PushConstantRangeStageFlags(r PushConstantRange) ShaderStageFlags {
  1664. return r.stageFlags
  1665. }
  1666. func PushConstantRangeOffset(r PushConstantRange) int {
  1667. return int(r.offset)
  1668. }
  1669. func PushConstantRangeSize(r PushConstantRange) int {
  1670. return int(r.size)
  1671. }
  1672. func QueueFamilyPropertiesFlags(p QueueFamilyProperties) QueueFlags {
  1673. return p.queueFlags
  1674. }
  1675. func SurfaceCapabilitiesMinExtent(c SurfaceCapabilities) image.Point {
  1676. return image.Pt(int(c.minImageExtent.width), int(c.minImageExtent.height))
  1677. }
  1678. func SurfaceCapabilitiesMaxExtent(c SurfaceCapabilities) image.Point {
  1679. return image.Pt(int(c.maxImageExtent.width), int(c.maxImageExtent.height))
  1680. }
  1681. func BuildViewport(x, y, width, height float32) Viewport {
  1682. return C.VkViewport{
  1683. x: C.float(x),
  1684. y: C.float(y),
  1685. width: C.float(width),
  1686. height: C.float(height),
  1687. maxDepth: 1.0,
  1688. }
  1689. }
  1690. func BuildImageMemoryBarrier(img Image, srcMask, dstMask AccessFlags, oldLayout, newLayout ImageLayout, baseMip, numMips int) ImageMemoryBarrier {
  1691. return C.VkImageMemoryBarrier{
  1692. sType: C.VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
  1693. srcAccessMask: srcMask,
  1694. dstAccessMask: dstMask,
  1695. oldLayout: oldLayout,
  1696. newLayout: newLayout,
  1697. image: img,
  1698. subresourceRange: C.VkImageSubresourceRange{
  1699. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  1700. baseMipLevel: C.uint32_t(baseMip),
  1701. levelCount: C.uint32_t(numMips),
  1702. layerCount: C.VK_REMAINING_ARRAY_LAYERS,
  1703. },
  1704. }
  1705. }
  1706. func BuildBufferMemoryBarrier(buf Buffer, srcMask, dstMask AccessFlags) BufferMemoryBarrier {
  1707. return C.VkBufferMemoryBarrier{
  1708. sType: C.VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  1709. srcAccessMask: srcMask,
  1710. dstAccessMask: dstMask,
  1711. buffer: buf,
  1712. size: C.VK_WHOLE_SIZE,
  1713. }
  1714. }
  1715. func BuildMemoryBarrier(srcMask, dstMask AccessFlags) MemoryBarrier {
  1716. return C.VkMemoryBarrier{
  1717. sType: C.VK_STRUCTURE_TYPE_MEMORY_BARRIER,
  1718. srcAccessMask: srcMask,
  1719. dstAccessMask: dstMask,
  1720. }
  1721. }
  1722. func BuildBufferImageCopy(bufOff, bufStride, x, y, width, height int) BufferImageCopy {
  1723. return C.VkBufferImageCopy{
  1724. bufferOffset: C.VkDeviceSize(bufOff),
  1725. bufferRowLength: C.uint32_t(bufStride),
  1726. imageSubresource: C.VkImageSubresourceLayers{
  1727. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  1728. layerCount: 1,
  1729. },
  1730. imageOffset: C.VkOffset3D{
  1731. x: C.int32_t(x), y: C.int32_t(y), z: 0,
  1732. },
  1733. imageExtent: C.VkExtent3D{
  1734. width: C.uint32_t(width), height: C.uint32_t(height), depth: 1,
  1735. },
  1736. }
  1737. }
  1738. func BuildImageCopy(srcX, srcY, dstX, dstY, width, height int) ImageCopy {
  1739. return C.VkImageCopy{
  1740. srcSubresource: C.VkImageSubresourceLayers{
  1741. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  1742. layerCount: 1,
  1743. },
  1744. srcOffset: C.VkOffset3D{
  1745. x: C.int32_t(srcX),
  1746. y: C.int32_t(srcY),
  1747. },
  1748. dstSubresource: C.VkImageSubresourceLayers{
  1749. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  1750. layerCount: 1,
  1751. },
  1752. dstOffset: C.VkOffset3D{
  1753. x: C.int32_t(dstX),
  1754. y: C.int32_t(dstY),
  1755. },
  1756. extent: C.VkExtent3D{
  1757. width: C.uint32_t(width),
  1758. height: C.uint32_t(height),
  1759. depth: 1,
  1760. },
  1761. }
  1762. }
  1763. func BuildImageBlit(srcX, srcY, dstX, dstY, srcWidth, srcHeight, dstWidth, dstHeight, srcMip, dstMip int) ImageBlit {
  1764. return C.VkImageBlit{
  1765. srcOffsets: [2]C.VkOffset3D{
  1766. {C.int32_t(srcX), C.int32_t(srcY), 0},
  1767. {C.int32_t(srcWidth), C.int32_t(srcHeight), 1},
  1768. },
  1769. srcSubresource: C.VkImageSubresourceLayers{
  1770. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  1771. layerCount: 1,
  1772. mipLevel: C.uint32_t(srcMip),
  1773. },
  1774. dstOffsets: [2]C.VkOffset3D{
  1775. {C.int32_t(dstX), C.int32_t(dstY), 0},
  1776. {C.int32_t(dstWidth), C.int32_t(dstHeight), 1},
  1777. },
  1778. dstSubresource: C.VkImageSubresourceLayers{
  1779. aspectMask: C.VK_IMAGE_ASPECT_COLOR_BIT,
  1780. layerCount: 1,
  1781. mipLevel: C.uint32_t(dstMip),
  1782. },
  1783. }
  1784. }
  1785. func findMemoryTypeIndex(pd C.VkPhysicalDevice, constraints C.uint32_t, wantProps C.VkMemoryPropertyFlags) (int, bool) {
  1786. var memProps C.VkPhysicalDeviceMemoryProperties
  1787. C.vkGetPhysicalDeviceMemoryProperties(funcs.vkGetPhysicalDeviceMemoryProperties, pd, &memProps)
  1788. for i := 0; i < int(memProps.memoryTypeCount); i++ {
  1789. if (constraints & (1 << i)) == 0 {
  1790. continue
  1791. }
  1792. if (memProps.memoryTypes[i].propertyFlags & wantProps) != wantProps {
  1793. continue
  1794. }
  1795. return i, true
  1796. }
  1797. return 0, false
  1798. }
  1799. func choosePresentMode(pd C.VkPhysicalDevice, surf Surface) (C.VkPresentModeKHR, bool, error) {
  1800. var count C.uint32_t
  1801. err := vkErr(C.vkGetPhysicalDeviceSurfacePresentModesKHR(funcs.vkGetPhysicalDeviceSurfacePresentModesKHR, pd, surf, &count, nil))
  1802. if err != nil {
  1803. return 0, false, fmt.Errorf("vulkan: vkGetPhysicalDeviceSurfacePresentModesKHR: %w", err)
  1804. }
  1805. if count == 0 {
  1806. return 0, false, nil
  1807. }
  1808. modes := make([]C.VkPresentModeKHR, count)
  1809. err = vkErr(C.vkGetPhysicalDeviceSurfacePresentModesKHR(funcs.vkGetPhysicalDeviceSurfacePresentModesKHR, pd, surf, &count, &modes[0]))
  1810. if err != nil {
  1811. return 0, false, fmt.Errorf("vulkan: kGetPhysicalDeviceSurfacePresentModesKHR: %w", err)
  1812. }
  1813. for _, m := range modes {
  1814. if m == C.VK_PRESENT_MODE_MAILBOX_KHR || m == C.VK_PRESENT_MODE_FIFO_KHR {
  1815. return m, true, nil
  1816. }
  1817. }
  1818. return 0, false, nil
  1819. }
  1820. func chooseFormat(pd C.VkPhysicalDevice, surf Surface) (C.VkSurfaceFormatKHR, bool, error) {
  1821. var count C.uint32_t
  1822. err := vkErr(C.vkGetPhysicalDeviceSurfaceFormatsKHR(funcs.vkGetPhysicalDeviceSurfaceFormatsKHR, pd, surf, &count, nil))
  1823. if err != nil {
  1824. return C.VkSurfaceFormatKHR{}, false, fmt.Errorf("vulkan: vkGetPhysicalDeviceSurfaceFormatsKHR: %w", err)
  1825. }
  1826. if count == 0 {
  1827. return C.VkSurfaceFormatKHR{}, false, nil
  1828. }
  1829. formats := make([]C.VkSurfaceFormatKHR, count)
  1830. err = vkErr(C.vkGetPhysicalDeviceSurfaceFormatsKHR(funcs.vkGetPhysicalDeviceSurfaceFormatsKHR, pd, surf, &count, &formats[0]))
  1831. if err != nil {
  1832. return C.VkSurfaceFormatKHR{}, false, fmt.Errorf("vulkan: vkGetPhysicalDeviceSurfaceFormatsKHR: %w", err)
  1833. }
  1834. // Query for format with sRGB support.
  1835. // TODO: Support devices without sRGB.
  1836. for _, f := range formats {
  1837. if f.colorSpace != C.VK_COLOR_SPACE_SRGB_NONLINEAR_KHR {
  1838. continue
  1839. }
  1840. switch f.format {
  1841. case C.VK_FORMAT_B8G8R8A8_SRGB, C.VK_FORMAT_R8G8B8A8_SRGB:
  1842. return f, true, nil
  1843. }
  1844. }
  1845. return C.VkSurfaceFormatKHR{}, false, nil
  1846. }
  1847. func chooseQueue(pd C.VkPhysicalDevice, surf Surface, flags C.VkQueueFlags) (int, bool, error) {
  1848. queues := GetPhysicalDeviceQueueFamilyProperties(pd)
  1849. for i, q := range queues {
  1850. // Check for presentation and feature support.
  1851. if q.queueFlags&flags != flags {
  1852. continue
  1853. }
  1854. if surf != nilSurface {
  1855. // Check for presentation support. It is possible that a device has no
  1856. // queue with both rendering and presentation support, but not in reality.
  1857. // See https://github.com/KhronosGroup/Vulkan-Docs/issues/1234.
  1858. var support C.VkBool32
  1859. if err := vkErr(C.vkGetPhysicalDeviceSurfaceSupportKHR(funcs.vkGetPhysicalDeviceSurfaceSupportKHR, pd, C.uint32_t(i), surf, &support)); err != nil {
  1860. return 0, false, fmt.Errorf("vulkan: vkGetPhysicalDeviceSurfaceSupportKHR: %w", err)
  1861. }
  1862. if support != C.VK_TRUE {
  1863. continue
  1864. }
  1865. }
  1866. return i, true, nil
  1867. }
  1868. return 0, false, nil
  1869. }
  1870. func dlsym(handle unsafe.Pointer, s string) unsafe.Pointer {
  1871. cs := C.CString(s)
  1872. defer C.free(unsafe.Pointer(cs))
  1873. return C.dlsym(handle, cs)
  1874. }
  1875. func dlopen(lib string) unsafe.Pointer {
  1876. clib := C.CString(lib)
  1877. defer C.free(unsafe.Pointer(clib))
  1878. return C.dlopen(clib, C.RTLD_NOW|C.RTLD_LOCAL)
  1879. }
  1880. func vkErr(res C.VkResult) error {
  1881. switch res {
  1882. case C.VK_SUCCESS:
  1883. return nil
  1884. default:
  1885. return Error(res)
  1886. }
  1887. }
  1888. func (e Error) Error() string {
  1889. return fmt.Sprintf("error %d", e)
  1890. }