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,25 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(binding = 0) uniform UniformBufferObject {
5
+ mat4 model;
6
+ mat4 view;
7
+ mat4 proj;
8
+ } ubo;
9
+
10
+ layout(location = 0) in vec3 inPosition;
11
+ layout(location = 1) in vec3 inColor;
12
+ layout(location = 2) in vec2 inTexCoord;
13
+
14
+ layout(location = 0) out vec3 fragColor;
15
+ layout(location = 1) out vec2 fragTexCoord;
16
+
17
+ out gl_PerVertex {
18
+ vec4 gl_Position;
19
+ };
20
+
21
+ void main() {
22
+ gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);
23
+ fragColor = inColor;
24
+ fragTexCoord = inTexCoord;
25
+ }
@@ -0,0 +1,13 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(binding = 1) uniform sampler2D texSampler;
5
+
6
+ layout(location = 0) in vec3 fragColor;
7
+ layout(location = 1) in vec2 fragTexCoord;
8
+
9
+ layout(location = 0) out vec4 outColor;
10
+
11
+ void main() {
12
+ outColor = vec4(fragColor * texture(texSampler, fragTexCoord).rgb, 1.0);
13
+ }
@@ -0,0 +1,25 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(binding = 0) uniform UniformBufferObject {
5
+ mat4 model;
6
+ mat4 view;
7
+ mat4 proj;
8
+ } ubo;
9
+
10
+ layout(location = 0) in vec3 inPosition;
11
+ layout(location = 1) in vec3 inColor;
12
+ layout(location = 2) in vec2 inTexCoord;
13
+
14
+ layout(location = 0) out vec3 fragColor;
15
+ layout(location = 1) out vec2 fragTexCoord;
16
+
17
+ out gl_PerVertex {
18
+ vec4 gl_Position;
19
+ };
20
+
21
+ void main() {
22
+ gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);
23
+ fragColor = inColor;
24
+ fragTexCoord = inTexCoord;
25
+ }
@@ -0,0 +1,13 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(binding = 1) uniform sampler2D texSampler;
5
+
6
+ layout(location = 0) in vec3 fragColor;
7
+ layout(location = 1) in vec2 fragTexCoord;
8
+
9
+ layout(location = 0) out vec4 outColor;
10
+
11
+ void main() {
12
+ outColor = vec4(fragColor * texture(texSampler, fragTexCoord * 2.0).rgb, 1.0);
13
+ }
Binary file
@@ -0,0 +1,25 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(binding = 0) uniform UniformBufferObject {
5
+ mat4 model;
6
+ mat4 view;
7
+ mat4 proj;
8
+ } ubo;
9
+
10
+ layout(location = 0) in vec2 inPosition;
11
+ layout(location = 1) in vec3 inColor;
12
+ layout(location = 2) in vec2 inTexCoord;
13
+
14
+ layout(location = 0) out vec3 fragColor;
15
+ layout(location = 1) out vec2 fragTexCoord;
16
+
17
+ out gl_PerVertex {
18
+ vec4 gl_Position;
19
+ };
20
+
21
+ void main() {
22
+ gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
23
+ fragColor = inColor;
24
+ fragTexCoord = inTexCoord;
25
+ }
Binary file
@@ -0,0 +1,10 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(location = 0) in vec3 fragColor;
5
+
6
+ layout(location = 0) out vec4 outColor;
7
+
8
+ void main() {
9
+ outColor = vec4(fragColor, 1.0);
10
+ }
Binary file
@@ -0,0 +1,25 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ out gl_PerVertex {
5
+ vec4 gl_Position;
6
+ };
7
+
8
+ layout(location = 0) out vec3 fragColor;
9
+
10
+ vec2 positions[3] = vec2[](
11
+ vec2(0.0, -0.5),
12
+ vec2(-0.5, 0.5),
13
+ vec2(0.5, 0.5)
14
+ );
15
+
16
+ vec3 colors[3] = vec3[](
17
+ vec3(1.0, 0.0, 0.0),
18
+ vec3(0.0, 1.0, 0.0),
19
+ vec3(0.0, 0.0, 1.0)
20
+ );
21
+
22
+ void main() {
23
+ gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
24
+ fragColor = colors[gl_VertexIndex];
25
+ }
Binary file
@@ -0,0 +1,22 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(binding = 0) uniform UniformBufferObject {
5
+ mat4 model;
6
+ mat4 view;
7
+ mat4 proj;
8
+ } ubo;
9
+
10
+ layout(location = 0) in vec2 inPosition;
11
+ layout(location = 1) in vec3 inColor;
12
+
13
+ layout(location = 0) out vec3 fragColor;
14
+
15
+ out gl_PerVertex {
16
+ vec4 gl_Position;
17
+ };
18
+
19
+ void main() {
20
+ gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
21
+ fragColor = inColor;
22
+ }
@@ -0,0 +1,16 @@
1
+ #version 450
2
+ #extension GL_ARB_separate_shader_objects : enable
3
+
4
+ layout(location = 0) in vec2 inPosition;
5
+ layout(location = 1) in vec3 inColor;
6
+
7
+ layout(location = 0) out vec3 fragColor;
8
+
9
+ out gl_PerVertex {
10
+ vec4 gl_Position;
11
+ };
12
+
13
+ void main() {
14
+ gl_Position = vec4(inPosition, 0.0, 1.0);
15
+ fragColor = inColor;
16
+ }
Binary file
Binary file
@@ -0,0 +1,24 @@
1
+ require 'bundler/setup'
2
+ require 'simplecov'
3
+ require 'vulkan'
4
+ require 'pp'
5
+
6
+ puts 'SUPPORTED EXTENSIONS'
7
+ puts '--------------------'
8
+ puts
9
+ pp Vulkan::Instance.extensions
10
+ puts
11
+ puts
12
+
13
+ puts 'SUPPORTED LAYERS'
14
+ puts '--------------------'
15
+ puts
16
+ pp Vulkan::Instance.layers
17
+ puts
18
+ puts
19
+
20
+ puts 'PHYSICAL DEVICES'
21
+ puts '----------------'
22
+ puts
23
+ pp Vulkan::Instance.new(extensions: []).physical_devices.map { |dev| dev.to_hash }
24
+ puts
@@ -0,0 +1,140 @@
1
+ # https://vulkan-tutorial.com/code/16_swap_chain_recreation.cpp
2
+
3
+ require 'bundler/setup'
4
+ require 'simplecov'
5
+ require 'vulkan'
6
+ require 'sdl2_vulkan'
7
+
8
+ # Create a window that we plan to draw to
9
+ SDL2.init(SDL2::INIT_EVERYTHING)
10
+ window = SDL2::Window.create "Hello Triangle", 0, 0, 640, 480,
11
+ SDL2::Window::Flags::VULKAN |
12
+ SDL2::Window::Flags::RESIZABLE |
13
+ 0x00002000 # SDL2::Window::Flags::ALLOW_HIGHDPI
14
+
15
+ # Create a Vulkan instance
16
+ instance = Vulkan::Instance.new extensions: window.vk_instance_extensions
17
+
18
+ # Create a rendering surface
19
+ surface = instance.create_window_surface(window)
20
+
21
+ # Choose an adequate physical device
22
+ dev = instance.physical_devices.detect do |dev|
23
+ next false unless swapchain_surface_info = dev.swapchain_surface_info(surface)
24
+ builder = Vulkan::SwapchainBuilder.new(swapchain_surface_info)
25
+ dev.properties[:device_type] == :discrete_gpu &&
26
+ (builder.format rescue false) && (builder.presentation_mode rescue false)
27
+ end
28
+ raise 'could not find a suitable physical device' unless dev
29
+
30
+ # Find a queue family that supports graphics
31
+ graphics_queue_family = dev.queue_families.detect do |family|
32
+ family[:queue_count] > 0 && family.supports?(:graphics)
33
+ end
34
+ raise 'no graphics queue family available' unless graphics_queue_family
35
+
36
+ # Find a queue family that supports presentation to the rendering surface
37
+ presentation_queue_family = dev.queue_families.detect do |family|
38
+ family[:queue_count] > 0 && family.supports_presentation?(surface)
39
+ end
40
+ raise 'no graphics queue family available' unless presentation_queue_family
41
+
42
+ # Create a logical device along with the needed extensions and chosen queues
43
+ if graphics_queue_family == presentation_queue_family
44
+ device = dev.create queues: [{ family: graphics_queue_family, priorities: [1.0] }],
45
+ extensions: ['VK_KHR_swapchain']
46
+ presentation_queue = graphics_queue = device.queue_families[0][:queues][0]
47
+ else
48
+ device = dev.create queues: [{ family: graphics_queue_family, priorities: [1.0] },
49
+ { family: presentation_queue_family, priorities: [1.0] }],
50
+ extensions: ['VK_KHR_swapchain']
51
+ graphics_queue = device.queue_families[0][:queues][0]
52
+ presentation_queue = device.queue_families[1][:queues][0]
53
+ end
54
+
55
+ command_pool = device.create_command_pool queue_family: graphics_queue_family
56
+
57
+ shader_stages = [
58
+ device.create_shader_stage(file_path: File.expand_path('./shaders/triangle.vert.spv', __dir__),
59
+ stage: Vulkan::VK_SHADER_STAGE_VERTEX_BIT),
60
+ device.create_shader_stage(file_path: File.expand_path('./shaders/triangle.frag.spv', __dir__),
61
+ stage: Vulkan::VK_SHADER_STAGE_FRAGMENT_BIT)
62
+ ]
63
+
64
+ rebuild_swap_chain = proc do
65
+ # Create a swapchain for image presentation
66
+ $swapchain = device.create_swapchain surface: surface,
67
+ surface_width: window.vk_drawable_size[0],
68
+ surface_height: window.vk_drawable_size[1]
69
+
70
+ # Create render pass with one subpass
71
+ render_pass = device.create_renderpass
72
+ subpass = render_pass.add_subpass
73
+ subpass.add_color_attachment_ref index: render_pass.add_attachment(format: $swapchain.format),
74
+ layout: :color
75
+ render_pass.commit
76
+
77
+ # Create a framebuffer for each image in the swap chain
78
+ framebuffers = $swapchain.image_views.map do |swapchain_image_view|
79
+ device.create_framebuffer(width: $swapchain.width,
80
+ height: $swapchain.height,
81
+ render_pass: render_pass,
82
+ attachments: [swapchain_image_view])
83
+ end
84
+
85
+ # Create graphic pipeline
86
+ pipeline = device.create_pipeline(viewport: { width: $swapchain.width, height: $swapchain.height })
87
+ shader_stages.each { |stage| pipeline.add_shader_stage(stage) }
88
+ pipeline.commit(render_pass)
89
+
90
+ $command_buffers = command_pool.create_command_buffers(framebuffers.size) do |cmd, index|
91
+ cmd.render_pass(render_pass, framebuffer: framebuffers[index]) do
92
+ cmd.bind_pipeline(:graphics, pipeline)
93
+ cmd.draw(3, 1, 0, 0)
94
+ end
95
+ end
96
+ end
97
+
98
+ rebuild_swap_chain.call
99
+
100
+ MAX_FRAMES_IN_FLIGHT = 2
101
+ image_available_semaphores = MAX_FRAMES_IN_FLIGHT.times.map { device.create_semaphore }
102
+ render_finished_semaphores = MAX_FRAMES_IN_FLIGHT.times.map { device.create_semaphore }
103
+ in_flight_fences = MAX_FRAMES_IN_FLIGHT.times.map { device.create_fence signaled: true }
104
+ current_frame = 0
105
+ frame_counter = 0
106
+ done = false
107
+
108
+ # Begin main event loop & drawing
109
+ until done
110
+ frame_counter += 1
111
+ break if ENV['MAX_FRAMES'].to_i == frame_counter
112
+ while event = SDL2::Event.poll
113
+ case event
114
+ when SDL2::Event::Quit, SDL2::Event::KeyDown then done = true
115
+ when SDL2::Event::Window::RESIZED then rebuild_swap_chain.call
116
+ end
117
+ end
118
+
119
+ begin
120
+ in_flight_fences[current_frame].wait_and_reset
121
+ image_index = $swapchain.next_image_index(semaphore: image_available_semaphores[current_frame])
122
+ graphics_queue.submit([$command_buffers[image_index]],
123
+ wait_semaphores: [image_available_semaphores[current_frame]],
124
+ wait_stages: [Vulkan::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT],
125
+ signal_semaphores: [render_finished_semaphores[current_frame]],
126
+ fence: in_flight_fences[current_frame])
127
+ presentation_queue.present(swapchains: [$swapchain],
128
+ image_indices: [image_index],
129
+ wait_semaphores: [render_finished_semaphores[current_frame]])
130
+ current_frame = (current_frame + 1) % MAX_FRAMES_IN_FLIGHT
131
+ rescue Vulkan::Error
132
+ case $!.code
133
+ when Vulkan::VK_ERROR_OUT_OF_DATE_KHR, Vulkan::VK_SUBOPTIMAL_KHR
134
+ rebuild_swap_chain.call
135
+ else raise
136
+ end
137
+ end
138
+ end
139
+
140
+ in_flight_fences.each { |fence| fence.wait_and_reset }
@@ -0,0 +1,164 @@
1
+ # https://vulkan-tutorial.com/code/18_vertex_buffer.cpp
2
+
3
+ require 'bundler/setup'
4
+ require 'simplecov'
5
+ require 'vulkan'
6
+ require 'sdl2_vulkan'
7
+
8
+ Vertex = Vulkan.struct(['float pos[2]', 'float color[3]'])
9
+ VertexData = Vulkan.struct('vertices[3]' => Vertex).malloc
10
+ VertexData.vertices[0].pos = [ 0, -0.5]; VertexData.vertices[0].color = [1, 0, 0]
11
+ VertexData.vertices[1].pos = [-0.5, 0.5]; VertexData.vertices[1].color = [0, 1, 0]
12
+ VertexData.vertices[2].pos = [ 0.5, 0.5]; VertexData.vertices[2].color = [0, 0, 1]
13
+
14
+ # Create a window that we plan to draw to
15
+ SDL2.init(SDL2::INIT_EVERYTHING)
16
+ window = SDL2::Window.create "test-vulkan", 0, 0, 640, 480, SDL2::Window::Flags::VULKAN |
17
+ SDL2::Window::Flags::RESIZABLE |
18
+ 0x00002000 # SDL2::Window::Flags::ALLOW_HIGHDPI
19
+
20
+ # Create a Vulkan instance
21
+ instance = Vulkan::Instance.new extensions: window.vk_instance_extensions
22
+
23
+ # Create a rendering surface
24
+ surface = instance.create_window_surface(window)
25
+
26
+ # Choose an adequate physical device
27
+ dev = instance.physical_devices.detect do |dev|
28
+ next false unless swapchain_surface_info = dev.swapchain_surface_info(surface)
29
+ builder = Vulkan::SwapchainBuilder.new(swapchain_surface_info)
30
+ dev.properties[:device_type] == :discrete_gpu &&
31
+ (builder.format rescue false) && (builder.presentation_mode rescue false)
32
+ end
33
+ raise 'could not find a suitable physical device' unless dev
34
+
35
+ # Find a queue family that supports graphics
36
+ graphics_queue_family = dev.queue_families.detect do |family|
37
+ family[:queue_count] > 0 && family.supports?(:graphics)
38
+ end
39
+ raise 'no graphics queue family available' unless graphics_queue_family
40
+
41
+ # Find a queue family that supports presentation to the rendering surface
42
+ presentation_queue_family = dev.queue_families.detect do |family|
43
+ family[:queue_count] > 0 && family.supports_presentation?(surface)
44
+ end
45
+ raise 'no graphics queue family available' unless presentation_queue_family
46
+
47
+ # Create a logical device along with the needed extensions and chosen queues
48
+ if graphics_queue_family == presentation_queue_family
49
+ device = dev.create queues: [{ family: graphics_queue_family, priorities: [1.0] }],
50
+ extensions: ['VK_KHR_swapchain']
51
+ presentation_queue = graphics_queue = device.queue_families[0][:queues][0]
52
+ else
53
+ device = dev.create queues: [{ family: graphics_queue_family, priorities: [1.0] },
54
+ { family: presentation_queue_family, priorities: [1.0] }],
55
+ extensions: ['VK_KHR_swapchain']
56
+ graphics_queue = device.queue_families[0][:queues][0]
57
+ presentation_queue = device.queue_families[1][:queues][0]
58
+ end
59
+
60
+ VertexBuffer = device.create_buffer size: VertexData.class.size, usage: Vulkan::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
61
+ VertexBuffer.map do |data|
62
+ data[0, VertexData.class.size] = VertexData[0, VertexData.class.size]
63
+ end
64
+
65
+ command_pool = device.create_command_pool queue_family: graphics_queue_family
66
+
67
+ shader_stages = [
68
+ device.create_shader_stage(file_path: File.expand_path('./shaders/vertex_buffer.vert.spv', __dir__),
69
+ stage: Vulkan::VK_SHADER_STAGE_VERTEX_BIT),
70
+ device.create_shader_stage(file_path: File.expand_path('./shaders/triangle.frag.spv', __dir__),
71
+ stage: Vulkan::VK_SHADER_STAGE_FRAGMENT_BIT)
72
+ ]
73
+
74
+ rebuild_swap_chain = proc do
75
+ # Create a swapchain for image presentation
76
+ $swapchain = device.create_swapchain surface: surface,
77
+ surface_width: window.vk_drawable_size[0],
78
+ surface_height: window.vk_drawable_size[1]
79
+
80
+ # Create render pass with one subpass
81
+ render_pass = device.create_renderpass
82
+ subpass = render_pass.add_subpass
83
+ subpass.add_color_attachment_ref index: render_pass.add_attachment(format: $swapchain.format),
84
+ layout: :color
85
+ render_pass.commit
86
+
87
+ # Create a framebuffer for each image in the swap chain
88
+ framebuffers = $swapchain.image_views.map do |swapchain_image_view|
89
+ device.create_framebuffer(width: $swapchain.width,
90
+ height: $swapchain.height,
91
+ render_pass: render_pass,
92
+ attachments: [swapchain_image_view])
93
+ end
94
+
95
+ # Create graphic pipeline
96
+ pipeline = device.create_pipeline(viewport: { width: $swapchain.width, height: $swapchain.height })
97
+ pipeline.add_binding_description binding: 0,
98
+ stride: Vertex.size,
99
+ input_rate: Vulkan::VK_VERTEX_INPUT_RATE_VERTEX
100
+
101
+ pipeline.add_attribute_description binding: 0,
102
+ location: 0,
103
+ format: Vulkan::VK_FORMAT_R32G32_SFLOAT,
104
+ offset: Vertex.offsetof('pos')
105
+
106
+ pipeline.add_attribute_description binding: 0,
107
+ location: 1,
108
+ format: Vulkan::VK_FORMAT_R32G32B32_SFLOAT,
109
+ offset: Vertex.offsetof('color')
110
+ shader_stages.each { |stage| pipeline.add_shader_stage(stage) }
111
+ pipeline.commit(render_pass)
112
+
113
+ $command_buffers = command_pool.create_command_buffers(framebuffers.size) do |cmd, index|
114
+ cmd.render_pass(render_pass, framebuffer: framebuffers[index]) do
115
+ cmd.bind_pipeline(:graphics, pipeline)
116
+ cmd.bind_vertex_buffer(VertexBuffer)
117
+ cmd.draw(VertexData.vertices.size, 1, 0, 0)
118
+ end
119
+ end
120
+ end
121
+
122
+ rebuild_swap_chain.call
123
+
124
+ MAX_FRAMES_IN_FLIGHT = 2
125
+ image_available_semaphores = MAX_FRAMES_IN_FLIGHT.times.map { device.create_semaphore }
126
+ render_finished_semaphores = MAX_FRAMES_IN_FLIGHT.times.map { device.create_semaphore }
127
+ in_flight_fences = MAX_FRAMES_IN_FLIGHT.times.map { device.create_fence signaled: true }
128
+ current_frame = 0
129
+ frame_counter = 0
130
+ done = false
131
+
132
+ # Begin main event loop & drawing
133
+ until done
134
+ frame_counter += 1
135
+ break if ENV['MAX_FRAMES'].to_i == frame_counter
136
+ while event = SDL2::Event.poll
137
+ case event
138
+ when SDL2::Event::Quit, SDL2::Event::KeyDown then done = true
139
+ when SDL2::Event::Window::RESIZED then rebuild_swap_chain.call
140
+ end
141
+ end
142
+
143
+ begin
144
+ in_flight_fences[current_frame].wait_and_reset
145
+ image_index = $swapchain.next_image_index(semaphore: image_available_semaphores[current_frame])
146
+ graphics_queue.submit([$command_buffers[image_index]],
147
+ wait_semaphores: [image_available_semaphores[current_frame]],
148
+ wait_stages: [Vulkan::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT],
149
+ signal_semaphores: [render_finished_semaphores[current_frame]],
150
+ fence: in_flight_fences[current_frame])
151
+ presentation_queue.present(swapchains: [$swapchain],
152
+ image_indices: [image_index],
153
+ wait_semaphores: [render_finished_semaphores[current_frame]])
154
+ current_frame = (current_frame + 1) % MAX_FRAMES_IN_FLIGHT
155
+ rescue Vulkan::Error
156
+ case $!.code
157
+ when Vulkan::VK_ERROR_OUT_OF_DATE_KHR, Vulkan::VK_SUBOPTIMAL_KHR
158
+ rebuild_swap_chain.call
159
+ else raise
160
+ end
161
+ end
162
+ end
163
+
164
+ in_flight_fences.each { |fence| fence.wait_and_reset }