vulkan-ruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.simplecov +6 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +51 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +93 -0
  9. data/Rakefile +14 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +9 -0
  12. data/bin/setup.bat +2 -0
  13. data/examples/models/viking_room.obj +16053 -0
  14. data/examples/screenshots/vt10-viking_room.png +0 -0
  15. data/examples/shaders/depth_buffering.vert +25 -0
  16. data/examples/shaders/depth_buffering.vert.spv +0 -0
  17. data/examples/shaders/model_loading.frag +13 -0
  18. data/examples/shaders/model_loading.frag.spv +0 -0
  19. data/examples/shaders/model_loading.vert +25 -0
  20. data/examples/shaders/model_loading.vert.spv +0 -0
  21. data/examples/shaders/textures.frag +13 -0
  22. data/examples/shaders/textures.frag.spv +0 -0
  23. data/examples/shaders/textures.vert +25 -0
  24. data/examples/shaders/textures.vert.spv +0 -0
  25. data/examples/shaders/triangle.frag +10 -0
  26. data/examples/shaders/triangle.frag.spv +0 -0
  27. data/examples/shaders/triangle.vert +25 -0
  28. data/examples/shaders/triangle.vert.spv +0 -0
  29. data/examples/shaders/uniform_buffer.vert +22 -0
  30. data/examples/shaders/uniform_buffer.vert.spv +0 -0
  31. data/examples/shaders/vertex_buffer.vert +16 -0
  32. data/examples/shaders/vertex_buffer.vert.spv +0 -0
  33. data/examples/textures/texture.png +0 -0
  34. data/examples/textures/viking_room.png +0 -0
  35. data/examples/vt00_dump_info.rb +24 -0
  36. data/examples/vt01_triangle.rb +140 -0
  37. data/examples/vt02_vertex_buffer_triangle_host_visible.rb +164 -0
  38. data/examples/vt03_vertex_buffer_triangle_device_local.rb +174 -0
  39. data/examples/vt04_index_buffer_device_local.rb +193 -0
  40. data/examples/vt05_uniform_buffers.rb +237 -0
  41. data/examples/vt06_textures.rb +275 -0
  42. data/examples/vt07_depth_buffering.rb +315 -0
  43. data/examples/vt08_model_loading.rb +321 -0
  44. data/examples/vt09_mipmaps.rb +329 -0
  45. data/examples/vt10_multisampling.rb +344 -0
  46. data/lib/fiddle_ext.rb +15 -0
  47. data/lib/vulkan/buffer.rb +66 -0
  48. data/lib/vulkan/buffer_memory.rb +13 -0
  49. data/lib/vulkan/checks.rb +12 -0
  50. data/lib/vulkan/command_buffer.rb +380 -0
  51. data/lib/vulkan/command_pool.rb +28 -0
  52. data/lib/vulkan/conversions.rb +511 -0
  53. data/lib/vulkan/descriptor_pool.rb +45 -0
  54. data/lib/vulkan/descriptor_set.rb +86 -0
  55. data/lib/vulkan/descriptor_set_layout.rb +39 -0
  56. data/lib/vulkan/dispatch_table.rb +78 -0
  57. data/lib/vulkan/error.rb +43 -0
  58. data/lib/vulkan/fence.rb +32 -0
  59. data/lib/vulkan/finalizer.rb +43 -0
  60. data/lib/vulkan/framebuffer.rb +37 -0
  61. data/lib/vulkan/generated/commands.rb +298 -0
  62. data/lib/vulkan/generated/enums.rb +1049 -0
  63. data/lib/vulkan/generated/extensions/reserved_do_not_use_146.rb +8 -0
  64. data/lib/vulkan/generated/extensions/reserved_do_not_use_94.rb +8 -0
  65. data/lib/vulkan/generated/extensions/vk_amd_buffer_marker.rb +10 -0
  66. data/lib/vulkan/generated/extensions/vk_amd_draw_indirect_count.rb +10 -0
  67. data/lib/vulkan/generated/extensions/vk_amd_extension_134.rb +10 -0
  68. data/lib/vulkan/generated/extensions/vk_amd_extension_135.rb +10 -0
  69. data/lib/vulkan/generated/extensions/vk_amd_extension_136.rb +10 -0
  70. data/lib/vulkan/generated/extensions/vk_amd_extension_140.rb +10 -0
  71. data/lib/vulkan/generated/extensions/vk_amd_extension_142.rb +10 -0
  72. data/lib/vulkan/generated/extensions/vk_amd_extension_143.rb +10 -0
  73. data/lib/vulkan/generated/extensions/vk_amd_extension_17.rb +10 -0
  74. data/lib/vulkan/generated/extensions/vk_amd_extension_18.rb +10 -0
  75. data/lib/vulkan/generated/extensions/vk_amd_extension_182.rb +10 -0
  76. data/lib/vulkan/generated/extensions/vk_amd_extension_183.rb +10 -0
  77. data/lib/vulkan/generated/extensions/vk_amd_extension_184.rb +10 -0
  78. data/lib/vulkan/generated/extensions/vk_amd_extension_187.rb +10 -0
  79. data/lib/vulkan/generated/extensions/vk_amd_extension_188.rb +10 -0
  80. data/lib/vulkan/generated/extensions/vk_amd_extension_189.rb +10 -0
  81. data/lib/vulkan/generated/extensions/vk_amd_extension_20.rb +10 -0
  82. data/lib/vulkan/generated/extensions/vk_amd_extension_214.rb +10 -0
  83. data/lib/vulkan/generated/extensions/vk_amd_extension_226.rb +10 -0
  84. data/lib/vulkan/generated/extensions/vk_amd_extension_227.rb +10 -0
  85. data/lib/vulkan/generated/extensions/vk_amd_extension_228.rb +10 -0
  86. data/lib/vulkan/generated/extensions/vk_amd_extension_229.rb +10 -0
  87. data/lib/vulkan/generated/extensions/vk_amd_extension_230.rb +10 -0
  88. data/lib/vulkan/generated/extensions/vk_amd_extension_231.rb +10 -0
  89. data/lib/vulkan/generated/extensions/vk_amd_extension_232.rb +10 -0
  90. data/lib/vulkan/generated/extensions/vk_amd_extension_233.rb +10 -0
  91. data/lib/vulkan/generated/extensions/vk_amd_extension_234.rb +10 -0
  92. data/lib/vulkan/generated/extensions/vk_amd_extension_235.rb +10 -0
  93. data/lib/vulkan/generated/extensions/vk_amd_extension_236.rb +10 -0
  94. data/lib/vulkan/generated/extensions/vk_amd_extension_24.rb +10 -0
  95. data/lib/vulkan/generated/extensions/vk_amd_extension_25.rb +10 -0
  96. data/lib/vulkan/generated/extensions/vk_amd_extension_32.rb +10 -0
  97. data/lib/vulkan/generated/extensions/vk_amd_extension_33.rb +10 -0
  98. data/lib/vulkan/generated/extensions/vk_amd_extension_35.rb +10 -0
  99. data/lib/vulkan/generated/extensions/vk_amd_extension_39.rb +10 -0
  100. data/lib/vulkan/generated/extensions/vk_amd_extension_40.rb +10 -0
  101. data/lib/vulkan/generated/extensions/vk_amd_extension_41.rb +10 -0
  102. data/lib/vulkan/generated/extensions/vk_amd_extension_44.rb +10 -0
  103. data/lib/vulkan/generated/extensions/vk_amd_extension_45.rb +10 -0
  104. data/lib/vulkan/generated/extensions/vk_amd_extension_46.rb +10 -0
  105. data/lib/vulkan/generated/extensions/vk_amd_gcn_shader.rb +10 -0
  106. data/lib/vulkan/generated/extensions/vk_amd_gpu_shader_half_float.rb +10 -0
  107. data/lib/vulkan/generated/extensions/vk_amd_gpu_shader_int16.rb +10 -0
  108. data/lib/vulkan/generated/extensions/vk_amd_memory_overallocation_behavior.rb +11 -0
  109. data/lib/vulkan/generated/extensions/vk_amd_mixed_attachment_samples.rb +10 -0
  110. data/lib/vulkan/generated/extensions/vk_amd_negative_viewport_height.rb +10 -0
  111. data/lib/vulkan/generated/extensions/vk_amd_rasterization_order.rb +11 -0
  112. data/lib/vulkan/generated/extensions/vk_amd_shader_ballot.rb +10 -0
  113. data/lib/vulkan/generated/extensions/vk_amd_shader_core_properties.rb +11 -0
  114. data/lib/vulkan/generated/extensions/vk_amd_shader_explicit_vertex_parameter.rb +10 -0
  115. data/lib/vulkan/generated/extensions/vk_amd_shader_fragment_mask.rb +10 -0
  116. data/lib/vulkan/generated/extensions/vk_amd_shader_image_load_store_lod.rb +10 -0
  117. data/lib/vulkan/generated/extensions/vk_amd_shader_info.rb +10 -0
  118. data/lib/vulkan/generated/extensions/vk_amd_shader_trinary_minmax.rb +10 -0
  119. data/lib/vulkan/generated/extensions/vk_amd_texture_gather_bias_lod.rb +11 -0
  120. data/lib/vulkan/generated/extensions/vk_android_external_memory_android_hardware_buffer.rb +17 -0
  121. data/lib/vulkan/generated/extensions/vk_android_native_buffer.rb +12 -0
  122. data/lib/vulkan/generated/extensions/vk_arm_extension_01.rb +10 -0
  123. data/lib/vulkan/generated/extensions/vk_arm_extension_198.rb +10 -0
  124. data/lib/vulkan/generated/extensions/vk_ext_acquire_xlib_display.rb +10 -0
  125. data/lib/vulkan/generated/extensions/vk_ext_astc_decode_mode.rb +12 -0
  126. data/lib/vulkan/generated/extensions/vk_ext_blend_operation_advanced.rb +60 -0
  127. data/lib/vulkan/generated/extensions/vk_ext_calibrated_timestamps.rb +11 -0
  128. data/lib/vulkan/generated/extensions/vk_ext_conditional_rendering.rb +16 -0
  129. data/lib/vulkan/generated/extensions/vk_ext_conservative_rasterization.rb +12 -0
  130. data/lib/vulkan/generated/extensions/vk_ext_debug_marker.rb +13 -0
  131. data/lib/vulkan/generated/extensions/vk_ext_debug_report.rb +16 -0
  132. data/lib/vulkan/generated/extensions/vk_ext_debug_utils.rb +16 -0
  133. data/lib/vulkan/generated/extensions/vk_ext_depth_range_unrestricted.rb +10 -0
  134. data/lib/vulkan/generated/extensions/vk_ext_descriptor_indexing.rb +18 -0
  135. data/lib/vulkan/generated/extensions/vk_ext_direct_mode_display.rb +10 -0
  136. data/lib/vulkan/generated/extensions/vk_ext_discard_rectangles.rb +13 -0
  137. data/lib/vulkan/generated/extensions/vk_ext_display_control.rb +14 -0
  138. data/lib/vulkan/generated/extensions/vk_ext_display_surface_counter.rb +12 -0
  139. data/lib/vulkan/generated/extensions/vk_ext_extension_160.rb +10 -0
  140. data/lib/vulkan/generated/extensions/vk_ext_extension_176.rb +10 -0
  141. data/lib/vulkan/generated/extensions/vk_ext_extension_177.rb +10 -0
  142. data/lib/vulkan/generated/extensions/vk_ext_extension_219.rb +15 -0
  143. data/lib/vulkan/generated/extensions/vk_ext_extension_220.rb +10 -0
  144. data/lib/vulkan/generated/extensions/vk_ext_extension_222.rb +10 -0
  145. data/lib/vulkan/generated/extensions/vk_ext_extension_223.rb +10 -0
  146. data/lib/vulkan/generated/extensions/vk_ext_extension_28.rb +10 -0
  147. data/lib/vulkan/generated/extensions/vk_ext_external_memory_dma_buf.rb +11 -0
  148. data/lib/vulkan/generated/extensions/vk_ext_external_memory_host.rb +15 -0
  149. data/lib/vulkan/generated/extensions/vk_ext_global_priority.rb +12 -0
  150. data/lib/vulkan/generated/extensions/vk_ext_hdr_metadata.rb +11 -0
  151. data/lib/vulkan/generated/extensions/vk_ext_image_drm_format_modifier.rb +24 -0
  152. data/lib/vulkan/generated/extensions/vk_ext_inline_uniform_block.rb +15 -0
  153. data/lib/vulkan/generated/extensions/vk_ext_macos_ios_window.rb +10 -0
  154. data/lib/vulkan/generated/extensions/vk_ext_pci_bus_info.rb +11 -0
  155. data/lib/vulkan/generated/extensions/vk_ext_post_depth_coverage.rb +10 -0
  156. data/lib/vulkan/generated/extensions/vk_ext_queue_family_foreign.rb +11 -0
  157. data/lib/vulkan/generated/extensions/vk_ext_sample_locations.rb +17 -0
  158. data/lib/vulkan/generated/extensions/vk_ext_sampler_filter_minmax.rb +13 -0
  159. data/lib/vulkan/generated/extensions/vk_ext_shader_stencil_export.rb +10 -0
  160. data/lib/vulkan/generated/extensions/vk_ext_shader_subgroup_ballot.rb +10 -0
  161. data/lib/vulkan/generated/extensions/vk_ext_shader_subgroup_vote.rb +10 -0
  162. data/lib/vulkan/generated/extensions/vk_ext_shader_viewport_index_layer.rb +10 -0
  163. data/lib/vulkan/generated/extensions/vk_ext_swapchain_colorspace.rb +24 -0
  164. data/lib/vulkan/generated/extensions/vk_ext_transform_feedback.rb +20 -0
  165. data/lib/vulkan/generated/extensions/vk_ext_validation_cache.rb +13 -0
  166. data/lib/vulkan/generated/extensions/vk_ext_validation_flags.rb +11 -0
  167. data/lib/vulkan/generated/extensions/vk_ext_vertex_attribute_divisor.rb +13 -0
  168. data/lib/vulkan/generated/extensions/vk_fuchsia_imagepipe_surface.rb +11 -0
  169. data/lib/vulkan/generated/extensions/vk_google_decorate_string.rb +10 -0
  170. data/lib/vulkan/generated/extensions/vk_google_display_timing.rb +11 -0
  171. data/lib/vulkan/generated/extensions/vk_google_extension_192.rb +10 -0
  172. data/lib/vulkan/generated/extensions/vk_google_extension_193.rb +10 -0
  173. data/lib/vulkan/generated/extensions/vk_google_extension_194.rb +10 -0
  174. data/lib/vulkan/generated/extensions/vk_google_extension_195.rb +10 -0
  175. data/lib/vulkan/generated/extensions/vk_google_extension_196.rb +10 -0
  176. data/lib/vulkan/generated/extensions/vk_google_extension_216.rb +10 -0
  177. data/lib/vulkan/generated/extensions/vk_google_extension_217.rb +10 -0
  178. data/lib/vulkan/generated/extensions/vk_google_extension_49.rb +10 -0
  179. data/lib/vulkan/generated/extensions/vk_google_extension_50.rb +10 -0
  180. data/lib/vulkan/generated/extensions/vk_google_hlsl_functionality1.rb +10 -0
  181. data/lib/vulkan/generated/extensions/vk_img_extension_107.rb +10 -0
  182. data/lib/vulkan/generated/extensions/vk_img_extension_108.rb +10 -0
  183. data/lib/vulkan/generated/extensions/vk_img_extension_109.rb +10 -0
  184. data/lib/vulkan/generated/extensions/vk_img_extension_111.rb +10 -0
  185. data/lib/vulkan/generated/extensions/vk_img_extension_69.rb +10 -0
  186. data/lib/vulkan/generated/extensions/vk_img_filter_cubic.rb +12 -0
  187. data/lib/vulkan/generated/extensions/vk_img_format_pvrtc.rb +18 -0
  188. data/lib/vulkan/generated/extensions/vk_intel_extension_210.rb +10 -0
  189. data/lib/vulkan/generated/extensions/vk_intel_extension_211.rb +10 -0
  190. data/lib/vulkan/generated/extensions/vk_intel_extension_243.rb +10 -0
  191. data/lib/vulkan/generated/extensions/vk_khr_16bit_storage.rb +11 -0
  192. data/lib/vulkan/generated/extensions/vk_khr_8bit_storage.rb +11 -0
  193. data/lib/vulkan/generated/extensions/vk_khr_android_surface.rb +11 -0
  194. data/lib/vulkan/generated/extensions/vk_khr_bind_memory2.rb +13 -0
  195. data/lib/vulkan/generated/extensions/vk_khr_create_renderpass2.rb +17 -0
  196. data/lib/vulkan/generated/extensions/vk_khr_dedicated_allocation.rb +12 -0
  197. data/lib/vulkan/generated/extensions/vk_khr_descriptor_update_template.rb +15 -0
  198. data/lib/vulkan/generated/extensions/vk_khr_device_group.rb +33 -0
  199. data/lib/vulkan/generated/extensions/vk_khr_device_group_creation.rb +14 -0
  200. data/lib/vulkan/generated/extensions/vk_khr_display.rb +14 -0
  201. data/lib/vulkan/generated/extensions/vk_khr_display_swapchain.rb +12 -0
  202. data/lib/vulkan/generated/extensions/vk_khr_draw_indirect_count.rb +10 -0
  203. data/lib/vulkan/generated/extensions/vk_khr_driver_properties.rb +13 -0
  204. data/lib/vulkan/generated/extensions/vk_khr_extension_117.rb +10 -0
  205. data/lib/vulkan/generated/extensions/vk_khr_extension_119.rb +10 -0
  206. data/lib/vulkan/generated/extensions/vk_khr_extension_200.rb +10 -0
  207. data/lib/vulkan/generated/extensions/vk_khr_extension_201.rb +10 -0
  208. data/lib/vulkan/generated/extensions/vk_khr_extension_208.rb +10 -0
  209. data/lib/vulkan/generated/extensions/vk_khr_extension_209.rb +10 -0
  210. data/lib/vulkan/generated/extensions/vk_khr_extension_221.rb +11 -0
  211. data/lib/vulkan/generated/extensions/vk_khr_extension_237.rb +10 -0
  212. data/lib/vulkan/generated/extensions/vk_khr_extension_238.rb +10 -0
  213. data/lib/vulkan/generated/extensions/vk_khr_extension_239.rb +10 -0
  214. data/lib/vulkan/generated/extensions/vk_khr_extension_240.rb +10 -0
  215. data/lib/vulkan/generated/extensions/vk_khr_extension_83.rb +10 -0
  216. data/lib/vulkan/generated/extensions/vk_khr_external_fence.rb +12 -0
  217. data/lib/vulkan/generated/extensions/vk_khr_external_fence_capabilities.rb +19 -0
  218. data/lib/vulkan/generated/extensions/vk_khr_external_fence_fd.rb +12 -0
  219. data/lib/vulkan/generated/extensions/vk_khr_external_fence_win32.rb +13 -0
  220. data/lib/vulkan/generated/extensions/vk_khr_external_memory.rb +15 -0
  221. data/lib/vulkan/generated/extensions/vk_khr_external_memory_capabilities.rb +26 -0
  222. data/lib/vulkan/generated/extensions/vk_khr_external_memory_fd.rb +13 -0
  223. data/lib/vulkan/generated/extensions/vk_khr_external_memory_win32.rb +14 -0
  224. data/lib/vulkan/generated/extensions/vk_khr_external_semaphore.rb +12 -0
  225. data/lib/vulkan/generated/extensions/vk_khr_external_semaphore_capabilities.rb +20 -0
  226. data/lib/vulkan/generated/extensions/vk_khr_external_semaphore_fd.rb +12 -0
  227. data/lib/vulkan/generated/extensions/vk_khr_external_semaphore_win32.rb +14 -0
  228. data/lib/vulkan/generated/extensions/vk_khr_get_display_properties2.rb +15 -0
  229. data/lib/vulkan/generated/extensions/vk_khr_get_memory_requirements2.rb +15 -0
  230. data/lib/vulkan/generated/extensions/vk_khr_get_physical_device_properties2.rb +19 -0
  231. data/lib/vulkan/generated/extensions/vk_khr_get_surface_capabilities2.rb +13 -0
  232. data/lib/vulkan/generated/extensions/vk_khr_image_format_list.rb +11 -0
  233. data/lib/vulkan/generated/extensions/vk_khr_incremental_present.rb +11 -0
  234. data/lib/vulkan/generated/extensions/vk_khr_maintenance1.rb +14 -0
  235. data/lib/vulkan/generated/extensions/vk_khr_maintenance2.rb +22 -0
  236. data/lib/vulkan/generated/extensions/vk_khr_maintenance3.rb +12 -0
  237. data/lib/vulkan/generated/extensions/vk_khr_mir_surface.rb +10 -0
  238. data/lib/vulkan/generated/extensions/vk_khr_multiview.rb +14 -0
  239. data/lib/vulkan/generated/extensions/vk_khr_push_descriptor.rb +13 -0
  240. data/lib/vulkan/generated/extensions/vk_khr_relaxed_block_layout.rb +10 -0
  241. data/lib/vulkan/generated/extensions/vk_khr_sampler_mirror_clamp_to_edge.rb +11 -0
  242. data/lib/vulkan/generated/extensions/vk_khr_sampler_ycbcr_conversion.rb +73 -0
  243. data/lib/vulkan/generated/extensions/vk_khr_shader_atomic_int64.rb +11 -0
  244. data/lib/vulkan/generated/extensions/vk_khr_shader_draw_parameters.rb +10 -0
  245. data/lib/vulkan/generated/extensions/vk_khr_shared_presentable_image.rb +14 -0
  246. data/lib/vulkan/generated/extensions/vk_khr_storage_buffer_storage_class.rb +10 -0
  247. data/lib/vulkan/generated/extensions/vk_khr_surface.rb +13 -0
  248. data/lib/vulkan/generated/extensions/vk_khr_swapchain.rb +24 -0
  249. data/lib/vulkan/generated/extensions/vk_khr_variable_pointers.rb +11 -0
  250. data/lib/vulkan/generated/extensions/vk_khr_vulkan_memory_model.rb +11 -0
  251. data/lib/vulkan/generated/extensions/vk_khr_wayland_surface.rb +11 -0
  252. data/lib/vulkan/generated/extensions/vk_khr_win32_keyed_mutex.rb +11 -0
  253. data/lib/vulkan/generated/extensions/vk_khr_win32_surface.rb +11 -0
  254. data/lib/vulkan/generated/extensions/vk_khr_xcb_surface.rb +11 -0
  255. data/lib/vulkan/generated/extensions/vk_khr_xlib_surface.rb +11 -0
  256. data/lib/vulkan/generated/extensions/vk_mesa_extension_244.rb +10 -0
  257. data/lib/vulkan/generated/extensions/vk_mvk_ios_surface.rb +11 -0
  258. data/lib/vulkan/generated/extensions/vk_mvk_macos_surface.rb +11 -0
  259. data/lib/vulkan/generated/extensions/vk_mvk_moltenvk.rb +10 -0
  260. data/lib/vulkan/generated/extensions/vk_nn_vi_surface.rb +11 -0
  261. data/lib/vulkan/generated/extensions/vk_nv_clip_space_w_scaling.rb +12 -0
  262. data/lib/vulkan/generated/extensions/vk_nv_compute_shader_derivatives.rb +11 -0
  263. data/lib/vulkan/generated/extensions/vk_nv_corner_sampled_image.rb +12 -0
  264. data/lib/vulkan/generated/extensions/vk_nv_dedicated_allocation.rb +13 -0
  265. data/lib/vulkan/generated/extensions/vk_nv_device_diagnostic_checkpoints.rb +12 -0
  266. data/lib/vulkan/generated/extensions/vk_nv_extension_101.rb +10 -0
  267. data/lib/vulkan/generated/extensions/vk_nv_extension_103.rb +10 -0
  268. data/lib/vulkan/generated/extensions/vk_nv_extension_104.rb +10 -0
  269. data/lib/vulkan/generated/extensions/vk_nv_extension_151.rb +10 -0
  270. data/lib/vulkan/generated/extensions/vk_nv_extension_152.rb +10 -0
  271. data/lib/vulkan/generated/extensions/vk_nv_extension_155.rb +10 -0
  272. data/lib/vulkan/generated/extensions/vk_nv_extension_164.rb +10 -0
  273. data/lib/vulkan/generated/extensions/vk_nv_extension_168.rb +10 -0
  274. data/lib/vulkan/generated/extensions/vk_nv_extension_241.rb +10 -0
  275. data/lib/vulkan/generated/extensions/vk_nv_extension_242.rb +10 -0
  276. data/lib/vulkan/generated/extensions/vk_nv_extension_245.rb +10 -0
  277. data/lib/vulkan/generated/extensions/vk_nv_extension_53.rb +10 -0
  278. data/lib/vulkan/generated/extensions/vk_nv_external_memory.rb +12 -0
  279. data/lib/vulkan/generated/extensions/vk_nv_external_memory_capabilities.rb +10 -0
  280. data/lib/vulkan/generated/extensions/vk_nv_external_memory_win32.rb +12 -0
  281. data/lib/vulkan/generated/extensions/vk_nv_fill_rectangle.rb +11 -0
  282. data/lib/vulkan/generated/extensions/vk_nv_fragment_coverage_to_color.rb +11 -0
  283. data/lib/vulkan/generated/extensions/vk_nv_fragment_shader_barycentric.rb +11 -0
  284. data/lib/vulkan/generated/extensions/vk_nv_framebuffer_mixed_samples.rb +11 -0
  285. data/lib/vulkan/generated/extensions/vk_nv_geometry_shader_passthrough.rb +10 -0
  286. data/lib/vulkan/generated/extensions/vk_nv_glsl_shader.rb +11 -0
  287. data/lib/vulkan/generated/extensions/vk_nv_mesh_shader.rb +16 -0
  288. data/lib/vulkan/generated/extensions/vk_nv_ray_tracing.rb +40 -0
  289. data/lib/vulkan/generated/extensions/vk_nv_representative_fragment_test.rb +12 -0
  290. data/lib/vulkan/generated/extensions/vk_nv_sample_mask_override_coverage.rb +10 -0
  291. data/lib/vulkan/generated/extensions/vk_nv_scissor_exclusive.rb +13 -0
  292. data/lib/vulkan/generated/extensions/vk_nv_shader_image_footprint.rb +11 -0
  293. data/lib/vulkan/generated/extensions/vk_nv_shader_subgroup_partitioned.rb +11 -0
  294. data/lib/vulkan/generated/extensions/vk_nv_shading_rate_image.rb +20 -0
  295. data/lib/vulkan/generated/extensions/vk_nv_viewport_array2.rb +10 -0
  296. data/lib/vulkan/generated/extensions/vk_nv_viewport_swizzle.rb +11 -0
  297. data/lib/vulkan/generated/extensions/vk_nv_win32_keyed_mutex.rb +11 -0
  298. data/lib/vulkan/generated/extensions/vk_nvx_device_generated_commands.rb +21 -0
  299. data/lib/vulkan/generated/extensions/vk_nvx_extension_30.rb +10 -0
  300. data/lib/vulkan/generated/extensions/vk_nvx_extension_31.rb +10 -0
  301. data/lib/vulkan/generated/extensions/vk_nvx_extension_48.rb +10 -0
  302. data/lib/vulkan/generated/extensions/vk_nvx_extension_52.rb +10 -0
  303. data/lib/vulkan/generated/extensions/vk_nvx_multiview_per_view_attributes.rb +13 -0
  304. data/lib/vulkan/generated/extensions/vk_qcom_extension_171.rb +10 -0
  305. data/lib/vulkan/generated/extensions/vk_qcom_extension_172.rb +10 -0
  306. data/lib/vulkan/generated/extensions/vk_qcom_extension_173.rb +10 -0
  307. data/lib/vulkan/generated/extensions/vk_qcom_extension_174.rb +10 -0
  308. data/lib/vulkan/generated/extensions.rb +251 -0
  309. data/lib/vulkan/generated/structs.rb +2600 -0
  310. data/lib/vulkan/generated/types.rb +348 -0
  311. data/lib/vulkan/generated/vk.xml +10127 -0
  312. data/lib/vulkan/generated.rb +77 -0
  313. data/lib/vulkan/image.rb +263 -0
  314. data/lib/vulkan/image_memory.rb +13 -0
  315. data/lib/vulkan/image_view.rb +46 -0
  316. data/lib/vulkan/instance.rb +183 -0
  317. data/lib/vulkan/logical_device.rb +165 -0
  318. data/lib/vulkan/memory.rb +171 -0
  319. data/lib/vulkan/mock/swapchain_surface_info.rb +42 -0
  320. data/lib/vulkan/mock.rb +5 -0
  321. data/lib/vulkan/physical_device.rb +162 -0
  322. data/lib/vulkan/pipeline.rb +294 -0
  323. data/lib/vulkan/platform.rb +34 -0
  324. data/lib/vulkan/queue.rb +94 -0
  325. data/lib/vulkan/queue_family.rb +27 -0
  326. data/lib/vulkan/render_pass/subpass.rb +80 -0
  327. data/lib/vulkan/render_pass.rb +71 -0
  328. data/lib/vulkan/sampler.rb +48 -0
  329. data/lib/vulkan/semaphore.rb +16 -0
  330. data/lib/vulkan/shader_stage.rb +33 -0
  331. data/lib/vulkan/surface.rb +10 -0
  332. data/lib/vulkan/swapchain.rb +87 -0
  333. data/lib/vulkan/swapchain_builder.rb +111 -0
  334. data/lib/vulkan/swapchain_surface_info.rb +54 -0
  335. data/lib/vulkan/version.rb +3 -0
  336. data/lib/vulkan/window_surface.rb +13 -0
  337. data/lib/vulkan-ruby.rb +1 -0
  338. data/lib/vulkan.rb +91 -0
  339. data/tasks/examples.rake +29 -0
  340. data/tasks/fetch.rake +9 -0
  341. data/tasks/generate/commands.rake +51 -0
  342. data/tasks/generate/enums.rake +43 -0
  343. data/tasks/generate/extensions.rake +35 -0
  344. data/tasks/generate/structs.rake +117 -0
  345. data/tasks/generate/types.rake +91 -0
  346. data/tasks/generate.rake +2 -0
  347. data/tasks/helpers.rb +59 -0
  348. data/tasks/shaders.rake +8 -0
  349. data/vulkan-ruby.gemspec +45 -0
  350. metadata +546 -0
@@ -0,0 +1,77 @@
1
+ require 'fiddle/types'
2
+
3
+ module Vulkan
4
+ load_vulkan_library
5
+
6
+ typealias 'int8_t', 'char'
7
+ typealias 'int16_t', 'short'
8
+ typealias 'int32_t', 'int'
9
+ typealias 'int64_t', 'long'
10
+ typealias 'uint8_t', 'unsigned char'
11
+ typealias 'uint16_t', 'unsigned short'
12
+ typealias 'uint32_t', 'unsigned int'
13
+ typealias 'uint64_t', 'unsigned long'
14
+
15
+ # platform-specific definitions, but we need them even on alternatives,
16
+ # or else things get complicated when parsing vk.xml
17
+ # X11
18
+ typealias 'Display', 'void' # HACK: since only pointers to this type are used, its size need not be known
19
+ typealias 'VisualID', 'unsigned long'
20
+ typealias 'XID', 'unsigned long'
21
+ typealias 'Window', 'XID'
22
+ typealias 'RROutput', 'XID'
23
+ # Wayland
24
+ typealias 'wl_display', 'void' # HACK: since only pointers to this type are used, its size need not be known
25
+ typealias 'wl_surface', 'void' # HACK: since only pointers to this type are used, its size need not be known
26
+ # Windows
27
+ include Fiddle::Win32Types
28
+ typealias 'WCHAR', 'unsigned short'
29
+ typealias 'LPCWSTR', 'WCHAR *'
30
+ # XCB
31
+ typealias 'xcb_connection_t', 'void' # HACK: since only pointers to this type are used, its size need not be known
32
+ typealias 'xcb_visualid_t', 'uint32_t'
33
+ typealias 'xcb_window_t', 'uint32_t'
34
+ # Zircon
35
+ typealias 'zx_handle_t', 'uint32_t'
36
+
37
+ class << self
38
+ @@lookup_map = {}
39
+ @@function_registry = {}
40
+
41
+ # Returns a dispatch table for the given instance and device.
42
+ def [](instance, device)
43
+ hash = [instance, device].hash
44
+ @@lookup_map[hash] ||= Vulkan::DispatchTable.new(instance, device)
45
+ end
46
+
47
+ def register_function(proto, params)
48
+ # DispatchTable can use method_missing to know the name of a function to
49
+ # look up, but we need to know the params and its return type, which come
50
+ # from vk.xml and which are foreign concepts to ruby so we need to
51
+ # persist that information for lookup within method_missing. See
52
+ # DispatchTable#method_missing.
53
+ signature = "#{proto}(#{params})"
54
+ name, ctype, argtype = parse_signature(signature, Vulkan.send(:type_alias))
55
+ function_registry[name.intern] = {
56
+ name: name,
57
+ return_type: ctype,
58
+ params_types: argtype,
59
+ prototype: proto,
60
+ params: params,
61
+ signature: signature
62
+ }
63
+ end
64
+
65
+ def function_registry
66
+ @@function_registry
67
+ end
68
+ end
69
+
70
+ require_relative 'generated/types'
71
+ require_relative 'generated/enums'
72
+ require_relative 'generated/structs'
73
+
74
+ extern "PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance instance, const char* pName)", :stdcall
75
+ require_relative 'generated/commands'
76
+ require_relative 'generated/extensions'
77
+ end
@@ -0,0 +1,263 @@
1
+ module Vulkan
2
+ class Image
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :dimensions
8
+ attr_reader :width
9
+ attr_reader :height
10
+ attr_reader :depth
11
+ attr_reader :mip_levels
12
+ attr_reader :array_layers
13
+ attr_reader :format
14
+ attr_reader :tiling
15
+ attr_reader :initial_layout
16
+ attr_reader :layout
17
+ attr_reader :usage
18
+ attr_reader :sharing
19
+ attr_reader :samples
20
+ attr_reader :memory
21
+
22
+ # You should only set this if you have transitioned the image to a
23
+ # different layout outside of this class, by working directly with
24
+ # a command buffer.
25
+ attr_writer :layout
26
+
27
+ def initialize(vk, physical_device,
28
+ dimensions: ,
29
+ width: ,
30
+ height: ,
31
+ depth: ,
32
+ mip_levels: 1,
33
+ array_layers: 1,
34
+ format: :r8g8b8a8_unorm,
35
+ tiling: :optimal,
36
+ initial_layout: :undefined,
37
+ usage: [:transfer_dst, :sampled],
38
+ sharing: :exclusive,
39
+ samples: 1,
40
+ flags: [],
41
+ properties: :device_local)
42
+ @vk = vk
43
+ @dimensions = dimensions
44
+ @width = width
45
+ @height = height
46
+ @depth = depth
47
+ @mip_levels = mip_levels
48
+ @array_layers = array_layers
49
+ @format = format
50
+ @tiling = tiling
51
+ @initial_layout = @layout = initial_layout
52
+ @usage = usage
53
+ @sharing = sharing
54
+ @samples = samples
55
+ image_info = VkImageCreateInfo.malloc
56
+ image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
57
+ image_info.imageType = sym_to_image_type((1..3).include?(dimensions) ? :"#{dimensions}d" : dimensions)
58
+ image_info.extent.width = width
59
+ image_info.extent.height = height
60
+ image_info.extent.depth = depth
61
+ image_info.mipLevels = mip_levels
62
+ image_info.arrayLayers = array_layers
63
+ image_info.format = sym_to_image_format(format)
64
+ image_info.tiling = sym_to_image_tiling(tiling)
65
+ image_info.initialLayout = sym_to_image_layout(initial_layout)
66
+ image_info.usage = syms_to_image_usage_flags(usage)
67
+ image_info.sharingMode = sym_to_sharing_mode(sharing)
68
+ image_info.samples = sym_to_samples(samples)
69
+ image_info.flags = syms_to_image_create_flags(flags)
70
+ handle_p = Vulkan.create_value('VkImage')
71
+ check_result @vk.vkCreateImage(@vk.device, image_info, nil, handle_p)
72
+ @handle = handle_p.value
73
+ @memory = Vulkan::ImageMemory.new(@vk, physical_device, owner: self, properties: properties)
74
+ finalize_with @vk, :vkDestroyImage, @vk.device, @handle, nil
75
+ end
76
+
77
+ def create_view(format: self.format,
78
+ base_mip_level: 0,
79
+ level_count: mip_levels - base_mip_level,
80
+ base_array_layer: 0,
81
+ layer_count: array_layers - base_array_layer,
82
+ aspects: :color,
83
+ **other_image_view_args)
84
+ ImageView.new(@vk, self, format,
85
+ base_mip_level: base_mip_level,
86
+ level_count: level_count,
87
+ base_array_layer: base_array_layer,
88
+ layer_count: layer_count,
89
+ aspects: aspects,
90
+ **other_image_view_args)
91
+ end
92
+
93
+ def detect_transition_access_and_stage_flags(from, to)
94
+ from, to = sym_to_image_layout(from), sym_to_image_layout(to)
95
+ if from == VK_IMAGE_LAYOUT_UNDEFINED &&
96
+ to == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
97
+ return {
98
+ src_access: 0,
99
+ dst_access: :transfer_write,
100
+ src_stages: :top_of_pipe,
101
+ dst_stages: :transfer,
102
+ dependencies: 0
103
+ }
104
+ elsif from == VK_IMAGE_LAYOUT_UNDEFINED &&
105
+ to == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
106
+ return {
107
+ src_access: 0,
108
+ dst_access: :shader_read,
109
+ src_stages: :color_attachment_output,
110
+ dst_stages: :fragment_shader,
111
+ dependencies: 0
112
+ }
113
+ elsif from == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL &&
114
+ to == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
115
+ return {
116
+ src_access: :transfer_write,
117
+ dst_access: :shader_read,
118
+ src_stages: :transfer,
119
+ dst_stages: :fragment_shader,
120
+ dependencies: 0
121
+ }
122
+ elsif from == VK_IMAGE_LAYOUT_UNDEFINED &&
123
+ to == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
124
+ return {
125
+ src_access: 0,
126
+ dst_access: [ :depth_stencil_attachment_read, :depth_stencil_attachment_write ],
127
+ src_stages: :top_of_pipe,
128
+ dst_stages: :early_fragment_tests,
129
+ dependencies: 0
130
+ }
131
+ elsif from == VK_IMAGE_LAYOUT_UNDEFINED &&
132
+ to == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
133
+ return {
134
+ src_access: 0,
135
+ dst_access: [ :color_attachment_read, :color_attachment_write ],
136
+ src_stages: :top_of_pipe,
137
+ dst_stages: :color_attachment_output,
138
+ dependencies: 0
139
+ }
140
+ else
141
+ raise ArgumentError, "unsupported layout transition (%s to %s)!" % [from.inspect, to.inspect]
142
+ end
143
+ end
144
+
145
+ # Transitions the layout for this image using the given command buffer.
146
+ # Does not submit the command buffer. Use #transition_layout if you want
147
+ # to be sure the image has fully transitioned before continuing.
148
+ def transition_layout_using(cmd,
149
+ from: self.layout,
150
+ to:,
151
+ src_queue_family: nil,
152
+ dst_queue_family: nil,
153
+ base_mip_level: 0,
154
+ level_count: mip_levels - base_mip_level,
155
+ base_array_layer: 0,
156
+ layer_count: array_layers - base_array_layer,
157
+ aspects: :color)
158
+ access_opts = detect_transition_access_and_stage_flags(from, to)
159
+ cmd.pipeline_image_barrier from_layout: from,
160
+ to_layout: to,
161
+ src_queue_family: src_queue_family,
162
+ dst_queue_family: dst_queue_family,
163
+ image: self,
164
+ aspects: aspects,
165
+ base_mip_level: base_mip_level,
166
+ level_count: level_count,
167
+ base_array_layer: base_array_layer,
168
+ layer_count: layer_count,
169
+ **access_opts
170
+ @layout = to
171
+ end
172
+
173
+ # Transitions the layout for this image, using the given command pool to
174
+ # allocate a command buffer and using the given queue to submit it. If
175
+ # `wait_until_idle` is true, this method will block until the queue is
176
+ # idle. Otherwise, it will return as soon as the command buffer is
177
+ # submitted. See #transition_layout_with for other arguments.
178
+ def transition_layout(command_pool, queue, wait_until_idle: true, **other_args)
179
+ command_buffer = command_pool.create_command_buffer(usage: :one_time_submit) do |cmd|
180
+ transition_layout_using(cmd, **other_args)
181
+ end
182
+ queue.submit([command_buffer])
183
+ queue.wait_until_idle if wait_until_idle
184
+ end
185
+
186
+ def copy_from_buffer(command_pool, queue,
187
+ buffer:,
188
+ buffer_offset: 0,
189
+ buffer_row_length: 0,
190
+ buffer_image_height: 0,
191
+ x: 0,
192
+ y: 0,
193
+ z: 0,
194
+ width: self.width - x,
195
+ height: self.height - y,
196
+ depth: self.depth - z,
197
+ aspects: :color,
198
+ mip_level: 0,
199
+ base_array_layer: 0,
200
+ layer_count: array_layers - base_array_layer,
201
+ wait_until_idle: true)
202
+ command_buffer = command_pool.create_command_buffer(usage: :one_time_submit) do |cmd|
203
+ cmd.copy_buffer_to_image buffer, self, [
204
+ buffer_offset: buffer_offset,
205
+ buffer_row_length: buffer_row_length,
206
+ buffer_image_height: buffer_image_height,
207
+ x: x,
208
+ y: y,
209
+ z: z,
210
+ width: width,
211
+ height: height,
212
+ depth: depth,
213
+ aspects: aspects,
214
+ mip_level: mip_level,
215
+ base_array_layer: base_array_layer,
216
+ layer_count: layer_count
217
+ ]
218
+ end
219
+
220
+ queue.submit([command_buffer])
221
+ queue.wait_until_idle if wait_until_idle
222
+ end
223
+
224
+ # See CommandBuffer#blit_image for details. If `:wait_until_idle` is true,
225
+ # this method won't return until the blit operation has completed and its
226
+ # queue is idle.
227
+ def blit_from(command_pool, queue,
228
+ src:,
229
+ src_layout: :transfer_src_optimal,
230
+ dst_layout: :transfer_dst_optimal,
231
+ regions:,
232
+ filter: :nearest,
233
+ wait_until_idle: false)
234
+ command_buffer = command_pool.create_command_buffer(usage: :one_time_submit) do |cmd|
235
+ cmd.blit_image src_image: src,
236
+ src_image_layout: src_layout,
237
+ dst_image: self,
238
+ dst_image_layout: dst_layout,
239
+ regions: regions,
240
+ filter: filter
241
+ end
242
+
243
+ queue.submit([command_buffer])
244
+ queue.wait_until_idle if wait_until_idle
245
+ end
246
+
247
+ def map(*args, &block)
248
+ memory.map(*args, &block)
249
+ end
250
+
251
+ def mapped?
252
+ memory.mapped?
253
+ end
254
+
255
+ def unmap
256
+ memory.unmap
257
+ end
258
+
259
+ def data
260
+ memory.data
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,13 @@
1
+ module Vulkan
2
+ class ImageMemory < Memory
3
+ def query_memory_requirements
4
+ VkMemoryRequirements.malloc.tap do |req|
5
+ @vk.vkGetImageMemoryRequirements(@vk.device, @owner.to_ptr, req)
6
+ end
7
+ end
8
+
9
+ def bind
10
+ @vk.vkBindImageMemory(@vk.device, @owner.to_ptr, to_ptr, 0);
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ module Vulkan
2
+ class ImageView
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :image
8
+
9
+ def initialize(vk, image, image_format,
10
+ view_type: VK_IMAGE_VIEW_TYPE_2D,
11
+ red_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
12
+ green_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
13
+ blue_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
14
+ alpha_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
15
+ aspects: :color,
16
+ base_mip_level: 0,
17
+ level_count: 1,
18
+ base_array_layer: 0,
19
+ layer_count: 1)
20
+ @vk = vk
21
+ @image = image
22
+ create_info = VkImageViewCreateInfo.malloc
23
+ create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
24
+ create_info.image = image.respond_to?(:to_ptr) ? image.to_ptr : image
25
+ create_info.viewType = view_type
26
+ create_info.format = sym_to_image_format(image_format)
27
+ create_info.components.r = red_swizzle
28
+ create_info.components.g = green_swizzle
29
+ create_info.components.b = blue_swizzle
30
+ create_info.components.a = alpha_swizzle
31
+ create_info.subresourceRange.aspectMask = syms_to_image_aspect_flags(aspects)
32
+ create_info.subresourceRange.baseMipLevel = base_mip_level
33
+ create_info.subresourceRange.levelCount = level_count
34
+ create_info.subresourceRange.baseArrayLayer = base_array_layer
35
+ create_info.subresourceRange.layerCount = layer_count
36
+ view_p = Vulkan.create_value("void *", nil)
37
+ check_result @vk.vkCreateImageView(vk.device, create_info, nil, view_p)
38
+ @handle = view_p.value
39
+ finalize_with @vk, :vkDestroyImageView, vk.device, @handle, nil
40
+ end
41
+
42
+ def to_ptr
43
+ @handle
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,183 @@
1
+ module Vulkan
2
+ class Instance
3
+ extend Vulkan::Checks
4
+ extend Vulkan::Conversions
5
+ include Vulkan::Checks
6
+ include Vulkan::Conversions
7
+ include Vulkan::Finalizer
8
+
9
+ class << self
10
+ def extensions
11
+ @extensions ||= begin
12
+ property_count_ptr = Vulkan.create_value("uint32_t", 0)
13
+ check_result Vulkan[nil, nil].vkEnumerateInstanceExtensionProperties(nil, property_count_ptr, nil)
14
+ property_count = property_count_ptr.value
15
+ container = Vulkan.struct("properties[#{property_count}]" => VkExtensionProperties).malloc
16
+ check_result Vulkan[nil, nil].vkEnumerateInstanceExtensionProperties(nil, property_count_ptr, container)
17
+ container.properties.map { |prop| struct_to_hash(prop) }
18
+ end
19
+ end
20
+
21
+ def layers
22
+ @layers ||= begin
23
+ property_count_ptr = Vulkan.create_value("uint32_t", 0)
24
+ check_result Vulkan[nil, nil].vkEnumerateInstanceLayerProperties(property_count_ptr, nil)
25
+ property_count = property_count_ptr.value
26
+ container_struct = Vulkan.struct("properties[#{property_count}]" => VkLayerProperties)
27
+ container = container_struct.malloc
28
+ check_result Vulkan[nil, nil].vkEnumerateInstanceLayerProperties(property_count_ptr, container)
29
+ container.properties.map { |prop| struct_to_hash(prop) }
30
+ end
31
+ end
32
+
33
+ def extension_names
34
+ extensions.map { |ext| ext[:extension_name] }
35
+ end
36
+
37
+ def layer_names
38
+ layers.map { |layer| layer[:layer_name] }
39
+ end
40
+
41
+ def version
42
+ ver_p = Vulkan.create_value('uint32_t', 0)
43
+ check_result Vulkan[nil, nil].vkEnumerateInstanceVersion(ver_p)
44
+ vk_parse_version ver_p.value
45
+ end
46
+ end
47
+
48
+ def initialize(application_name: $0, application_version: '1.0.0',
49
+ engine_name: 'vulkan-ruby', engine_version: Vulkan::VERSION,
50
+ api_version: self.class.version, extensions: ,
51
+ layers: [])
52
+ layers.concat ENV['LAYERS'].split(/\:\s/) if ENV['LAYERS']
53
+ extensions.concat ENV['INSTANCE_EXTENSIONS'].split(/\:\s/) if ENV['INSTANCE_EXTENSIONS']
54
+
55
+ if ENV['DEBUG']
56
+ extension_names = self.class.extension_names
57
+ %w(
58
+ VK_EXT_debug_utils
59
+ ).each { |ext_name| extensions << ext_name if extension_names.include?(ext_name) }
60
+
61
+ layer_names = self.class.layer_names
62
+ %w(
63
+ VK_LAYER_LUNARG_standard_validation
64
+ VK_LAYER_LUNARG_parameter_validation
65
+ VK_LAYER_LUNARG_assistant_layer
66
+ VK_LAYER_LUNARG_api_dump
67
+ VK_LAYER_GOOGLE_unique_objects
68
+ VK_LAYER_LUNARG_demo_layer
69
+ VK_LAYER_GOOGLE_threading
70
+ VK_LAYER_LUNARG_monitor
71
+ VK_LAYER_LUNARG_starter_layer
72
+ VK_LAYER_LUNARG_core_validation
73
+ VK_LAYER_LUNARG_object_tracker
74
+ ).each do |layer_name|
75
+ layers << layer_name if layer_names.include?(layer_name)
76
+ end
77
+ end
78
+
79
+ extensions_p = Vulkan.struct("names[#{extensions.size}]" => ['char *name']).malloc
80
+ extensions.each_with_index do |ext, i|
81
+ extname = ext.kind_of?(String) ? ext : ext[:extension_name]
82
+ extensions_p.names[i].name = Fiddle::Pointer[extname.b + "\x00"]
83
+ end
84
+
85
+ layers_p = Vulkan.struct("names[#{layers.size}]" => ['char *name']).malloc
86
+ layers.each_with_index do |layer, i|
87
+ layer_name = layer.kind_of?(String) ? layer : layer[:layer_name]
88
+ layers_p.names[i].name = Fiddle::Pointer[layer_name.b + "\x00"]
89
+ end
90
+
91
+ application_info = VkApplicationInfo.malloc
92
+ application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO
93
+ application_info.pNext = nil
94
+ application_info.pApplicationName = application_name
95
+ application_info.applicationVersion = vk_make_version(application_version)
96
+ application_info.pEngineName = 'vulkan-ruby'
97
+ application_info.engineVersion = vk_make_version(engine_version)
98
+ application_info.apiVersion = vk_make_version(api_version)
99
+
100
+ instance_info = VkInstanceCreateInfo.malloc
101
+ instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
102
+ instance_info.pNext = nil
103
+ instance_info.flags = 0
104
+ instance_info.pApplicationInfo = application_info
105
+ instance_info.enabledLayerCount = layers.size
106
+ instance_info.ppEnabledLayerNames = layers_p
107
+ instance_info.enabledExtensionCount = extensions.size
108
+ instance_info.ppEnabledExtensionNames = extensions_p
109
+
110
+ instance_wrapper = Vulkan.create_value("void *", nil)
111
+ check_result Vulkan[nil, nil].vkCreateInstance(instance_info, nil, instance_wrapper)
112
+ @handle = instance_wrapper.value
113
+ @vk = Vulkan[self, nil]
114
+ hook_debug_utils_callback if extensions.include?('VK_EXT_debug_utils')
115
+ finalize_with @vk, :vkDestroyInstance, @handle, nil
116
+ end
117
+
118
+ def on_log(&cb)
119
+ @log_callback = cb
120
+ end
121
+
122
+ def hook_debug_utils_callback
123
+ _, return_type, param_types = Vulkan.parse_signature('VkBool32 debug_callback(int messageSeverity,' +
124
+ 'int messageType,' +
125
+ 'void *pCallbackData,' +
126
+ 'void *pUserData)')
127
+ @debug_util_callback = Fiddle::Closure::BlockCaller.new(return_type, param_types) do |msg_severity, msg_type, cb_data_addr, user_arg_addr|
128
+ data = VkDebugUtilsMessengerCallbackDataEXT.new(cb_data_addr)
129
+ type = const_to_symbol(msg_type, /^VK_DEBUG_UTILS_MESSAGE_TYPE_(.*?)_BIT_EXT$/)
130
+ severity = const_to_symbol(msg_severity, /^VK_DEBUG_UTILS_MESSAGE_SEVERITY_(.*?)_BIT_EXT$/)
131
+ if @log_callback
132
+ @log_callback.call severity, type, data.pMessage.to_s
133
+ else
134
+ puts ['[UTIL]', "[#{severity}]", "[#{type}]", data.pMessage.to_s].join("\t")
135
+ end
136
+ VK_FALSE # don't bail
137
+ end
138
+
139
+ create_info = VkDebugUtilsMessengerCreateInfoEXT.malloc
140
+ create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT
141
+ create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
142
+ VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
143
+ VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT
144
+ create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
145
+ VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
146
+ VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT
147
+ create_info.pUserData = nil
148
+ create_info.pfnUserCallback = @debug_util_callback
149
+
150
+ callback_p = Vulkan.create_value('void *', nil)
151
+ check_result @vk.vkCreateDebugUtilsMessengerEXT(to_ptr, create_info, nil, callback_p)
152
+ @debug_util_callback_handle = callback_p.value
153
+ finalize_with @vk, :vkDestroyDebugUtilsMessengerEXT, to_ptr, @debug_util_callback_handle, nil
154
+ end
155
+
156
+ def create_window_surface(window)
157
+ WindowSurface.new(self, window)
158
+ end
159
+
160
+ # Returns an array of physical device handles. Use these to query the
161
+ # capabilities of each physical device, and to create logical devices
162
+ # based on the results.
163
+ def physical_device_handles
164
+ @physical_device_handles ||= begin
165
+ # get device count
166
+ device_count_ptr = Vulkan.create_value("uint32_t", 0)
167
+ # check_result func.call(@handle, device_count_ptr, nil)
168
+ check_result @vk.vkEnumeratePhysicalDevices(@handle, device_count_ptr, nil)
169
+ device_count = device_count_ptr.value
170
+ # allocate n devices
171
+ container_struct = Vulkan.struct("handles[#{device_count}]" => ['VkPhysicalDevice handle'])
172
+ container = container_struct.malloc
173
+ # check_result func.call(@handle, device_count_ptr, container)
174
+ check_result @vk.vkEnumeratePhysicalDevices(@handle, device_count_ptr, container)
175
+ container.handles
176
+ end
177
+ end
178
+
179
+ def physical_devices
180
+ @physical_devices ||= physical_device_handles.map { |dev| PhysicalDevice.new(self, dev.handle) }
181
+ end
182
+ end
183
+ end