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,165 @@
1
+ module Vulkan
2
+ class LogicalDevice
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :physical_device
8
+ attr_reader :queue_families
9
+ attr_reader :enabled_features
10
+
11
+ def initialize(instance, physical_device, queues:, extensions:, features: physical_device.supported_features)
12
+ raise ArgumentError, "instance can't be nil" unless instance
13
+ raise ArgumentError, "physical_device can't be nil" unless physical_device
14
+ @instance = instance
15
+ @physical_device = physical_device
16
+
17
+ extensions.concat ENV['DEVICE_EXTENSIONS'].split(/\:\s/) if ENV['DEVICE_EXTENSIONS']
18
+
19
+ if queues.size == 0
20
+ # take the first available queue, to satisfy the spec (must request a queue)
21
+ queues = [{ family: physical_device.queue_families.first, priorities: [1.0] }]
22
+ end
23
+
24
+ queues_p = queues.each_with_index.map do |queue_info, index|
25
+ family_index = queue_family_to_index(queue_info[:family])
26
+ priorities = queue_info[:priorities] || raise(ArgumentError, 'queue :priorities (array of floats) is required')
27
+
28
+ priorities = [1.0] if priorities.size == 0
29
+ queue_priorities_p = Fiddle::Pointer.malloc(Fiddle::SIZEOF_FLOAT * priorities.size)
30
+ priorities.each_with_index do |priority, i|
31
+ queue_priorities_p[i * Fiddle::SIZEOF_FLOAT, Fiddle::SIZEOF_FLOAT] = [priority].pack(Fiddle::PackInfo::PACK_MAP[Fiddle::TYPE_FLOAT])
32
+ end
33
+
34
+ device_queue_info = VkDeviceQueueCreateInfo.malloc
35
+ device_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO
36
+ device_queue_info.pNext = nil
37
+ device_queue_info.flags = 0
38
+ device_queue_info.queueFamilyIndex = family_index
39
+ device_queue_info.queueCount = priorities.size
40
+ device_queue_info.pQueuePriorities = queue_priorities_p
41
+ device_queue_info
42
+ end
43
+ queue_infos_p = array_of_structures(queues_p)
44
+
45
+ extensions_p = Vulkan.struct("names[#{extensions.size}]" => ['char *name']).malloc
46
+ extensions.each_with_index do |ext, i|
47
+ extname = ext.kind_of?(String) ? ext : ext[:extension_name]
48
+ extensions_p.names[i].name = Fiddle::Pointer[extname.b + "\x00"]
49
+ end
50
+
51
+ enabled_features = VkPhysicalDeviceFeatures.malloc
52
+ enabled_features.to_ptr.copy_from physical_device.features.to_ptr
53
+ enabled_features.class.members.each do |member|
54
+ member_name = member.gsub(/[0-9A-Z]+/) { |x| "_#{x.downcase}" }.to_sym
55
+ if features.include?(member_name)
56
+ if enabled_features[member] == VK_FALSE
57
+ raise Error::UnsupportedFeature.new(member_name, member)
58
+ end
59
+ else
60
+ enabled_features[member] = VK_FALSE
61
+ end
62
+ end
63
+ @enabled_features = struct_to_hash(enabled_features).reject! { |name, enabled| enabled != VK_TRUE }.keys
64
+
65
+ device_create_info = VkDeviceCreateInfo.malloc
66
+ device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO
67
+ device_create_info.pNext = nil
68
+ device_create_info.flags = 0
69
+ device_create_info.queueCreateInfoCount = queues.size
70
+ device_create_info.pQueueCreateInfos = queue_infos_p
71
+ device_create_info.enabledLayerCount = 0 # deprecated
72
+ device_create_info.ppEnabledLayerNames = nil
73
+ device_create_info.enabledExtensionCount = extensions.size
74
+ device_create_info.ppEnabledExtensionNames = extensions_p
75
+ device_create_info.pEnabledFeatures = enabled_features
76
+
77
+ device_wrapper = Vulkan.create_value("void *", nil)
78
+ check_result Vulkan[instance, nil].vkCreateDevice(physical_device.to_ptr, device_create_info, nil, device_wrapper)
79
+ @handle = device_wrapper.value
80
+ @vk = Vulkan[instance, self]
81
+ finalize_with Vulkan[instance, nil], :vkDestroyDevice, @handle, nil
82
+
83
+ queue_handle_wrapper = Vulkan.create_value("void *", nil)
84
+ @queue_families = queues.map do |queue|
85
+ queues = queue[:priorities].each_with_index.map do |priority, index|
86
+ @vk.vkGetDeviceQueue(@handle, queue_family_to_index(queue[:family]), index, queue_handle_wrapper)
87
+ Vulkan::Queue.new(@vk, queue_handle_wrapper.value, index: index, priority: priority)
88
+ end
89
+ queue[:family].merge queues: queues
90
+ end
91
+ end
92
+
93
+ def max_samples
94
+ physical_device.max_samples
95
+ end
96
+
97
+ def max_color_samples
98
+ physical_device.max_color_samples
99
+ end
100
+
101
+ def max_depth_samples
102
+ physical_device.max_depth_samples
103
+ end
104
+
105
+ def feature_enabled?(feature_name)
106
+ @enabled_features.include?(feature_name)
107
+ end
108
+
109
+ def create_buffer(**args)
110
+ Vulkan::Buffer.new(@vk, physical_device, **args)
111
+ end
112
+
113
+ def create_shader_stage(**args)
114
+ Vulkan::ShaderStage.new(@vk, **args)
115
+ end
116
+
117
+ def create_fence(**args)
118
+ Vulkan::Fence.new(@vk, **args)
119
+ end
120
+
121
+ def create_semaphore
122
+ Vulkan::Semaphore.new(@vk)
123
+ end
124
+
125
+ def create_pipeline(**args)
126
+ Vulkan::Pipeline.new(@vk, **args)
127
+ end
128
+
129
+ def create_swapchain(**args)
130
+ Vulkan::Swapchain.new(@instance, self, **args)
131
+ end
132
+
133
+ def create_renderpass
134
+ Vulkan::RenderPass.new(@vk)
135
+ end
136
+
137
+ def create_command_pool(**args)
138
+ Vulkan::CommandPool.new(@vk, **args)
139
+ end
140
+
141
+ def create_descriptor_set_pool(**args)
142
+ Vulkan::DescriptorPool.new(@vk, **args)
143
+ end
144
+
145
+ def create_image(**args)
146
+ Vulkan::Image.new(@vk, physical_device, **args)
147
+ end
148
+
149
+ def create_sampler(**args)
150
+ Vulkan::Sampler.new(@vk, self, **args)
151
+ end
152
+
153
+ def create_framebuffer(**args)
154
+ Vulkan::Framebuffer.new(@vk, **args)
155
+ end
156
+
157
+ def hexaddr
158
+ to_ptr.to_i.to_s(16)
159
+ end
160
+
161
+ def to_ptr
162
+ @handle
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,171 @@
1
+ module Vulkan
2
+ class Memory
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :requirements
8
+ attr_reader :physical_device
9
+
10
+ def initialize(vk, physical_device,
11
+ owner:,
12
+ properties: [:host_visible])
13
+ @range_array = nil
14
+ @vk = vk
15
+ @physical_device = physical_device
16
+ @properties = syms_to_memory_properties(properties)
17
+ @owner = owner
18
+ @mapped = Vulkan.create_value('void *', nil)
19
+
20
+ @requirements = query_memory_requirements
21
+
22
+ alloc_info = VkMemoryAllocateInfo.malloc
23
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO
24
+ alloc_info.allocationSize = @requirements.size
25
+ alloc_info.memoryTypeIndex = memory_type_index
26
+ memory_handle_p = Vulkan.create_value('void *', nil)
27
+ check_result @vk.vkAllocateMemory(@vk.device, alloc_info, nil, memory_handle_p)
28
+ @handle = memory_handle_p.value
29
+ finalize_with @vk, :vkFreeMemory, @vk.device, @handle, nil
30
+ bind
31
+ end
32
+
33
+ def size
34
+ @requirements.size
35
+ end
36
+
37
+ def memory_type_index
38
+ properties = {}
39
+ physical_device.memory_properties[:memory_type_count].times do |i|
40
+ if (requirements.memoryTypeBits & (1 << i)) != 0
41
+ if (physical_device.memory_properties[:memory_types][i][:property_flags] & @properties) == @properties
42
+ return i
43
+ else
44
+ properties[i] = "0x%x" % physical_device.memory_properties[:memory_types][i][:property_flags]
45
+ end
46
+ end
47
+ end
48
+
49
+ raise 'failed to find suitable memory type (needed properties == 0x%x, memory type count == %d, requrement memory type bits == 0b%s, available properties == %s)' % [
50
+ @properties,
51
+ physical_device.memory_properties[:memory_type_count],
52
+ requirements.memoryTypeBits.to_s(2),
53
+ properties.inspect
54
+ ]
55
+ end
56
+
57
+ def data
58
+ raise 'no data pointer: buffer is not mapped' unless mapped?
59
+ @mapped
60
+ end
61
+
62
+ def mapped?
63
+ @mapped && @mapped.value.to_i != 0
64
+ end
65
+
66
+ def unmap
67
+ raise 'buffer is not mapped' unless mapped?
68
+ @mapped.value = nil
69
+ @vk.vkUnmapMemory(@vk.device, @handle)
70
+ end
71
+
72
+ # Flushes a single range of memory, which defaults to the entire buffer.
73
+ # Do this after modifying memory to inform the device that it may have
74
+ # changed. This method is called automatically after the block form of
75
+ # #map has completed, but is not called automatically if no block is
76
+ # provided to #map.
77
+ #
78
+ # See https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkFlushMappedMemoryRanges.html
79
+ def flush(offset: 0, size: offset > 0 ? self.size - offset : VK_WHOLE_SIZE)
80
+ flush_all [{ offset: offset, size: size }]
81
+ end
82
+
83
+ # Flushes each of a set of memory ranges, given as
84
+ # `[{:offset => number, :size => number}]`. No defaults are provided,
85
+ # and ArgumentError will be raised if any fields are omitted.
86
+ # Do this after modifying memory to inform the device that it may have
87
+ # changed.
88
+ #
89
+ # See https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkFlushMappedMemoryRanges.html
90
+ def flush_all(ranges)
91
+ @vk.vkFlushMappedMemoryRanges(@vk.device, ranges.size, memory_ranges(ranges))
92
+ end
93
+
94
+ # Invalidates a single range of memory, which defaults to the entire
95
+ # buffer. Do this prior to reading memory that may have been modified by
96
+ # a device. This method is called automatically at the beginning of #map,
97
+ # but is not called automatically at any other point, so if you leave
98
+ # the memory mapped (for example, by not passing a block to #map), then
99
+ # you need to call this method explicitly at the appropriate times.
100
+ #
101
+ # See https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkInvalidateMappedMemoryRanges.html
102
+ def invalidate(offset: 0, size: offset > 0 ? self.size - offset : VK_WHOLE_SIZE)
103
+ invalidate_all [{ offset: offset, size: size }]
104
+ end
105
+
106
+ # Invalidates each of a set of memory ranges, given as
107
+ # `[{:offset => number, :size => number}]`. No defaults are provided,
108
+ # and ArgumentError will be raised if any fields are omitted. Do this
109
+ # prior to reading memory that may have been modified by a device.
110
+ #
111
+ # See https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkInvalidateMappedMemoryRanges.html
112
+ def invalidate_all(ranges)
113
+ @vk.vkInvalidateMappedMemoryRanges(@vk.device, ranges.size, memory_ranges(ranges))
114
+ end
115
+
116
+ # Provides a pointer to an array of memory ranges for e.g. flushing memory
117
+ protected def memory_ranges(ranges)
118
+ # avoid reallocating @range_array if possible
119
+ unless @range_array&.ranges&.count.to_i >= ranges.count
120
+ @range_array = Vulkan.struct("ranges[#{ranges.count}]" => VkMappedMemoryRange).malloc
121
+ ranges.each_with_index do |rng, i|
122
+ range = @range_array.ranges[i]
123
+ range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE
124
+ range.pNext = nil
125
+ range.memory = @handle
126
+ end
127
+ end
128
+ ranges.each_with_index do |rng, i|
129
+ range = @range_array.ranges[i]
130
+ range.offset = rng[:offset] || raise(ArgumentError, "memory range must specify :offset")
131
+ range.size = rng[:size] || raise(ArgumentError, "memory range must specify :size")
132
+ end
133
+ @range_array
134
+ end
135
+
136
+ # Maps this memory range. If a block is provided, a pointer to the start
137
+ # of the mapped memory range is yielded to the block and the memory is
138
+ # automatically unmapped after the block finishes and `nil` is returned
139
+ # to prevent writing to a no-longer-mapped address.
140
+ #
141
+ # If no block is provided, the memory remains mapped and the pointer is
142
+ # returned.
143
+ #
144
+ # If `invalidate` is true, the range to be mapped will be invalidated
145
+ # automatically before mapping to ensure that the memory will be up to
146
+ # date with any changes from the device. If false, the memory may be out
147
+ # of date when you map it.
148
+ #
149
+ # If `flush` is true, and a block is given, then the memory will be
150
+ # flushed to ensure that it is updated on the device after your block
151
+ # completes. If no block is given, this option has no effect.
152
+ def map(offset: 0, size: offset > 0 ? self.size - offset : VK_WHOLE_SIZE,
153
+ invalidate: true, flush: true, &block)
154
+ raise 'buffer is already mapped' if mapped?
155
+ self.invalidate offset: offset, size: size if invalidate
156
+ @vk.vkMapMemory(@vk.device, @handle, offset, size, 0, @mapped)
157
+ size = self.size if size == VK_WHOLE_SIZE
158
+ if block_given?
159
+ begin
160
+ yield Fiddle::Pointer.new(@mapped.value.to_i, size)
161
+ ensure
162
+ self.flush offset: offset, size: size if flush
163
+ unmap
164
+ end
165
+ return nil
166
+ else
167
+ return Fiddle::Pointer.new(@mapped.value.to_i, size)
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,42 @@
1
+ module Vulkan
2
+ module Mock
3
+ # A mock object that you can use in your unit testing. This way you can
4
+ # construct Vulkan-ish data for testing against that doesn't depend on any
5
+ # underlying hardware. All of the properties of this object are optional,
6
+ # and sane (but arbitary) defaults will be provided for anything omitted.
7
+ class SwapchainSurfaceInfo
8
+ # These values were chosen arbitrarily.
9
+ DEFAULT_CAPABILITIES = {
10
+ min_image_count: 0,
11
+ max_image_count: 10,
12
+ current_extent: { width: 800, height: 600 },
13
+ min_image_extent: { width: 1, height: 1 },
14
+ max_image_extent: { width: 8192, height: 8192 },
15
+ max_image_array_layers: 128,
16
+ supported_transforms: [ :identity, :rotate_90, :rotate_180,
17
+ :rotate_270, :horizontal_mirror,
18
+ :horizontal_mirror_rotate_90,
19
+ :horizontal_mirror_rotate_180,
20
+ :horizontal_mirror_rotate_270,
21
+ :inherit ],
22
+ current_transform: [ :identity ],
23
+ supported_composite_alpha: [ :opaque, :pre_multiplied, :post_multiplied, :inherit ],
24
+ supported_usage: [ :transfer_src, :transfer_dst, :sampled, :storage,
25
+ :color_attachment, :depth_stencil_attachment,
26
+ :transient_attachment, :input_attachment ]
27
+ }
28
+
29
+ attr_reader :presentation_modes
30
+ attr_reader :formats
31
+ attr_reader :capabilities
32
+
33
+ def initialize(presentation_modes: [:fifo, :mailbox, :immediate],
34
+ formats: [{ format: :r8g8b8a8_snorm, color_space: :srgb_nonlinear }],
35
+ **capabilities)
36
+ @presentation_modes = presentation_modes
37
+ @formats = formats
38
+ @capabilities = DEFAULT_CAPABILITIES.merge(capabilities)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,5 @@
1
+ module Vulkan
2
+ module Mock
3
+ autoload :SwapchainSurfaceInfo, 'vulkan/mock/swapchain_surface_info'
4
+ end
5
+ end
@@ -0,0 +1,162 @@
1
+ module Vulkan
2
+ class PhysicalDevice
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+
6
+ def initialize(instance, handle)
7
+ @handle = handle
8
+ @instance = instance
9
+ @vk = Vulkan[instance, nil]
10
+ end
11
+
12
+ def inspect
13
+ # force lazy instance variables to be initialized
14
+ to_hash
15
+ super
16
+ end
17
+
18
+ def to_ptr
19
+ @handle
20
+ end
21
+
22
+ def to_hash
23
+ {
24
+ extensions: extensions,
25
+ properties: properties,
26
+ features: features_hash,
27
+ queue_families: queue_families
28
+ }
29
+ end
30
+
31
+ def supported_features
32
+ struct_to_hash(features).reject! { |k, v| v != VK_TRUE }.keys
33
+ end
34
+
35
+ def unsupported_features
36
+ struct_to_hash(features).reject! { |k, v| v == VK_TRUE }.keys
37
+ end
38
+
39
+ def max_samples
40
+ [max_color_samples, max_depth_samples].min
41
+ end
42
+
43
+ def sample_counts_to_max(counts)
44
+ return VK_SAMPLE_COUNT_64_BIT if counts & VK_SAMPLE_COUNT_64_BIT != 0
45
+ return VK_SAMPLE_COUNT_32_BIT if counts & VK_SAMPLE_COUNT_32_BIT != 0
46
+ return VK_SAMPLE_COUNT_16_BIT if counts & VK_SAMPLE_COUNT_16_BIT != 0
47
+ return VK_SAMPLE_COUNT_8_BIT if counts & VK_SAMPLE_COUNT_8_BIT != 0
48
+ return VK_SAMPLE_COUNT_4_BIT if counts & VK_SAMPLE_COUNT_4_BIT != 0
49
+ return VK_SAMPLE_COUNT_2_BIT if counts & VK_SAMPLE_COUNT_2_BIT != 0
50
+ return VK_SAMPLE_COUNT_1_BIT
51
+ end
52
+
53
+ def max_color_samples
54
+ sample_counts_to_max properties[:limits][:framebuffer_color_sample_counts]
55
+ end
56
+
57
+ def max_depth_samples
58
+ sample_counts_to_max properties[:limits][:framebuffer_depth_sample_counts]
59
+ end
60
+
61
+ def detect_supported_format(*candidates, usage:, tiling: :optimal)
62
+ usage = syms_to_format_feature_flags(usage)
63
+ tiling = sym_to_image_tiling(tiling)
64
+ candidates.flatten.each do |candidate|
65
+ props = VkFormatProperties.malloc
66
+ @vk.vkGetPhysicalDeviceFormatProperties(to_ptr, sym_to_format(candidate), props)
67
+ if tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & usage) == usage
68
+ return candidate
69
+ elsif tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & usage) == usage
70
+ return candidate
71
+ end
72
+ end
73
+ nil
74
+ end
75
+
76
+ # Returns the swapchain surface info if the `"VK_KHR_swapchain"` extension
77
+ # is supported, `nil` otherwise.
78
+ def swapchain_surface_info(surface)
79
+ if extension_names.include?('VK_KHR_swapchain')
80
+ SwapchainSurfaceInfo.new(@instance, self, surface)
81
+ else
82
+ nil
83
+ end
84
+ end
85
+
86
+ def extension_names
87
+ extensions.map { |ext| ext[:extension_name] }
88
+ end
89
+
90
+ def create_logical_device(**args)
91
+ Vulkan::LogicalDevice.new(@instance, self, **args)
92
+ end
93
+
94
+ alias create create_logical_device
95
+
96
+ def memory_properties
97
+ @memory_properties ||= begin
98
+ memory_properties = VkPhysicalDeviceMemoryProperties.malloc
99
+ @vk.vkGetPhysicalDeviceMemoryProperties(to_ptr, memory_properties)
100
+ struct_to_hash(memory_properties)
101
+ end
102
+ end
103
+
104
+ def queue_families
105
+ @queue_families ||= begin
106
+ count_ptr = Vulkan.create_value("uint32_t", 0)
107
+ @vk.vkGetPhysicalDeviceQueueFamilyProperties(@handle, count_ptr, nil)
108
+
109
+ container_struct = Vulkan.struct("queues[#{count_ptr.value}]" => VkQueueFamilyProperties)
110
+ container = container_struct.malloc
111
+ @vk.vkGetPhysicalDeviceQueueFamilyProperties(@handle, count_ptr, container)
112
+ container.queues.each_with_index.map do |prop, index|
113
+ info = struct_to_hash(prop, Vulkan::QueueFamily.new(@vk.instance, self, index))
114
+ info[:supports] = flags_to_symbols(info[:queue_flags], /^VK_QUEUE_(.*?)_BIT$/)
115
+ info[:index] = index
116
+ info[:queues] = [1.0]
117
+ info
118
+ end
119
+ end
120
+ end
121
+
122
+ def supports_feature?(feature_name)
123
+ features_hash[feature_name] == VK_TRUE
124
+ end
125
+
126
+ def features_hash
127
+ struct_to_hash features
128
+ end
129
+
130
+ def features
131
+ @features ||= begin
132
+ features = VkPhysicalDeviceFeatures.malloc
133
+ @vk.vkGetPhysicalDeviceFeatures(@handle, features)
134
+ features
135
+ end
136
+ end
137
+
138
+ def properties
139
+ @properties ||= begin
140
+ properties = VkPhysicalDeviceProperties.malloc
141
+ @vk.vkGetPhysicalDeviceProperties(@handle, properties)
142
+ properties = struct_to_hash(properties)
143
+ properties[:device_type] = const_to_symbol(properties[:device_type], /^VK_PHYSICAL_DEVICE_TYPE_(.*?)$/)
144
+ properties
145
+ end
146
+ end
147
+
148
+ def extensions
149
+ @extensions ||= begin
150
+ # get properties count
151
+ count_ptr = Vulkan.create_value("uint32_t", 0)
152
+ check_result @vk.vkEnumerateDeviceExtensionProperties(@handle, nil, count_ptr, nil)
153
+ count = count_ptr.value
154
+ # allocate n devices
155
+ container_struct = Vulkan.struct("handles[#{count}]" => VkExtensionProperties)
156
+ container = container_struct.malloc
157
+ check_result @vk.vkEnumerateDeviceExtensionProperties(@handle, nil, count_ptr, container)
158
+ container.handles.map { |handle| struct_to_hash(handle) }
159
+ end
160
+ end
161
+ end
162
+ end