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,294 @@
1
+ module Vulkan
2
+ class Pipeline
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :layout
8
+ attr_reader :input
9
+ attr_reader :viewport
10
+ attr_reader :scissor
11
+ attr_reader :rasterizer
12
+ attr_reader :multisampling
13
+ attr_reader :blending
14
+ attr_reader :layouts
15
+ attr_reader :constant_ranges
16
+ attr_reader :descriptors
17
+ attr_accessor :specialization_constants
18
+
19
+ # TODO support multiple viewports
20
+ def initialize(vk, viewport: { }, scissor: { })
21
+ @vk = vk
22
+ @shader_stages = []
23
+ @layouts = []
24
+ @constant_ranges = []
25
+ @descriptors = []
26
+ @input = {
27
+ topology: :triangles,
28
+ primitive_restart: false
29
+ }
30
+ @viewport = {
31
+ left: 0,
32
+ top: 0,
33
+ width: 640,
34
+ height: 480,
35
+ min_depth: 0,
36
+ max_depth: 1
37
+ }.merge(viewport)
38
+ @scissor = {
39
+ left: 0,
40
+ top: 0,
41
+ width: 0xffffffff,
42
+ height: 0xffffffff
43
+ }.merge(scissor)
44
+ @rasterizer = {
45
+ depth_clamp: false,
46
+ discard_all: false,
47
+ polygon_mode: :fill,
48
+ line_width: 1.0,
49
+ cull_mode: :back,
50
+ front_face: :counter_clockwise,
51
+ depth_bias: false,
52
+ depth_bias_clamp: 0,
53
+ depth_bias_constant: 0,
54
+ depth_bias_slope: 0
55
+ }
56
+ @multisampling = {
57
+ sample_shading: false,
58
+ samples: 1,
59
+ min_sample_shading: 0.2,
60
+ sample_mask: nil,
61
+ alpha_to_coverage: false,
62
+ alpha_to_one: false
63
+ }
64
+ @blending = {
65
+ enabled: true,
66
+ color_writes: [ :red, :green, :blue, :alpha ],
67
+ src_color: :src_alpha,
68
+ dst_color: :one_minus_src_alpha,
69
+ src_alpha: :one,
70
+ dst_alpha: :zero,
71
+ color_op: :add,
72
+ alpha_op: :add
73
+ }
74
+ @binding_descriptions = []
75
+ @attribute_descriptions = []
76
+ @dynamic_states = []
77
+ @specialization_constants = {}
78
+ end
79
+
80
+ def add_binding_description(binding:, stride:, input_rate:)
81
+ binding_description = VkVertexInputBindingDescription.malloc
82
+ binding_description.binding = binding
83
+ binding_description.stride = stride
84
+ binding_description.inputRate = sym_to_vertex_input_rate(input_rate)
85
+ @binding_descriptions << binding_description
86
+ end
87
+
88
+ def add_attribute_description(binding:, location:, format:, offset:)
89
+ attribute_description = VkVertexInputAttributeDescription.malloc
90
+ attribute_description.binding = binding
91
+ attribute_description.location = location
92
+ attribute_description.format = sym_to_format(format)
93
+ attribute_description.offset = offset
94
+ @attribute_descriptions << attribute_description
95
+ end
96
+
97
+ def add_descriptor_set_layout(*a, **b)
98
+ if a.size == 1 && b.empty? && a.first.kind_of?(Vulkan::DescriptorSetLayout)
99
+ @layouts << a[0]
100
+ else
101
+ Vulkan::DescriptorSetLayout.new(@vk, *a, **b).tap { |layout| @layouts << layout }
102
+ end
103
+ end
104
+
105
+ def add_shader_stage(shader_stage)
106
+ @shader_stages << shader_stage
107
+ end
108
+
109
+ def depth(test: true,
110
+ write: true,
111
+ compare_op: :less,
112
+ bounds_test: false,
113
+ min_bounds: 0,
114
+ max_bounds: 1,
115
+ stencil_test: false,
116
+ stencil_front: nil,
117
+ stencil_back: nil)
118
+ @depth_stencil = VkPipelineDepthStencilStateCreateInfo.malloc
119
+ @depth_stencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO
120
+ @depth_stencil.depthTestEnable = bool_to_vk(test)
121
+ @depth_stencil.depthWriteEnable = bool_to_vk(write)
122
+ @depth_stencil.depthCompareOp = sym_to_compare_op(compare_op)
123
+ @depth_stencil.depthBoundsTestEnable = bool_to_vk(bounds_test)
124
+ @depth_stencil.minDepthBounds = min_bounds
125
+ @depth_stencil.maxDepthBounds = max_bounds
126
+ @depth_stencil.stencilTestEnable = bool_to_vk(stencil_test)
127
+ # TODO stencil test options
128
+ end
129
+
130
+ def add_dynamic_state(which)
131
+ @dynamic_states << which
132
+ end
133
+
134
+ def construct_specialization_info(specialization_constants_hash)
135
+ specialization_info = nil
136
+ if specialization_constants_hash&.any?
137
+ specialization_data = ""
138
+ specialization_entries = specialization_constants_hash.map do |id, data|
139
+ VkSpecializationMapEntry.malloc.tap do |entry|
140
+ entry.constantID = id
141
+ entry.offset = specialization_data.size
142
+ entry.size = data.size
143
+ specialization_data << data
144
+ end
145
+ end
146
+ specialization_info = VkSpecializationInfo.malloc
147
+ specialization_info.mapEntryCount = specialization_entries.count
148
+ specialization_info.pMapEntries = array_of_structures(specialization_entries)
149
+ specialization_info.dataSize = specialization_data.size
150
+ specialization_info.pData = specialization_data
151
+ end
152
+ specialization_info
153
+ end
154
+
155
+ def commit(render_pass, first_subpass_index: 0)
156
+ @render_pass = render_pass
157
+
158
+ shader_stage_create_infos = @shader_stages.map do |stage|
159
+ stage_info = VkPipelineShaderStageCreateInfo.malloc
160
+ stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
161
+ stage_info.stage = syms_to_shader_stage_flags(stage.stage)
162
+ stage_info.module = stage.module_handle
163
+ stage_info.pName = Fiddle::Pointer[stage.entry_point]
164
+ specs = construct_specialization_info(@specialization_constants[stage.stage])
165
+ stage_info.pSpecializationInfo = specs
166
+ stage_info
167
+ end
168
+
169
+ vertex_input_info = VkPipelineVertexInputStateCreateInfo.malloc
170
+ vertex_input_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
171
+ vertex_input_info.vertexBindingDescriptionCount = @binding_descriptions.size
172
+ vertex_input_info.pVertexBindingDescriptions = array_of_structures(@binding_descriptions)
173
+ vertex_input_info.vertexAttributeDescriptionCount = @attribute_descriptions.size
174
+ vertex_input_info.pVertexAttributeDescriptions = array_of_structures(@attribute_descriptions)
175
+
176
+ input_assembly = VkPipelineInputAssemblyStateCreateInfo.malloc
177
+ input_assembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
178
+ input_assembly.topology = sym_to_topology(@input[:topology])
179
+ input_assembly.primitiveRestartEnable = bool_to_vk(@input[:primitive_restart])
180
+
181
+ viewport = VkViewport.malloc
182
+ viewport.x = @viewport[:left]
183
+ viewport.y = @viewport[:top]
184
+ viewport.width = @viewport[:width]
185
+ viewport.height = @viewport[:height]
186
+ viewport.minDepth = @viewport[:min_depth]
187
+ viewport.maxDepth = @viewport[:max_depth]
188
+
189
+ scissor = VkRect2D.malloc
190
+ scissor.offset.x = @scissor[:left]
191
+ scissor.offset.y = @scissor[:top]
192
+ scissor.extent.width = @scissor[:width]
193
+ scissor.extent.height = @scissor[:height]
194
+
195
+ viewport_state = VkPipelineViewportStateCreateInfo.malloc
196
+ viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
197
+ # TODO support multiple viewports and scissors
198
+ viewport_state.viewportCount = 1
199
+ viewport_state.pViewports = viewport
200
+ viewport_state.scissorCount = 1
201
+ viewport_state.pScissors = scissor
202
+
203
+ rasterizer = VkPipelineRasterizationStateCreateInfo.malloc
204
+ rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
205
+ rasterizer.depthClampEnable = bool_to_vk(@rasterizer[:depth_clamp])
206
+ rasterizer.rasterizerDiscardEnable = bool_to_vk(@rasterizer[:discard_all])
207
+ rasterizer.polygonMode = sym_to_polygon_mode(@rasterizer[:polygon_mode])
208
+ rasterizer.lineWidth = @rasterizer[:line_width]
209
+ rasterizer.cullMode = sym_to_cull_mode(@rasterizer[:cull_mode])
210
+ rasterizer.frontFace = sym_to_front_face(@rasterizer[:front_face])
211
+ rasterizer.depthBiasEnable = bool_to_vk(@rasterizer[:depth_bias])
212
+ rasterizer.depthBiasConstantFactor = @rasterizer[:depth_bias_constant]
213
+ rasterizer.depthBiasClamp = @rasterizer[:depth_bias_clamp]
214
+ rasterizer.depthBiasSlopeFactor = @rasterizer[:depth_bias_slope]
215
+
216
+ multisampling = VkPipelineMultisampleStateCreateInfo.malloc
217
+ multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
218
+ multisampling.sampleShadingEnable = bool_to_vk(@multisampling[:sample_shading])
219
+ multisampling.rasterizationSamples = num_to_samples(@multisampling[:samples])
220
+ multisampling.minSampleShading = @multisampling[:min_sample_shading]
221
+ multisampling.pSampleMask = @multisampling[:sample_mask]
222
+ multisampling.alphaToCoverageEnable = bool_to_vk(@multisampling[:alpha_to_coverage])
223
+ multisampling.alphaToOneEnable = @multisampling[:alpha_to_one] ? VK_TRUE : VK_FALSE
224
+
225
+ color_blend_attachment = VkPipelineColorBlendAttachmentState.malloc
226
+ color_blend_attachment.colorWriteMask = @blending[:color_writes].reduce(0) do |v, sym|
227
+ v | sym_to_color_component_bit(sym)
228
+ end
229
+ color_blend_attachment.blendEnable = bool_to_vk(@blending[:enabled])
230
+ color_blend_attachment.srcColorBlendFactor = sym_to_blend_factor(@blending[:src_color])
231
+ color_blend_attachment.dstColorBlendFactor = sym_to_blend_factor(@blending[:dst_color])
232
+ color_blend_attachment.colorBlendOp = sym_to_blend_op(@blending[:color_op])
233
+ color_blend_attachment.srcAlphaBlendFactor = sym_to_blend_factor(@blending[:src_alpha])
234
+ color_blend_attachment.dstAlphaBlendFactor = sym_to_blend_factor(@blending[:dst_alpha])
235
+ color_blend_attachment.alphaBlendOp = sym_to_blend_op(@blending[:alpha_op])
236
+
237
+ color_blending = VkPipelineColorBlendStateCreateInfo.malloc
238
+ color_blending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
239
+ color_blending.logicOpEnable = VK_FALSE;
240
+ color_blending.logicOp = VK_LOGIC_OP_COPY; # TODO
241
+ color_blending.attachmentCount = 1 # TODO multiple blend attachments
242
+ color_blending.pAttachments = color_blend_attachment
243
+ color_blending.blendConstants[0] = 0.0 # TODO
244
+ color_blending.blendConstants[1] = 0.0 # TODO
245
+ color_blending.blendConstants[2] = 0.0 # TODO
246
+ color_blending.blendConstants[3] = 0.0 # TODO
247
+
248
+ pipeline_layout_info = VkPipelineLayoutCreateInfo.malloc
249
+ pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
250
+ pipeline_layout_info.setLayoutCount = @layouts.size
251
+ pipeline_layout_info.pSetLayouts = array_of_structures(@layouts.map { |l| Vulkan.create_value('void *', l.to_ptr) })
252
+ pipeline_layout_info.pushConstantRangeCount = 0 # @constant_ranges.size
253
+ pipeline_layout_info.pPushConstantRanges = nil # FIXME
254
+ raise NotImplemented, 'push constant ranges not implemented' if @constant_ranges.any?
255
+
256
+ pipeline_layout_p = Vulkan.create_value('void *', nil)
257
+ check_result @vk.vkCreatePipelineLayout(@vk.device, pipeline_layout_info, nil, pipeline_layout_p)
258
+ @layout = pipeline_layout_p.value
259
+ finalize_with @vk, :vkDestroyPipelineLayout, @vk.device, @layout, nil
260
+
261
+ if @dynamic_states.any?
262
+ dynamic_states = VkPipelineDynamicStateCreateInfo.malloc
263
+ dynamic_states.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
264
+ dynamic_states.dynamicStateCount = @dynamic_states.count
265
+ dynamic_states.pDynamicStates = array_of_uint32s(@dynamic_states.map { |state| sym_to_dynamic_state(state) })
266
+ else
267
+ dynamic_states = nil
268
+ end
269
+
270
+ pipeline_info = VkGraphicsPipelineCreateInfo.malloc
271
+ pipeline_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
272
+ pipeline_info.stageCount = shader_stage_create_infos.size
273
+ pipeline_info.pStages = array_of_structures(shader_stage_create_infos)
274
+ pipeline_info.pVertexInputState = vertex_input_info
275
+ pipeline_info.pInputAssemblyState = input_assembly
276
+ pipeline_info.pViewportState = viewport_state
277
+ pipeline_info.pRasterizationState = rasterizer
278
+ pipeline_info.pMultisampleState = multisampling
279
+ pipeline_info.pDepthStencilState = @depth_stencil
280
+ pipeline_info.pColorBlendState = color_blending
281
+ pipeline_info.pDynamicState = dynamic_states
282
+ pipeline_info.layout = @layout
283
+ pipeline_info.renderPass = render_pass.to_ptr
284
+ pipeline_info.subpass = first_subpass_index
285
+ pipeline_info.basePipelineHandle = nil # TODO
286
+ pipeline_info.basePipelineIndex = -1 # TODO
287
+
288
+ pipeline_p = Vulkan.create_value('void *', nil)
289
+ check_result @vk.vkCreateGraphicsPipelines(@vk.device, nil, 1, pipeline_info, nil, pipeline_p)
290
+ @handle = pipeline_p.value
291
+ finalize_with @vk, :vkDestroyPipeline, @vk.device, @handle, nil
292
+ end
293
+ end
294
+ end
@@ -0,0 +1,34 @@
1
+ require 'fiddle'
2
+ require 'rbconfig'
3
+
4
+ module Vulkan
5
+ module Platform
6
+ def calling_convention_human
7
+ case calling_convention
8
+ when Fiddle::Function::STDCALL then :stdcall
9
+ when Fiddle::Function::DEFAULT then :default
10
+ else raise "BUG: can't identify calling convention???"
11
+ end
12
+ rescue NameError
13
+ :default
14
+ end
15
+
16
+ def calling_convention
17
+ case Vulkan.os
18
+ when :windows then Fiddle::Function::STDCALL
19
+ else Fiddle::Function::DEFAULT
20
+ end
21
+ rescue NameError
22
+ Fiddle::Function::DEFAULT
23
+ end
24
+
25
+ def os
26
+ case RbConfig::CONFIG['host_os']
27
+ when /mswin|msys|mingw|cygwin|bccwin|wince|emc/ then :windows
28
+ when /darwin|mac os/ then :osx
29
+ when /linux/, /solaris|bsd/ then :linux
30
+ else raise 'could not determine vulkan library to load for this OS'
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,94 @@
1
+ module Vulkan
2
+ class Queue
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+
6
+ attr_reader :priority
7
+ attr_reader :index
8
+
9
+ def initialize(vk, handle, priority:, index:)
10
+ @vk = vk
11
+ @handle = handle
12
+ @priority = priority
13
+ @index = index
14
+
15
+ # pointers used and reused during queue submit and presentment, to avoid
16
+ # unnecessary GC
17
+ @wait_semaphores_buffers = { 0 => nil }
18
+ @wait_stages_buffers = { 0 => nil }
19
+ @signal_semaphores_buffers = { 0 => nil }
20
+ @command_buffers_buffers = { 0 => nil }
21
+ @submit_infos = { 0 => nil, 1 => Vulkan.struct("infos[1]" => VkSubmitInfo).malloc }
22
+ @submit_infos[1].infos[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO
23
+ @image_indices_buffers = { 0 => nil }
24
+ @swapchains_buffers = { 0 => nil }
25
+ @present_info = VkPresentInfoKHR.malloc
26
+ @present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR
27
+ end
28
+
29
+ def submit_infos(submit_infos, fence = nil)
30
+ submit_infos_p = @submit_infos[submit_infos.size] ||= Vulkan.struct("infos[#{submit_infos.size}]" => VkSubmitInfo).malloc
31
+ submit_infos.each_with_index do |info, i|
32
+ next if submit_infos_p.infos[i] == info
33
+ submit_infos_p.infos[i].copy_from(info)
34
+ end
35
+
36
+ check_result @vk.vkQueueSubmit(to_ptr, submit_infos.size, submit_infos_p, fence)
37
+ end
38
+
39
+ def wait_until_idle
40
+ @vk.vkQueueWaitIdle(to_ptr)
41
+ end
42
+
43
+ def submit(command_buffers, wait_semaphores: [], wait_stages: [], signal_semaphores: [], fence: nil)
44
+ wait_stages_p = @wait_stages_buffers[wait_stages.size] ||= Vulkan.struct(["VkPipelineStageFlags stages[#{wait_stages.size}]"]).malloc
45
+ wait_stages.each_with_index { |stage, index| wait_stages_p.stages[index] = stage }
46
+
47
+ wait_semaphores_p = @wait_semaphores_buffers[wait_semaphores.size] ||= Fiddle::Pointer.malloc(wait_semaphores.size * Fiddle::SIZEOF_VOIDP)
48
+ array_of_pointers(wait_semaphores, wait_semaphores_p)
49
+
50
+ signal_semaphores_p = @signal_semaphores_buffers[signal_semaphores.size] ||= Fiddle::Pointer.malloc(signal_semaphores.size * Fiddle::SIZEOF_VOIDP)
51
+ array_of_pointers(signal_semaphores, signal_semaphores_p)
52
+
53
+ command_buffers_p = @command_buffers_buffers[command_buffers.size] ||= Fiddle::Pointer.malloc(command_buffers.size * Fiddle::SIZEOF_VOIDP)
54
+ array_of_pointers(command_buffers, command_buffers_p)
55
+
56
+ submit_info = @submit_infos[1].infos[0]
57
+ submit_info.waitSemaphoreCount = wait_semaphores.size
58
+ submit_info.pWaitSemaphores = wait_semaphores_p
59
+ submit_info.pWaitDstStageMask = wait_stages_p
60
+ submit_info.commandBufferCount = command_buffers.size
61
+ submit_info.pCommandBuffers = command_buffers_p
62
+ submit_info.signalSemaphoreCount = signal_semaphores.size
63
+ submit_info.pSignalSemaphores = signal_semaphores_p
64
+
65
+ submit_infos(@submit_infos[1].infos, fence)
66
+ end
67
+
68
+ def present(swapchains:, image_indices:, wait_semaphores: [])
69
+ raise ArgumentError, "swapchains and image_indices must have same sizes" unless swapchains.size == image_indices.size
70
+
71
+ wait_semaphores_p = @wait_semaphores_buffers[wait_semaphores.size] ||= Fiddle::Pointer.malloc(wait_semaphores.size * Fiddle::SIZEOF_VOIDP)
72
+ array_of_pointers(wait_semaphores, wait_semaphores_p)
73
+
74
+ image_indices_p = @image_indices_buffers[image_indices.size] ||= Vulkan.struct(["uint32_t indices[#{image_indices.size}]"]).malloc
75
+ data = image_indices.pack("I*")
76
+ image_indices_p[0, data.size] = data
77
+
78
+ swapchains_p = @swapchains_buffers[swapchains.size] ||= Fiddle::Pointer.malloc(swapchains.size * Fiddle::SIZEOF_VOIDP)
79
+ array_of_pointers(swapchains, swapchains_p)
80
+
81
+ @present_info.waitSemaphoreCount = wait_semaphores.size
82
+ @present_info.pWaitSemaphores = wait_semaphores_p
83
+ @present_info.swapchainCount = swapchains.size
84
+ @present_info.pSwapchains = swapchains_p
85
+ @present_info.pImageIndices = image_indices_p
86
+ @present_info.pResults = nil
87
+ check_result @vk.vkQueuePresentKHR(to_ptr, @present_info)
88
+ end
89
+
90
+ def to_ptr
91
+ @handle
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,27 @@
1
+ module Vulkan
2
+ class QueueFamily < Hash
3
+ include Vulkan::Checks
4
+
5
+ attr_reader :physical_device
6
+
7
+ def initialize(instance, physical_device, family_index)
8
+ super()
9
+ @physical_device = physical_device
10
+ @vk = Vulkan[instance, nil]
11
+ @family_index = family_index
12
+ end
13
+
14
+ def supports?(feature)
15
+ self[:supports].include?(feature)
16
+ end
17
+
18
+ def supports_presentation?(surface)
19
+ supported_p = Vulkan.create_value('VkBool32', 0)
20
+ check_result @vk.vkGetPhysicalDeviceSurfaceSupportKHR(@physical_device.to_ptr,
21
+ @family_index,
22
+ surface.to_ptr,
23
+ supported_p)
24
+ return supported_p.value == VK_TRUE
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,80 @@
1
+ module Vulkan
2
+ class RenderPass
3
+ class Subpass
4
+ include Vulkan::Conversions
5
+
6
+ def initialize(vk, bind_point: :graphics)
7
+ @color_attachments = []
8
+ @input_attachments = []
9
+ @resolve_attachments = []
10
+ @preserve_attachments = []
11
+
12
+ @ptr = VkSubpassDescription.malloc
13
+ @ptr.pipelineBindPoint = sym_to_pipeline_bind_point(bind_point)
14
+ @ptr.colorAttachmentCount = 0
15
+ @ptr.pColorAttachments = nil
16
+ @ptr.inputAttachmentCount = 0
17
+ @ptr.pInputAttachments = nil
18
+ @ptr.pResolveAttachments = nil
19
+ @ptr.pDepthStencilAttachment = nil
20
+ @ptr.preserveAttachmentCount = 0
21
+ @ptr.pPreserveAttachments = nil
22
+ end
23
+
24
+ def add_attachment_ref(ary, index:, layout:, addr_mbr:, count_mbr:)
25
+ ary << create_attachment_ref(index, layout)
26
+ update_attachment_refs(ary, addr_mbr: addr_mbr, count_mbr: count_mbr)
27
+ end
28
+
29
+ def update_attachment_refs(ary, addr_mbr:, count_mbr:)
30
+ @ptr.send(:"#{addr_mbr}=", array_of_structures(ary))
31
+ @ptr.send(:"#{count_mbr}=", ary.size) if count_mbr
32
+ end
33
+
34
+ def add_color_attachment_ref(index:, layout: :color)
35
+ add_attachment_ref(@color_attachments, index: index,
36
+ layout: layout,
37
+ addr_mbr: :pColorAttachments,
38
+ count_mbr: :colorAttachmentCount)
39
+ end
40
+
41
+ def add_resolve_attachment_ref(index:, layout: :color)
42
+ add_attachment_ref(@resolve_attachments, index: index,
43
+ layout: layout,
44
+ addr_mbr: :pResolveAttachments,
45
+ count_mbr: nil)
46
+ end
47
+
48
+ def add_input_attachment_ref(index:, layout:)
49
+ add_attachment_ref(@input_attachments, index: index,
50
+ layout: layout,
51
+ addr_mbr: :pInputAttachments,
52
+ count_mbr: :inputAttachmentCount)
53
+ end
54
+
55
+ def add_preserve_attachment_ref(index:, layout:)
56
+ add_attachment_ref(@preserve_attachments, index: index,
57
+ layout: layout,
58
+ addr_mbr: :pPreserveStencilAttachments,
59
+ count_mbr: :preserveStencilAttachmentCount)
60
+ end
61
+
62
+ def set_depth_stencil_attachment_ref(index:, layout: :depth_stencil_attachment_optimal)
63
+ ref = create_attachment_ref(index, layout)
64
+ @depth_stencil_attachment = ref
65
+ @ptr.pDepthStencilAttachment = ref
66
+ end
67
+
68
+ def to_ptr
69
+ @ptr&.to_ptr
70
+ end
71
+
72
+ def create_attachment_ref(index, layout)
73
+ ref = VkAttachmentReference.malloc
74
+ ref.attachment = index # attachment index
75
+ ref.layout = sym_to_image_layout(layout)
76
+ ref
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,71 @@
1
+ module Vulkan
2
+ class RenderPass
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :attachments
8
+
9
+ def initialize(vk)
10
+ @vk = vk
11
+ @attachments = []
12
+ @subpasses = []
13
+ end
14
+
15
+ def to_ptr
16
+ super || raise(RuntimeError, 'call #commit first')
17
+ end
18
+
19
+ def commit
20
+ render_pass_info = VkRenderPassCreateInfo.malloc
21
+ render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
22
+ render_pass_info.attachmentCount = @attachments.size
23
+ render_pass_info.pAttachments = array_of_structures(@attachments)
24
+ render_pass_info.subpassCount = @subpasses.size
25
+ render_pass_info.pSubpasses = array_of_structures(@subpasses)
26
+
27
+ dependency = VkSubpassDependency.malloc
28
+ dependency.srcSubpass = VK_SUBPASS_EXTERNAL
29
+ dependency.dstSubpass = 0
30
+ dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
31
+ dependency.srcAccessMask = 0
32
+ dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
33
+ dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
34
+
35
+ render_pass_info.dependencyCount = 1
36
+ render_pass_info.pDependencies = dependency
37
+
38
+ render_pass_p = Vulkan.create_value('void *', nil)
39
+ check_result @vk.vkCreateRenderPass(@vk.device, render_pass_info, nil, render_pass_p)
40
+ @handle = render_pass_p.value
41
+ finalize_with @vk, :vkDestroyRenderPass, @vk.device, @handle, nil
42
+ end
43
+
44
+ def add_attachment(format:,
45
+ samples: 1,
46
+ load_op: :clear,
47
+ store_op: :store,
48
+ stencil_load_op: :dont_care,
49
+ stencil_store_op: :dont_care,
50
+ initial_layout: nil,
51
+ final_layout: :presentation_src)
52
+ attachment = VkAttachmentDescription.malloc
53
+ attachment.format = sym_to_image_format(format)
54
+ attachment.samples = num_to_samples(samples)
55
+ attachment.loadOp = sym_to_load_op(load_op)
56
+ attachment.storeOp = sym_to_store_op(store_op)
57
+ attachment.stencilLoadOp = sym_to_load_op(stencil_load_op)
58
+ attachment.stencilStoreOp = sym_to_store_op(stencil_store_op)
59
+ attachment.initialLayout = sym_to_image_layout(initial_layout)
60
+ attachment.finalLayout = sym_to_image_layout(final_layout)
61
+ @attachments << attachment
62
+ @attachments.size - 1
63
+ end
64
+
65
+ def add_subpass(**args)
66
+ subpass = Vulkan::RenderPass::Subpass.new(@vk, **args)
67
+ @subpasses << subpass
68
+ subpass
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,48 @@
1
+ module Vulkan
2
+ class Sampler
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ def initialize(vk, device,
8
+ mag_filter: :linear,
9
+ min_filter: :linear,
10
+ address_mode_u: :repeat,
11
+ address_mode_v: :repeat,
12
+ address_mode_w: :repeat,
13
+ anisotropy: device.feature_enabled?(:sampler_anisotropy),
14
+ max_anisotropy: anisotropy ? 16 : 1,
15
+ border_color: :int_opaque_black,
16
+ unnormalized_coords: false,
17
+ compare: false,
18
+ compare_op: :always,
19
+ mipmap_mode: :linear,
20
+ mip_lod_bias: 0,
21
+ min_lod: 0,
22
+ max_lod: 0
23
+ )
24
+ sampler_info = VkSamplerCreateInfo.malloc
25
+ sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO
26
+ sampler_info.magFilter = sym_to_filter(mag_filter)
27
+ sampler_info.minFilter = sym_to_filter(min_filter)
28
+ sampler_info.addressModeU = sym_to_sampler_address_mode(address_mode_u)
29
+ sampler_info.addressModeV = sym_to_sampler_address_mode(address_mode_v)
30
+ sampler_info.addressModeW = sym_to_sampler_address_mode(address_mode_w)
31
+ sampler_info.anisotropyEnable = bool_to_vk(anisotropy)
32
+ sampler_info.maxAnisotropy = max_anisotropy
33
+ sampler_info.borderColor = sym_to_border_color(border_color)
34
+ sampler_info.unnormalizedCoordinates = bool_to_vk(unnormalized_coords)
35
+ sampler_info.compareEnable = bool_to_vk(compare)
36
+ sampler_info.compareOp = sym_to_compare_op(compare_op)
37
+ sampler_info.mipmapMode = sym_to_sampler_mipmap_mode(mipmap_mode)
38
+ sampler_info.mipLodBias = mip_lod_bias
39
+ sampler_info.minLod = min_lod
40
+ sampler_info.maxLod = max_lod
41
+
42
+ handle_p = Vulkan.create_value('void *', nil)
43
+ check_result vk.vkCreateSampler(vk.device, sampler_info, nil, handle_p)
44
+ @handle = handle_p.value
45
+ finalize_with vk, :vkDestroySampler, vk.device, @handle, nil
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,16 @@
1
+ module Vulkan
2
+ class Semaphore
3
+ include Vulkan::Checks
4
+ include Vulkan::Finalizer
5
+
6
+ def initialize(vk)
7
+ @vk = vk
8
+ semaphore_info = VkSemaphoreCreateInfo.malloc
9
+ semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
10
+ sem_p = Vulkan.create_value('void *', nil)
11
+ check_result @vk.vkCreateSemaphore(@vk.device, semaphore_info, nil, sem_p)
12
+ @handle = sem_p.value
13
+ finalize_with @vk, :vkDestroySemaphore, @vk.device, @handle, nil
14
+ end
15
+ end
16
+ end