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,511 @@
1
+ module Vulkan
2
+ module Conversions
3
+ IMAGE_FORMATS = {}
4
+ IMAGE_TILING = {}
5
+ DESCRIPTOR_TYPES = {}
6
+ BUFFER_USAGE_BITS = {}
7
+ IMAGE_USAGE_BITS = {}
8
+ IMAGE_TYPES = {}
9
+ SHADER_STAGE_BITS = {}
10
+ SHARING_MODES = {}
11
+ IMAGE_CREATE_BITS = {}
12
+ PIPELINE_STAGE_BITS = {}
13
+ DEPENDENCY_FLAG_BITS = {}
14
+ IMAGE_ASPECT_BITS = {}
15
+ ACCESS_MASK_BITS = {}
16
+ FILTERS = {}
17
+ SAMPLER_ADDRESS_MODES = {}
18
+ SAMPLER_MIPMAP_MODES = {}
19
+ COMPARE_OPS = {}
20
+ BORDER_COLORS = {}
21
+ MEMORY_PROPERTIES = {}
22
+ FORMAT_FEATURE_BITS = {}
23
+ VERTEX_INPUT_RATES = {}
24
+ PRESENT_MODES = {}
25
+ SURFACE_TRANSFORMS = {}
26
+ DYNAMIC_STATES = {}
27
+
28
+ Vulkan.constants.each do |name|
29
+ output = case name.to_s
30
+ when /^VK_FORMAT_FEATURE_(.*?)_BIT/ then FORMAT_FEATURE_BITS
31
+ when /^VK_FORMAT_(.*?)$/ then IMAGE_FORMATS
32
+ when /^VK_IMAGE_TILING_(.*?)$/ then IMAGE_TILING
33
+ when /^VK_DESCRIPTOR_TYPE_(.*?)$/ then DESCRIPTOR_TYPES
34
+ when /^VK_BUFFER_USAGE_(.*?)_BIT/ then BUFFER_USAGE_BITS
35
+ when /^VK_IMAGE_USAGE_(.*?)_BIT/ then IMAGE_USAGE_BITS
36
+ when /^VK_IMAGE_TYPE_(.*?)$/ then IMAGE_TYPES
37
+ when /^VK_IMAGE_ASPECT_(.*?)_BIT/ then IMAGE_ASPECT_BITS
38
+ when /^VK_SHADER_STAGE_(.*?)(?:_BIT|$)/ then SHADER_STAGE_BITS
39
+ when /^VK_SHARING_MODE_(.*?)$/ then SHARING_MODES
40
+ when /^VK_IMAGE_CREATE_(.*?)_BIT/ then IMAGE_CREATE_BITS
41
+ when /^VK_PIPELINE_STAGE_(.*?)_BIT/ then PIPELINE_STAGE_BITS
42
+ when /^VK_DEPENDENCY_(.*?)_BIT/ then DEPENDENCY_FLAG_BITS
43
+ when /^VK_ACCESS_(.*?)_BIT/ then ACCESS_MASK_BITS
44
+ when /^VK_FILTER_(.*?)$/ then FILTERS
45
+ when /^VK_SAMPLER_ADDRESS_MODE_(.*?)$/ then SAMPLER_ADDRESS_MODES
46
+ when /^VK_COMPARE_OP_(.*?)$/ then COMPARE_OPS
47
+ when /^VK_BORDER_COLOR_(.*?)$/ then BORDER_COLORS
48
+ when /^VK_SAMPLER_MIPMAP_MODE_(.*?)$/ then SAMPLER_MIPMAP_MODES
49
+ when /^VK_MEMORY_PROPERTY_(.*?)_BIT/ then MEMORY_PROPERTIES
50
+ when /^VK_VERTEX_INPUT_RATE_(.*?)$/ then VERTEX_INPUT_RATES
51
+ when /^VK_PRESENT_MODE_(.*?)(?:_KHR)?$/ then PRESENT_MODES
52
+ when /^VK_SURFACE_TRANSFORM_(.*?)_BIT/ then SURFACE_TRANSFORMS
53
+ when /^VK_DYNAMIC_STATE_(.*)/ then DYNAMIC_STATES
54
+ else next
55
+ end
56
+ key = $1.downcase
57
+ raise 'BUG: two identical constant names? %s => %s' % [name, key] if output.include?(key)
58
+ output[key.to_sym] = output[key] = Vulkan.const_get(name)
59
+ end
60
+
61
+ def sym_to_present_mode(sym)
62
+ PRESENT_MODES[sym]
63
+ end
64
+
65
+ def present_mode_to_sym(mode)
66
+ PRESENT_MODES.key(mode)&.to_sym
67
+ end
68
+
69
+ def sym_to_samples(sym)
70
+ # 4 => 4 because VK_SAMPLE_COUNT_4_BIT == 4.
71
+ # But we'll keep this method here in case that changes or is not always
72
+ # true.
73
+ sym
74
+ end
75
+
76
+ def sym_to_dynamic_state(sym)
77
+ DYNAMIC_STATES[sym]
78
+ end
79
+
80
+ def syms_to_surface_transforms(sym)
81
+ syms_to_flags sym, SURFACE_TRANSFORMS
82
+ end
83
+
84
+ def sym_to_val(sym, vals)
85
+ vals[sym] || sym
86
+ end
87
+
88
+ def syms_to_flags(syms, bits)
89
+ [syms].flatten.reduce(0) { |bit, sym| bit | sym_to_val(sym, bits) }
90
+ end
91
+
92
+ def flags_to_syms(flags, bits)
93
+ return flags if flags.kind_of?(Array)
94
+ return [flags] if flags.kind_of?(Symbol)
95
+ bits.reduce([]) do |syms, (name, bit)|
96
+ syms << name if flags & bit != 0
97
+ syms
98
+ end
99
+ syms
100
+ end
101
+
102
+ def sym_to_vertex_input_rate(sym)
103
+ sym_to_val(sym, VERTEX_INPUT_RATES)
104
+ end
105
+
106
+ def sym_to_compare_op(sym)
107
+ sym_to_val(sym, COMPARE_OPS)
108
+ end
109
+
110
+ def syms_to_buffer_usage_flags(syms)
111
+ syms_to_flags(syms, BUFFER_USAGE_BITS)
112
+ end
113
+
114
+ def buffer_usage_flags_to_syms(bits)
115
+ flags_to_syms(bits, BUFFER_USAGE_BITS)
116
+ end
117
+
118
+ def syms_to_format_feature_flags(syms)
119
+ syms_to_flags(syms, FORMAT_FEATURE_BITS)
120
+ end
121
+
122
+ def syms_to_access_mask(syms)
123
+ syms_to_flags(syms, ACCESS_MASK_BITS)
124
+ end
125
+
126
+ def syms_to_memory_properties(syms)
127
+ syms_to_flags(syms, MEMORY_PROPERTIES)
128
+ end
129
+
130
+ def sym_to_border_color(sym)
131
+ sym_to_val(sym, BORDER_COLORS)
132
+ end
133
+
134
+ def bool_to_vk(bool)
135
+ bool ? VK_TRUE : VK_FALSE
136
+ end
137
+
138
+ def syms_to_pipeline_stage_flags(syms)
139
+ syms_to_flags(syms, PIPELINE_STAGE_BITS)
140
+ end
141
+
142
+ def syms_to_image_aspect_flags(syms)
143
+ syms_to_flags(syms, IMAGE_ASPECT_BITS)
144
+ end
145
+
146
+ def syms_to_dependency_flags(syms)
147
+ syms_to_flags(syms, DEPENDENCY_FLAG_BITS)
148
+ end
149
+
150
+ def syms_to_image_create_flags(syms)
151
+ syms_to_flags(syms, IMAGE_CREATE_BITS)
152
+ end
153
+
154
+ def sym_to_filter(sym)
155
+ sym_to_val sym, FILTERS
156
+ end
157
+
158
+ def sym_to_sampler_address_mode(sym)
159
+ sym_to_val sym, SAMPLER_ADDRESS_MODES
160
+ end
161
+
162
+ def sym_to_sampler_mipmap_mode(sym)
163
+ sym_to_val sym, SAMPLER_MIPMAP_MODES
164
+ end
165
+
166
+ def sym_to_image_tiling(sym)
167
+ sym_to_val sym, IMAGE_TILING
168
+ end
169
+
170
+ def syms_to_image_usage_flags(syms)
171
+ syms_to_flags(syms, IMAGE_USAGE_BITS)
172
+ end
173
+
174
+ def sym_to_image_format(sym)
175
+ sym_to_val sym, IMAGE_FORMATS
176
+ end
177
+
178
+ alias sym_to_format sym_to_image_format
179
+
180
+ def sym_to_image_type(sym)
181
+ # can't let it be a number because if it is numeric then it might
182
+ # need to be passed-through without transformation.
183
+ sym_to_val sym, IMAGE_TYPES
184
+ end
185
+
186
+ def sym_to_sharing_mode(sym)
187
+ sym_to_val sym, SHARING_MODES
188
+ end
189
+
190
+ def syms_to_descriptor_set_layout_type_flags(syms)
191
+ flags = 0
192
+ syms.each do |sym|
193
+ flags |= case sym
194
+ when :push then VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
195
+ when :update_after_bind_pool then VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT
196
+ else sym
197
+ end
198
+ end
199
+ flags
200
+ end
201
+
202
+ def sym_to_descriptor_type(sym)
203
+ DESCRIPTOR_TYPES[sym] || sym
204
+ end
205
+
206
+ def syms_to_shader_stage_flags(syms)
207
+ syms_to_flags syms, SHADER_STAGE_BITS
208
+ end
209
+
210
+ def sym_to_subpass_contents(sym)
211
+ case sym
212
+ when :inline then VK_SUBPASS_CONTENTS_INLINE
213
+ when :secondary, :secondary_command_buffers then VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS
214
+ else sym
215
+ end
216
+ end
217
+
218
+ def sym_to_command_buffer_level(sym)
219
+ case sym
220
+ when :primary then VK_COMMAND_BUFFER_LEVEL_PRIMARY
221
+ when :secondary then VK_COMMAND_BUFFER_LEVEL_SECONDARY
222
+ else sym
223
+ end
224
+ end
225
+
226
+ def sym_to_command_buffer_usage(sym)
227
+ case sym
228
+ when :simultaneous then VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT
229
+ when :one_time_submit then VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
230
+ when :render_pass_continue then VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
231
+ else sym
232
+ end
233
+ end
234
+
235
+ def sym_to_index_type(sym)
236
+ case sym
237
+ when :uint16 then VK_INDEX_TYPE_UINT16
238
+ when :uint32 then VK_INDEX_TYPE_UINT32
239
+ else sym
240
+ end
241
+ end
242
+
243
+ def queue_family_to_index(family)
244
+ case family
245
+ when nil, :ignored then VK_QUEUE_FAMILY_IGNORED
246
+ when Numeric then family
247
+ when Hash then queue_family_to_index(family[:index])
248
+ else raise ArgumentError, 'queue family must be :ignored, a number, or a hash containing :index'
249
+ end
250
+ end
251
+
252
+ def sym_to_blend_factor(sym)
253
+ case sym
254
+ when 0, :zero then VK_BLEND_FACTOR_ZERO
255
+ when 1, :one then VK_BLEND_FACTOR_ONE
256
+ when :src_color then VK_BLEND_FACTOR_SRC_COLOR
257
+ when :one_minus_src_color then VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR
258
+ when :dst_color then VK_BLEND_FACTOR_DST_COLOR
259
+ when :one_minus_dst_color then VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR
260
+ when :src_alpha then VK_BLEND_FACTOR_SRC_ALPHA
261
+ when :one_minus_src_alpha then VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA
262
+ when :dst_alpha then VK_BLEND_FACTOR_DST_ALPHA
263
+ when :one_minus_dst_alpha then VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA
264
+ when :constant_color then VK_BLEND_FACTOR_CONSTANT_COLOR
265
+ when :one_minus_constant_color then VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR
266
+ when :constant_alpha then VK_BLEND_FACTOR_CONSTANT_ALPHA
267
+ when :one_minus_constant_alpha then VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA
268
+ when :src_alpha_saturate then VK_BLEND_FACTOR_SRC_ALPHA_SATURATE
269
+ when :src1_color then VK_BLEND_FACTOR_SRC1_COLOR
270
+ when :one_minus_src1_color then VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR
271
+ when :src1_alpha then VK_BLEND_FACTOR_SRC1_ALPHA
272
+ when :one_minus_src1_alpha then VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA
273
+ else sym
274
+ end
275
+ end
276
+
277
+ def sym_to_blend_op(sym)
278
+ case sym
279
+ when :add then VK_BLEND_OP_ADD
280
+ when :subtract then VK_BLEND_OP_SUBTRACT
281
+ when :reverse_subtract then VK_BLEND_OP_REVERSE_SUBTRACT
282
+ when :min then VK_BLEND_OP_MIN
283
+ when :max then VK_BLEND_OP_MAX
284
+ else sym
285
+ end
286
+ end
287
+
288
+ def sym_to_topology(sym)
289
+ case sym
290
+ when :triangle, :triangles, :triangle_list then VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
291
+ when :point, :points, :point_list then VK_PRIMITIVE_TOPOLOGY_POINT_LIST
292
+ when :line, :lines, :line_list then VK_PRIMITIVE_TOPOLOGY_LINE_LIST
293
+ when :line_strip then VK_PRIMITIVE_TOPOLOGY_LINE_STRIP
294
+ when :triangle_strip then VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
295
+ else sym
296
+ end
297
+ end
298
+
299
+ def sym_to_polygon_mode(sym)
300
+ case sym
301
+ when :fill then VK_POLYGON_MODE_FILL
302
+ when :line then VK_POLYGON_MODE_LINE
303
+ when :point then VK_POLYGON_MODE_POINT
304
+ else sym
305
+ end
306
+ end
307
+
308
+ def sym_to_cull_mode(sym)
309
+ case sym
310
+ when :back then VK_CULL_MODE_BACK_BIT
311
+ when :front then VK_CULL_MODE_FRONT_BIT
312
+ when :front_and_back then VK_CULL_MODE_FRONT_AND_BACK
313
+ when :none, nil then VK_CULL_MODE_NONE
314
+ else sym
315
+ end
316
+ end
317
+
318
+ def sym_to_front_face(sym)
319
+ case sym
320
+ when :clockwise then VK_FRONT_FACE_CLOCKWISE
321
+ when :counter_clockwise then VK_FRONT_FACE_COUNTER_CLOCKWISE
322
+ else sym
323
+ end
324
+ end
325
+
326
+ def sym_to_color_component_bit(sym)
327
+ case sym
328
+ when :r, :red then VK_COLOR_COMPONENT_R_BIT
329
+ when :g, :green then VK_COLOR_COMPONENT_G_BIT
330
+ when :b, :blue then VK_COLOR_COMPONENT_B_BIT
331
+ when :a, :alpha then VK_COLOR_COMPONENT_A_BIT
332
+ else sym
333
+ end
334
+ end
335
+
336
+ def sym_to_load_op(sym)
337
+ case sym
338
+ when :load then VK_ATTACHMENT_LOAD_OP_LOAD
339
+ when :clear then VK_ATTACHMENT_LOAD_OP_CLEAR
340
+ when :dont_care, nil then VK_ATTACHMENT_LOAD_OP_DONT_CARE
341
+ else sym
342
+ end
343
+ end
344
+
345
+ def sym_to_store_op(sym)
346
+ case sym
347
+ when :store then VK_ATTACHMENT_STORE_OP_STORE
348
+ when :dont_care, nil then VK_ATTACHMENT_STORE_OP_DONT_CARE
349
+ else sym
350
+ end
351
+ end
352
+
353
+ def sym_to_image_layout(sym)
354
+ case sym
355
+ when :undefined, nil, :any
356
+ VK_IMAGE_LAYOUT_UNDEFINED
357
+ when :general
358
+ VK_IMAGE_LAYOUT_GENERAL
359
+ when :color_optimal, :color, :color_attachment_optimal
360
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
361
+ when :stencil_optimal, :depth_optimal, :depth_stencil_optimal, :depth_stencil_attachment_optimal,
362
+ :stencil, :depth, :depth_stencil, :depth_stencil_attachment
363
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
364
+ when :stencil_read_only_optimal, :stencil_ro_optimal, :stencil_read_only, :stencil_ro,
365
+ :depth_read_only_optimal, :depth_ro_optimal, :depth_read_only, :depth_ro,
366
+ :depth_stencil_ro_optimal, :depth_stencil_read_only, :depth_stencil_ro
367
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
368
+ when :shader_read_only_optimal, :shader_ro_optimal, :shader_read_only, :shader_ro
369
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
370
+ when :transfer_src_optimal, :transfer_src, :src_optimal
371
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
372
+ when :transfer_dst_optimal, :transfer_dst, :dst_optimal
373
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
374
+ when :preinitialized
375
+ VK_IMAGE_LAYOUT_PREINITIALIZED
376
+ when :present_src, :presentation_src, :presentment_src
377
+ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
378
+ else sym
379
+ end
380
+ end
381
+
382
+ def sym_to_pipeline_bind_point(sym)
383
+ case sym
384
+ when :graphics then VK_PIPELINE_BIND_POINT_GRAPHICS
385
+ when :compute then VK_PIPELINE_BIND_POINT_COMPUTE
386
+ else sym
387
+ end
388
+ end
389
+
390
+ def num_to_samples(i)
391
+ case i
392
+ when 1 then VK_SAMPLE_COUNT_1_BIT
393
+ when 2 then VK_SAMPLE_COUNT_2_BIT
394
+ when 4 then VK_SAMPLE_COUNT_4_BIT
395
+ when 8 then VK_SAMPLE_COUNT_8_BIT
396
+ when 16 then VK_SAMPLE_COUNT_16_BIT
397
+ when 32 then VK_SAMPLE_COUNT_32_BIT
398
+ when 64 then VK_SAMPLE_COUNT_64_BIT
399
+ else i
400
+ end
401
+ end
402
+
403
+ def array_of_uint32s(ary)
404
+ return nil if ary.nil? || ary.empty?
405
+ size = ary.size * 4
406
+ ints = Fiddle::Pointer.malloc(size)
407
+ ints[0, size] = ary.pack("L")
408
+ ints
409
+ end
410
+
411
+ def array_of_structures(ary)
412
+ return nil if ary.nil? || ary.empty?
413
+ size = ary.map { |struct| struct.to_ptr.size }.sum
414
+ pointers = Fiddle::Pointer.malloc(size)
415
+ raise ArgumentError, "size is 0?, #{ary}" if size == 0
416
+ offset = 0
417
+ ary.each_with_index do |addr, i|
418
+ (pointers + offset).copy_from(addr.to_ptr)
419
+ offset += addr.to_ptr.size
420
+ end
421
+ pointers
422
+ end
423
+
424
+ def array_of_pointers(ary, pointers = nil)
425
+ return nil if ary.nil? || ary.empty?
426
+ pointers ||= Fiddle::Pointer.malloc(ary.size * Fiddle::SIZEOF_VOIDP)
427
+ ary.each_with_index do |ptr, i|
428
+ mem = [ptr.to_ptr.to_i].pack(Fiddle::PackInfo::PACK_MAP[Fiddle::TYPE_VOIDP])
429
+ pointers[i * Fiddle::SIZEOF_VOIDP, Fiddle::SIZEOF_VOIDP] = mem
430
+ end
431
+ pointers
432
+ end
433
+
434
+ # Converts a byte array (array of numbers) representing a null-terminated
435
+ # C-string into a Ruby string.
436
+ def cstr_to_rbstr(byte_array_or_ptr)
437
+ case byte_array_or_ptr
438
+ when Fiddle::Pointer then byte_array_or_ptr.to_s
439
+ else byte_array_or_ptr.pack('C*').sub(/\x00*\z/, '')
440
+ end
441
+ end
442
+
443
+ # Takes a version string and constructs a Vulkan packed version number
444
+ # from it.
445
+ def vk_make_version(version)
446
+ version = Gem::Version.new(version)
447
+ major, minor, patch = *version.segments
448
+ (((major) << 22) | ((minor || 0) << 12) | (patch || 0))
449
+ end
450
+
451
+ # returns a Gem::Version from the specified numeric Vulkan packed version
452
+ # number.
453
+ def vk_parse_version(version)
454
+ major = (version >> 22) & 0x3ff
455
+ minor = (version >> 12) & 0x3ff
456
+ patch = (version ) & 0xfff
457
+ Gem::Version.new([major, minor, patch].join('.'))
458
+ end
459
+
460
+ # Using the specified regular expression, scans the list of Vulkan
461
+ # constants, looking for the first constant whose name matches the regular
462
+ # expression AND whose value matches the given value. The return value is
463
+ # the first regex group (`$1`) from the match, converted to a symbol.
464
+ def const_to_symbol(val, rx)
465
+ Vulkan.constants.each do |konst|
466
+ if konst.to_s[rx]
467
+ return $1.downcase.to_sym if val == Vulkan.const_get(konst)
468
+ end
469
+ end
470
+ val
471
+ end
472
+
473
+ # Performs similarly to #const_to_symbol, but returns an array of symbols
474
+ # for a set of matching flag names, rather than for a single value.
475
+ def flags_to_symbols(val, rx)
476
+ [].tap do |ary|
477
+ Vulkan.constants.each do |konst|
478
+ if konst.to_s[rx]
479
+ flag_value = Vulkan.const_get(konst)
480
+ ary << $1.downcase.to_sym if val & flag_value > 0
481
+ end
482
+ end
483
+ end
484
+ end
485
+
486
+ # Converts a Fiddle/FFI memory struct into a simple Ruby hash, mostly for
487
+ # happier debugging.
488
+ def struct_to_hash(struct, initial = {})
489
+ struct.class.members.each_with_index.inject(initial) do |hash, (member, index)|
490
+ member = member[0] if member.kind_of?(Array)
491
+ member_name = member.gsub(/[0-9A-Z]+/) { |x| "_#{x.downcase}" }.to_sym
492
+ type = struct.class.types[index]
493
+ hash.tap do |h|
494
+ val = struct.send(member)
495
+ val = struct_to_hash(val) if val.respond_to?(:to_ptr) && !val.kind_of?(Array)
496
+ if val.kind_of?(Array)
497
+ val = val.map do |v|
498
+ if v.respond_to?(:to_ptr) && v.to_ptr.kind_of?(Fiddle::CStructEntity)
499
+ struct_to_hash(v)
500
+ else
501
+ v
502
+ end
503
+ end
504
+ end
505
+ h[member_name] = val
506
+ h[member_name] = cstr_to_rbstr(h[member_name]) if type.kind_of?(Array) && type[0] == Fiddle::TYPE_CHAR
507
+ end
508
+ end
509
+ end
510
+ end
511
+ end
@@ -0,0 +1,45 @@
1
+ module Vulkan
2
+ class DescriptorPool
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ def initialize(vk, flags: VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, max_sets:, pool_sizes:)
8
+ @vk = vk
9
+ @flags = flags
10
+ pool_info = VkDescriptorPoolCreateInfo.malloc
11
+ pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO
12
+ pool_info.poolSizeCount = pool_sizes.size
13
+ pool_info.pPoolSizes = array_of_structures(pool_sizes.map { |info| build_pool_size(**info) })
14
+ pool_info.flags = @flags
15
+ pool_info.maxSets = max_sets
16
+ handle_p = Vulkan.create_value('VkDescriptorPool')
17
+ check_result @vk.vkCreateDescriptorPool(@vk.device, pool_info, nil, handle_p)
18
+ @handle = handle_p.value
19
+ finalize_with @vk, :vkDestroyDescriptorPool, @vk.device, @handle, nil
20
+ end
21
+
22
+ def descriptor_sets_freeable?
23
+ @flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT == VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
24
+ end
25
+
26
+ def alloc(layouts:)
27
+ count = layouts.size
28
+ alloc_info = VkDescriptorSetAllocateInfo.malloc
29
+ alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO
30
+ alloc_info.descriptorPool = to_ptr
31
+ alloc_info.descriptorSetCount = count
32
+ alloc_info.pSetLayouts = array_of_structures(layouts.map { |layout| Vulkan.create_value('void *', layout.to_ptr.to_i) })
33
+ sets_p = Vulkan.struct(['VkDescriptorSet sets[%d]' % count]).malloc
34
+ check_result @vk.vkAllocateDescriptorSets(@vk.device, alloc_info, sets_p)
35
+ count.times.map { |i| Vulkan::DescriptorSet.new(@vk, self, layouts[i], sets_p.sets[i], descriptor_sets_freeable?) }
36
+ end
37
+
38
+ def build_pool_size(type:, count:)
39
+ VkDescriptorPoolSize.malloc.tap do |pool_size|
40
+ pool_size.type = sym_to_descriptor_type(type)
41
+ pool_size.descriptorCount = count
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,86 @@
1
+ module Vulkan
2
+ class DescriptorSet
3
+ include Vulkan::Conversions
4
+ include Vulkan::Finalizer
5
+
6
+ class DescriptorWrite
7
+ include Vulkan::Conversions
8
+
9
+ def initialize(owner, layout)
10
+ @changed = false
11
+ @writer = VkWriteDescriptorSet.malloc
12
+ @writer.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
13
+ @writer.dstSet = owner.to_ptr
14
+ @writer.dstBinding = layout.binding
15
+ @writer.dstArrayElement = 0
16
+ @writer.descriptorType = layout.descriptorType
17
+ @writer.descriptorCount = layout.descriptorCount
18
+ @writer.pBufferInfo = nil
19
+ @writer.pImageInfo = nil
20
+ @writer.pTexelBufferView = nil
21
+ end
22
+
23
+ def set_buffer(buffer, offset: 0, range: buffer.size, array_element: 0)
24
+ @changed = true
25
+ @info = VkDescriptorBufferInfo.malloc
26
+ @info.buffer = buffer.to_ptr
27
+ @info.offset = offset
28
+ @info.range = range
29
+ @writer.pImageInfo = @writer.pTexelBufferView = nil
30
+ @writer.pBufferInfo = @info
31
+ @writer.dstArrayElement = array_element
32
+ end
33
+
34
+ def set_image_view_and_sampler(image_view, sampler, layout: :shader_read_only_optimal, array_element: 0)
35
+ @changed = true
36
+ @info = VkDescriptorImageInfo.malloc
37
+ @info.imageLayout = sym_to_image_layout(layout)
38
+ @info.imageView = image_view.to_ptr
39
+ @info.sampler = sampler.to_ptr
40
+ @writer.pBufferInfo = @writer.pTexelBufferView = nil
41
+ @writer.pImageInfo = @info
42
+ @writer.dstArrayElement = array_element
43
+ end
44
+
45
+ def to_ptr
46
+ @writer.to_ptr
47
+ end
48
+
49
+ def changed?
50
+ @changed
51
+ end
52
+ end
53
+
54
+ def initialize(vk, pool, layout, handle, freeable)
55
+ @vk = vk
56
+ @handle = handle
57
+ if freeable
58
+ handle_p = Vulkan.create_value('void *', handle)
59
+ finalize_with vk, :vkFreeDescriptorSets, vk.device, pool, 1, handle_p
60
+ end
61
+
62
+ @descriptor_writes = layout.descriptors.each_with_index.map do |desc_layout, i|
63
+ DescriptorWrite.new(self, desc_layout)
64
+ end
65
+ end
66
+
67
+ def [](index)
68
+ @descriptor_writes[index]
69
+ end
70
+
71
+ def commit
72
+ writes = @descriptor_writes.select { |write| write.changed? }
73
+ return unless writes.any?
74
+ writes_p = array_of_structures(writes)
75
+ @vk.vkUpdateDescriptorSets(@vk.device, writes.size, writes_p, 0, nil)
76
+ end
77
+
78
+ def update_texel_view(*, **)
79
+ raise NotImplemented
80
+ end
81
+
82
+ def update_image(image)
83
+ raise NotImplemented
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,39 @@
1
+ module Vulkan
2
+ class DescriptorSetLayout
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :descriptors
8
+ attr_reader :types
9
+
10
+ def initialize(vk, *types, descriptors:)
11
+ @vk = vk
12
+ @types = types
13
+ @descriptors = descriptors.map { |d| build_descriptor(**d) }
14
+ value_p = Vulkan.create_value('VkDescriptorSetLayout', nil)
15
+ check_result @vk.vkCreateDescriptorSetLayout(@vk.device, build_layout_info, nil, value_p)
16
+ @handle = value_p.value
17
+ finalize_with @vk, :vkDestroyDescriptorSetLayout, @vk.device, value_p.value, nil
18
+ end
19
+
20
+ def build_layout_info
21
+ VkDescriptorSetLayoutCreateInfo.malloc.tap do |layout|
22
+ layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
23
+ layout.flags = syms_to_descriptor_set_layout_type_flags(@types)
24
+ layout.bindingCount = descriptors.size
25
+ layout.pBindings = array_of_structures(@descriptors)
26
+ end
27
+ end
28
+
29
+ def build_descriptor(binding:, type:, count: 1, stages:, samplers: [])
30
+ VkDescriptorSetLayoutBinding.malloc.tap do |descr|
31
+ descr.binding = binding
32
+ descr.descriptorType = sym_to_descriptor_type(type)
33
+ descr.descriptorCount = count
34
+ descr.stageFlags = syms_to_shader_stage_flags(stages)
35
+ descr.pImmutableSamplers = array_of_pointers(samplers)
36
+ end
37
+ end
38
+ end
39
+ end