vulkan-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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