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,33 @@
1
+ module Vulkan
2
+ class ShaderStage
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :entry_point, :stage, :module_handle
8
+
9
+ def initialize(vk, code: nil,
10
+ file_path: nil,
11
+ entry_point: 'main',
12
+ stage:)
13
+ code ||= File.open(file_path, 'rb') { |file| file.read }
14
+ @vk = vk
15
+ @entry_point = entry_point
16
+ @stage = stage
17
+
18
+ code_p = Fiddle::Pointer.malloc(code.size + 1)
19
+ code_p[0, code.size] = code
20
+ create_info = VkShaderModuleCreateInfo.malloc
21
+ create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
22
+ create_info.codeSize = code.size
23
+ create_info.pCode = code_p
24
+
25
+ module_handle_p = Vulkan.create_value('void *', nil)
26
+ check_result @vk.vkCreateShaderModule(vk.device, create_info, nil, module_handle_p)
27
+ @module_handle = module_handle_p.value
28
+ finalize_with vk, :vkDestroyShaderModule, vk.device, @module_handle, nil
29
+
30
+ @handle = @module_handle
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ module Vulkan
2
+ class Surface
3
+ include Vulkan::Finalizer
4
+
5
+ def initialize(instance, handle)
6
+ @handle = handle
7
+ finalize_with Vulkan[instance, nil], :vkDestroySurfaceKHR, instance.to_ptr, @handle, nil
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,87 @@
1
+ module Vulkan
2
+ class Swapchain
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :extent
8
+ attr_reader :color_space
9
+ attr_reader :format
10
+ attr_reader :image_views
11
+
12
+ def initialize(instance, device, surface:,
13
+ surface_width:,
14
+ surface_height:,
15
+ app_config: {},
16
+ builder_class: Vulkan::SwapchainBuilder,
17
+ image_usage: VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
18
+ image_array_layers: 1,
19
+ sharing_mode: VK_SHARING_MODE_EXCLUSIVE,
20
+ composite_alpha: VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
21
+ clipped: true,
22
+ old_swapchain: nil)
23
+ @vk = Vulkan[instance, device]
24
+
25
+ info = device.physical_device.swapchain_surface_info(surface)
26
+ builder = builder_class.new(info, app_config)
27
+ @extent = { width: builder.width(surface_width), height: builder.height(surface_height) }
28
+
29
+ image_format = builder.format
30
+ @format = image_format[:format]
31
+ @color_space = image_format[:color_space]
32
+
33
+ create_info = VkSwapchainCreateInfoKHR.malloc
34
+ create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
35
+ create_info.surface = surface.to_ptr
36
+ create_info.minImageCount = builder.image_count
37
+ create_info.imageFormat = @format
38
+ create_info.imageColorSpace = @color_space
39
+ create_info.imageExtent.width = @extent[:width]
40
+ create_info.imageExtent.height = @extent[:height]
41
+ create_info.imageArrayLayers = image_array_layers
42
+ create_info.imageUsage = image_usage
43
+ create_info.imageSharingMode = sharing_mode
44
+ create_info.queueFamilyIndexCount = 0
45
+ create_info.pQueueFamilyIndices = nil
46
+ create_info.preTransform = syms_to_surface_transforms(builder.transformation)
47
+ create_info.compositeAlpha = composite_alpha
48
+ create_info.presentMode = sym_to_present_mode(builder.presentation_mode)
49
+ create_info.clipped = clipped ? VK_TRUE : VK_FALSE
50
+ create_info.oldSwapchain = old_swapchain
51
+
52
+ swapchain = Vulkan.create_value("void *", nil)
53
+ check_result @vk.vkCreateSwapchainKHR(device.to_ptr, create_info, nil, swapchain)
54
+ @handle = swapchain.value
55
+ finalize_with @vk, :vkDestroySwapchainKHR, device.to_ptr, @handle, nil
56
+
57
+ image_count_p = Vulkan.create_value('uint32_t', 0)
58
+ check_result @vk.vkGetSwapchainImagesKHR(device.to_ptr, @handle, image_count_p, nil)
59
+ images_p = Vulkan.struct("images[#{image_count_p.value}]" => 'void *handle').malloc
60
+ check_result @vk.vkGetSwapchainImagesKHR(device.to_ptr, @handle, image_count_p, images_p);
61
+ @image_views = images_p.images.map { |i| ImageView.new(@vk, i.handle, sym_to_image_format(@format)) }
62
+
63
+ @image_index_p = Vulkan.create_value('uint32_t', 0)
64
+ end
65
+
66
+ def [](method_name)
67
+ send method_name
68
+ end
69
+
70
+ def width
71
+ @extent[:width]
72
+ end
73
+
74
+ def height
75
+ @extent[:height]
76
+ end
77
+
78
+ def size
79
+ image_views.size
80
+ end
81
+
82
+ def next_image_index(semaphore: nil, fence: nil, timeout: 0xffffffffffffffff)
83
+ @vk.vkAcquireNextImageKHR(@vk.device, to_ptr, timeout, semaphore, fence, @image_index_p)
84
+ @image_index_p.value
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,111 @@
1
+ module Vulkan
2
+ class SwapchainBuilder
3
+ attr_reader :surface_info
4
+ attr_reader :config
5
+
6
+ def initialize(swapchain_surface_info, config = {})
7
+ @surface_info = swapchain_surface_info
8
+ @config = config
9
+ raise 'swapchain not supported' unless usage_supported?
10
+ end
11
+
12
+ # Chooses and returns a swapchain image format from those supported.
13
+ # An override may be specified in
14
+ # `config[:graphics][:swapchain][:image][:format]` and/or
15
+ # `config[:graphics][:swapchain][:image][:color_space]`. The
16
+ # defaults are `:r8g8b8a8_unorm` and `:srgb_nonlinear`, respectively.
17
+ def format
18
+ supported = surface_info.formats
19
+
20
+ # By default use the most widely supported R8 G8 B8 A8 format with
21
+ # nonlinear colorspace.
22
+ preferred_format = { format: :r8g8b8a8_unorm, color_space: :srgb_nonlinear }
23
+
24
+ # If app config specifies an override, and it is supported, then
25
+ # use it.
26
+ if override = config.dig(:graphics, :swapchain, :image)
27
+ preferred_format[:format] = override[:format] if override.key?(:format)
28
+ preferred_format[:color_space] = override[:color_space] if override.key?(:color_space)
29
+ end
30
+
31
+ # If the list contains only one entry with an undefined format then
32
+ # it means that there are no preferred surface formats and any can
33
+ # be chosen.
34
+ return preferred_format if supported.size == 1 && supported[0][:format] == :undefined
35
+
36
+ # Check if the preferred format is supported, and use it if possible
37
+ return preferred_format if supported.include?(preferred_format)
38
+
39
+ # No match found, try to match the format ignoring colorspace
40
+ supported.each { |sup| return sup if sup[:format] == preferred_format[:format] }
41
+
42
+ # No match, return the first format in the list
43
+ return supported.first || raise('no supported swapchain image formats')
44
+ end
45
+
46
+ def presentation_mode
47
+ # :fifo should always be available;
48
+ # :mailbox is the lowest latency V-Sync enabled mode (something like
49
+ # triple-buffering) so use it if available
50
+ supported = surface_info.presentation_modes
51
+ preferred_mode = config.dig(:graphics, :swapchain, :vsync) == false ? :immediate :
52
+ config.dig(:graphics, :swapchain, :presentation_mode)&.to_sym
53
+ if preferred_mode && supported.include?(preferred_mode)
54
+ return preferred_mode
55
+ else
56
+ return :mailbox if supported.include?(:mailbox)
57
+ return :fifo if supported.include?(:fifo)
58
+ return :fifo_relaxed if supported.include?(:fifo_relaxed)
59
+ return :immediate if supported.include?(:immediate)
60
+ return raise('no supported presentation modes (available: %s)' % supported.inspect)
61
+ end
62
+ end
63
+
64
+ def transformation
65
+ return :identity if @surface_info.capabilities[:supported_transforms].include?(:identity)
66
+ return @surface_info.capabilities[:current_transform]
67
+ end
68
+
69
+ def usage_supported?
70
+ usage = @surface_info.capabilities[:supported_usage]
71
+ usage.include?(:transfer_dst)
72
+ end
73
+
74
+ def width(desired_width)
75
+ surface_capabilities = surface_info.capabilities
76
+ desired_width ||= surface_capabilities[:current_extent][:width]
77
+ if desired_width == -1
78
+ desired_width = (config.dig(:graphics, :swapchain, :width)) ||
79
+ (config.dig(:window, :width)) ||
80
+ 640
81
+ end
82
+ desired_width.clamp(surface_capabilities[:min_image_extent][:width],
83
+ surface_capabilities[:max_image_extent][:width])
84
+ end
85
+
86
+ def height(desired_height)
87
+ surface_capabilities = surface_info.capabilities
88
+ desired_height ||= surface_capabilities[:current_extent][:height]
89
+ if desired_height == -1
90
+ desired_height = (config.dig(:graphics, :swapchain, :height)) ||
91
+ (config.dig(:window, :height)) ||
92
+ 640
93
+ end
94
+ desired_height.clamp(surface_capabilities[:min_image_extent][:height],
95
+ surface_capabilities[:max_image_extent][:height])
96
+ end
97
+
98
+ def dimensions(desired_width = nil, desired_height = nil)
99
+ [width(desired_width), height(desired_height)]
100
+ end
101
+
102
+ def image_count
103
+ count = @surface_info.capabilities[:min_image_count] + 1
104
+ if @surface_info.capabilities[:max_image_count] > 0 &&
105
+ count > @surface_info.capabilities[:max_image_count]
106
+ count = @surface_info.capabilities[:max_image_count]
107
+ end
108
+ return count
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,54 @@
1
+ module Vulkan
2
+ class SwapchainSurfaceInfo < Hash
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+
6
+ attr_accessor :builder
7
+
8
+ def initialize(instance, physical_device, surface)
9
+ super()
10
+ @vk = Vulkan[instance, nil]
11
+ @physical_device = physical_device
12
+ @surface = surface
13
+ merge! capabilities: capabilities,
14
+ formats: formats,
15
+ presentation_modes: presentation_modes
16
+ end
17
+
18
+ def presentation_modes
19
+ @presentation_modes ||= begin
20
+ modes_count_p = Vulkan.create_value('uint32_t', 0)
21
+ check_result @vk.vkGetPhysicalDeviceSurfacePresentModesKHR(@physical_device.to_ptr, @surface.to_ptr, modes_count_p, nil)
22
+ modes_p = Vulkan.struct(["VkPresentModeKHR modes[#{modes_count_p.value}]"]).malloc
23
+ check_result @vk.vkGetPhysicalDeviceSurfacePresentModesKHR(@physical_device.to_ptr, @surface.to_ptr, modes_count_p, modes_p)
24
+ modes_p.modes.map { |mode| present_mode_to_sym(mode) }
25
+ end
26
+ end
27
+
28
+ def formats
29
+ @formats ||= begin
30
+ format_count_p = Vulkan.create_value('uint32_t', 0)
31
+ check_result @vk.vkGetPhysicalDeviceSurfaceFormatsKHR(@physical_device.to_ptr, @surface.to_ptr, format_count_p, nil)
32
+ formats_p = Vulkan.struct("formats[#{format_count_p.value}]" => VkSurfaceFormatKHR).malloc
33
+ check_result @vk.vkGetPhysicalDeviceSurfaceFormatsKHR(@physical_device.to_ptr, @surface.to_ptr, format_count_p, formats_p)
34
+ formats_p.formats.map { |fmt| struct_to_hash(fmt) }
35
+ end
36
+ end
37
+
38
+ def capabilities
39
+ @capabilities ||= begin
40
+ capabilities = VkSurfaceCapabilitiesKHR.malloc
41
+ check_result @vk.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(@physical_device.to_ptr, @surface.to_ptr, capabilities)
42
+ capabilities = struct_to_hash(capabilities)
43
+ capabilities[:supported_transforms_flags] = capabilities[:supported_transforms]
44
+ capabilities[:supported_transforms] = flags_to_symbols(capabilities[:supported_transforms_flags], /^VK_SURFACE_TRANSFORM_(.*?)_BIT/)
45
+ capabilities[:current_transform_flags] = capabilities[:current_transform]
46
+ capabilities[:current_transform] = flags_to_symbols(capabilities[:current_transform_flags], /^VK_SURFACE_TRANSFORM_(.*?)_BIT/)
47
+ capabilities[:supported_composite_alpha_flags] = capabilities[:supported_composite_alpha]
48
+ capabilities[:supported_composite_alpha] = flags_to_symbols(capabilities[:supported_composite_alpha_flags], /^VK_COMPOSITE_ALPHA_(.*?)_BIT/)
49
+ capabilities[:supported_usage] = flags_to_symbols(capabilities[:supported_usage_flags], /^VK_IMAGE_USAGE_(.*?)_BIT/)
50
+ capabilities
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module Vulkan
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'vulkan/surface'
2
+
3
+ module Vulkan
4
+ # Provides a handle to an underlying window surface based on an SDL2
5
+ # window (or otherwise, any object which responds to `vk_create_surface`
6
+ # and which returns the integer address of the created surface), and a
7
+ # Vulkan instance.
8
+ class WindowSurface < Surface
9
+ def initialize(instance, window)
10
+ super(instance, window.vk_create_surface(instance.to_ptr.to_i))
11
+ end
12
+ end
13
+ end
@@ -0,0 +1 @@
1
+ require 'vulkan'
data/lib/vulkan.rb ADDED
@@ -0,0 +1,91 @@
1
+ require 'pathname'
2
+ require 'rubygems/version'
3
+ require 'vulkan/platform'
4
+ require 'fiddle_ext'
5
+
6
+ module Vulkan
7
+ extend Fiddle::Importer
8
+ extend Vulkan::Platform
9
+
10
+ class << self
11
+ def root
12
+ Pathname.new(__dir__).join('vulkan')
13
+ end
14
+
15
+ def parse_signature(sig, type_alias = @type_alias)
16
+ super(sig, type_alias)
17
+ end
18
+
19
+ def vulkan_library_candidates
20
+ [
21
+ ENV['PATH_TO_VULKAN'],
22
+ *case os
23
+ when :windows then ['vulkan-1.dll']
24
+ when :osx then ['libvulkan.dylib', 'libvulkan.1.dylib', 'libMoltenVK.dylib']
25
+ when :linux then ['libvulkan.so', 'libvulkan.so.1']
26
+ else []
27
+ end
28
+ ].compact
29
+ end
30
+
31
+ def load_vulkan_library
32
+ candidates = vulkan_library_candidates
33
+ begin
34
+ dlload candidates.shift
35
+ rescue
36
+ retry if candidates.any?
37
+ raise "could not determine vulkan library to load for this OS (#{os.inspect}): try passing PATH_TO_VULKAN"
38
+ end
39
+ end
40
+
41
+ def format_has_stencil_component?(format)
42
+ case format
43
+ when VK_FORMAT_D32_SFLOAT_S8_UINT, :d32_sfloat_s8_uint then true
44
+ when VK_FORMAT_D24_UNORM_S8_UINT, :d24_unorm_s8_uint then true
45
+ else false
46
+ end
47
+ end
48
+
49
+ def num_mip_levels(*sizes)
50
+ Math.log2(sizes.max).floor + 1
51
+ end
52
+ end
53
+
54
+ require 'vulkan/generated'
55
+ require 'vulkan/error'
56
+ end
57
+
58
+ require 'vulkan/version'
59
+ require 'vulkan/checks'
60
+ require 'vulkan/conversions'
61
+ require 'vulkan/finalizer'
62
+ require 'vulkan/framebuffer'
63
+ require 'vulkan/surface'
64
+ require 'vulkan/pipeline'
65
+ require 'vulkan/window_surface'
66
+ require 'vulkan/dispatch_table'
67
+ require 'vulkan/physical_device'
68
+ require 'vulkan/logical_device'
69
+ require 'vulkan/instance'
70
+ require 'vulkan/queue_family'
71
+ require 'vulkan/swapchain'
72
+ require 'vulkan/swapchain_surface_info'
73
+ require 'vulkan/swapchain_builder'
74
+ require 'vulkan/image_view'
75
+ require 'vulkan/shader_stage'
76
+ require 'vulkan/render_pass'
77
+ require 'vulkan/render_pass/subpass'
78
+ require 'vulkan/command_pool'
79
+ require 'vulkan/command_buffer'
80
+ require 'vulkan/semaphore'
81
+ require 'vulkan/fence'
82
+ require 'vulkan/queue'
83
+ require 'vulkan/buffer'
84
+ require 'vulkan/descriptor_pool'
85
+ require 'vulkan/descriptor_set'
86
+ require 'vulkan/descriptor_set_layout'
87
+ require 'vulkan/image'
88
+ require 'vulkan/memory'
89
+ require 'vulkan/buffer_memory'
90
+ require 'vulkan/image_memory'
91
+ require 'vulkan/sampler'
@@ -0,0 +1,29 @@
1
+ examples = []
2
+
3
+ namespace :examples do
4
+ Dir[File.expand_path('../examples/*.rb', __dir__)].each do |filename|
5
+ basename = File.basename(filename, '.rb')
6
+ examples << "examples:#{basename}"
7
+ desc "run the '#{basename}' example script. Influential vars: DEBUG=1, CALL_TRACE=1, MAX_FRAMES=N"
8
+ task basename do
9
+ ENV['COVERAGE'] = basename
10
+ sh 'bundle', 'exec', 'ruby', filename
11
+ end
12
+
13
+ if basename[/^(.*?)_/]
14
+ # desc "alias for #{basename}"
15
+ task $1 => "examples:#{basename}"
16
+ end
17
+ end
18
+ end
19
+
20
+ desc 'Run all examples. Influential vars: DEBUG=1, CALL_TRACE=1, MAX_FRAMES=N'
21
+ task examples: examples
22
+
23
+ task :default do
24
+ # also run all examples as part of the tests
25
+ ENV['MAX_FRAMES'] = '5'
26
+ ENV['DEBUG'] = '1'
27
+ Rake::Task[:examples].invoke
28
+ puts 'Execution successful.'
29
+ end
data/tasks/fetch.rake ADDED
@@ -0,0 +1,9 @@
1
+ desc 'fetch latest version of vk.xml'
2
+ task :fetch do
3
+ require 'open-uri'
4
+ require 'openssl'
5
+ require 'vulkan/version'
6
+ open(vk_xml_path, 'wb') do |file|
7
+ file << open("https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE).read
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ namespace :generate do
2
+ desc 'generate commands'
3
+ task :commands do
4
+ core_features = vk_xml.css("feature[name=VK_VERSION_1_0] command").map { |command| command.attributes['name'].to_s }
5
+ addl_features = vk_xml.css("feature command").map { |command| command.attributes['name'].to_s } - core_features
6
+ instance_functions = vk_xml.css("require[comment='Device initialization'] command").map { |command| command.attributes['name'].to_s }
7
+
8
+ open(generate_dir.join('commands.rb'), 'w') do |f|
9
+ f.puts header_comment
10
+ f.puts
11
+ f.puts 'module Vulkan'
12
+ aliases = []
13
+ max_name_len = vk_xml.css("commands command proto").map { |name| name.text.size }.max
14
+ vk_xml.xpath('//commands/command').each do |command|
15
+ if command.attributes['name'] && command.attributes['alias']
16
+ name = command.attributes['name'].to_s
17
+ command_alias = command.attributes['alias'].to_s
18
+ aliases << [name, command_alias]
19
+ # f.puts " def #{name}(*args); #{command_alias}(*args); end"
20
+ else
21
+ name = command.css('proto name').text
22
+ next if name == 'vkGetInstanceProcAddr'
23
+ proto = command.xpath('proto').text
24
+ params = command.xpath('param').map(&:text).join(', ')
25
+ if proto.to_s.strip.size == 0 || params.to_s.strip.size == 0
26
+ puts "WARN: unhandled command: #{proto}(#{params}) (#{command.to_s})"
27
+ else
28
+ # if instance_functions.include?(name) || params[/^vkInstance\s/]
29
+ # f.puts " lookup_instance_function #{proto.inspect.ljust(max_name_len+2)}, #{params.inspect}"
30
+ # else
31
+ # f.puts " lookup_device_function #{proto.inspect.ljust(max_name_len+2)}, #{params.inspect}"
32
+ # end
33
+ f.puts " register_function #{proto.inspect.ljust(max_name_len+2)}, #{params.inspect}"
34
+ end
35
+ end
36
+ # <command successcodes="VK_SUCCESS" errorcodes="VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_INITIALIZATION_FAILED,VK_ERROR_LAYER_NOT_PRESENT,VK_ERROR_EXTENSION_NOT_PRESENT,VK_ERROR_INCOMPATIBLE_DRIVER">
37
+ # <proto><type>VkResult</type> <name>vkCreateInstance</name></proto>
38
+ # <param>const <type>VkInstanceCreateInfo</type>* <name>pCreateInfo</name></param>
39
+ # <param optional="true">const <type>VkAllocationCallbacks</type>* <name>pAllocator</name></param>
40
+ # <param><type>VkInstance</type>* <name>pInstance</name></param>
41
+ # </command>
42
+ end
43
+ # if aliases.any?
44
+ # f.puts " class << self"
45
+ # aliases.each { |a| f.puts " alias #{a[0].ljust(max_name_len)} #{a[1]}"}
46
+ # f.puts " end"
47
+ # end
48
+ f.puts 'end'
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,43 @@
1
+ namespace :generate do
2
+ desc 'generate enums'
3
+ task :enums do
4
+ open(generate_dir.join('enums.rb'), 'w') do |f|
5
+ f.puts header_comment
6
+ f.puts
7
+ f.puts 'module Vulkan'
8
+ vk_xml.xpath('//types/type').each do |type|
9
+ if type.attributes['category']&.value == 'enum'
10
+ name = type.attributes['name']&.value
11
+ raise "enum has no name: #{type.to_s.inspect}" unless name
12
+ f.puts " typealias #{name.inspect}, 'int'"
13
+ end
14
+ end
15
+
16
+ enums.tap do |processed_enums|
17
+ vk_xml.xpath('//enums/enum').each do |enum|
18
+ name = enum.attributes['name']&.value
19
+ value = enum.attributes['value']&.value
20
+ bitpos = enum.attributes['bitpos']&.value
21
+ alias_name = enum.attributes['alias']&.value
22
+ raise "enum has no name: #{enum.to_s.inspect}" unless name
23
+ if alias_name
24
+ raise "enum alias has not been processed yet: #{enum.to_s.inspect}" unless processed_enums[alias_name]
25
+ f.puts " #{name} = #{processed_enums[alias_name]}"
26
+ processed_enums[name] = processed_enums[alias_name]
27
+ else
28
+ if bitpos
29
+ value = (1 << bitpos.to_i)
30
+ else
31
+ value = value.sub(/(\d+)[fUL]+/, '\1') # '1.0f' => '1.0', '100U' => '100'
32
+ end
33
+ raise "enum has no value: #{enum.to_s.inspect}" unless value
34
+ f.puts " #{name} = #{value}"
35
+ processed_enums[name] = value
36
+ end
37
+ end
38
+ end
39
+
40
+ f.puts 'end'
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,35 @@
1
+ def enum_offset(extnum, offset, dir = 1)
2
+ base_value = 1000000000
3
+ range_size = 1000
4
+ (base_value + (extnum - 1) * range_size + offset) * dir
5
+ end
6
+
7
+ namespace :generate do
8
+ desc 'generate extension enums, types, etc'
9
+ task :extensions do
10
+ rm_rf generate_dir.join('extensions')
11
+ mkdir_p generate_dir.join('extensions')
12
+ File.open(generate_dir.join('extensions.rb'), 'w') do |extout|
13
+ extout.puts header_comment
14
+ extout.puts
15
+
16
+ vk_xml.css('extension').each do |extension|
17
+ extout.puts "require 'vulkan/generated/extensions/#{extension['name'].downcase}'"
18
+ extnum = extension['number'].to_i
19
+ File.open(generate_dir.join('extensions/%s.rb' % extension['name'].downcase), 'w') do |f|
20
+ f.puts header_comment
21
+ f.puts
22
+ f.puts 'module Vulkan'
23
+
24
+ extension.css('enum').each do |enum|
25
+ dir = enum['dir'] == '-' ? -1 : enum['dir']
26
+ value = enum['value'] || enum_offset(extnum, enum['offset'].to_i, (dir || 1).to_i)
27
+ f.puts " #{enum['name']} = #{value} unless defined?(#{enum['name']})"
28
+ end
29
+
30
+ f.puts 'end'
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end