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,344 @@
1
+ # https://vulkan-tutorial.com/code/29_multisampling.cpp
2
+
3
+ require 'bundler/setup'
4
+ require 'simplecov'
5
+ require 'vulkan'
6
+ require 'sdl2_vulkan'
7
+ require 'cglm'
8
+ require 'chunky_png'
9
+ require 'oily_png'
10
+ require 'tiny_obj'
11
+
12
+ include CGLM
13
+ UniformBufferStruct = Vulkan.struct(['float model[16]', 'float view[16]', 'float proj[16]'])
14
+ def UniformBufferStruct.alignment; Mat4.alignment; end
15
+ $ubo = UniformBufferStruct.new(CGLM.alloc(UniformBufferStruct))
16
+ $model_matrix = Mat4.new(addr: $ubo.to_ptr + UniformBufferStruct.offsetof('model'))
17
+ $view_matrix = Mat4.new(addr: $ubo.to_ptr + UniformBufferStruct.offsetof('view'))
18
+ $projection_matrix = Mat4.new(addr: $ubo.to_ptr + UniformBufferStruct.offsetof('proj'))
19
+
20
+ obj = TinyOBJ.load(File.expand_path('models/viking_room.obj', __dir__))
21
+ NUM_INDICES = obj.num_indices
22
+ Vertex = Vulkan.struct(['float pos[3]', 'float color[3]', 'float texcoords[2]'])
23
+ IndexData = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT * NUM_INDICES)
24
+ VertexData = Fiddle::Pointer.malloc(Vertex.size * obj.num_distinct_vertices)
25
+ obj.fill_buffers index_type: :uint32,
26
+ index_stride: Fiddle::SIZEOF_INT,
27
+ vertex_stride: Vertex.size,
28
+ flip_v: true,
29
+ indices: IndexData,
30
+ positions: VertexData,
31
+ colors: VertexData + Vertex.offsetof('color'),
32
+ texcoords: VertexData + Vertex.offsetof('texcoords')
33
+
34
+ # Create a window that we plan to draw to
35
+ SDL2.init(SDL2::INIT_EVERYTHING)
36
+ window = SDL2::Window.create "test-vulkan", 0, 0, 640, 480, SDL2::Window::Flags::VULKAN |
37
+ SDL2::Window::Flags::RESIZABLE |
38
+ 0x00002000 # SDL2::Window::Flags::ALLOW_HIGHDPI
39
+
40
+ # Create a Vulkan instance
41
+ instance = Vulkan::Instance.new extensions: window.vk_instance_extensions
42
+
43
+ # Create a rendering surface
44
+ surface = instance.create_window_surface(window)
45
+
46
+ # Choose an adequate physical device
47
+ dev = instance.physical_devices.detect do |dev|
48
+ next false unless swapchain_surface_info = dev.swapchain_surface_info(surface)
49
+ builder = Vulkan::SwapchainBuilder.new(swapchain_surface_info)
50
+ dev.properties[:device_type] == :discrete_gpu &&
51
+ (builder.format rescue false) && (builder.presentation_mode rescue false)
52
+ end
53
+ raise 'could not find a suitable physical device' unless dev
54
+
55
+ # Find a queue family that supports graphics
56
+ graphics_queue_family = dev.queue_families.detect do |family|
57
+ family[:queue_count] > 0 && family.supports?(:graphics)
58
+ end
59
+ raise 'no graphics queue family available' unless graphics_queue_family
60
+
61
+ # Find a queue family that supports presentation to the rendering surface
62
+ presentation_queue_family = dev.queue_families.detect do |family|
63
+ family[:queue_count] > 0 && family.supports_presentation?(surface)
64
+ end
65
+ raise 'no graphics queue family available' unless presentation_queue_family
66
+
67
+ # Create a logical device along with the needed extensions and chosen queues
68
+ if graphics_queue_family == presentation_queue_family
69
+ device = dev.create queues: [{ family: graphics_queue_family, priorities: [1.0] }],
70
+ extensions: ['VK_KHR_swapchain']
71
+ presentation_queue = graphics_queue = device.queue_families[0][:queues][0]
72
+ else
73
+ device = dev.create queues: [{ family: graphics_queue_family, priorities: [1.0] },
74
+ { family: presentation_queue_family, priorities: [1.0] }],
75
+ extensions: ['VK_KHR_swapchain']
76
+ graphics_queue = device.queue_families[0][:queues][0]
77
+ presentation_queue = device.queue_families[1][:queues][0]
78
+ end
79
+
80
+ command_pool = device.create_command_pool queue_family: graphics_queue_family
81
+
82
+ # Populate the vertex buffer
83
+ staging_buffer = device.create_buffer size: VertexData.size, usage: :transfer_src
84
+ staging_buffer.map { |data| data[0, VertexData.size] = VertexData[0, VertexData.size] }
85
+ VertexBuffer = device.create_buffer size: VertexData.size,
86
+ usage: [ :transfer_dst, :vertex_buffer ],
87
+ properties: :device_local
88
+ vertex_transfer_buffer = command_pool.create_command_buffer(usage: :one_time_submit) { |cmd| cmd.copy_buffer staging_buffer, VertexBuffer }
89
+
90
+ # Populate the index buffer
91
+ staging_buffer = device.create_buffer size: IndexData.size, usage: :transfer_src
92
+ staging_buffer.map { |data| data[0, IndexData.size] = IndexData[0, IndexData.size] }
93
+ IndexBuffer = device.create_buffer size: IndexData.size,
94
+ usage: [ :transfer_dst, :index_buffer ],
95
+ properties: :device_local
96
+ index_transfer_buffer = command_pool.create_command_buffer(usage: :one_time_submit) { |cmd| cmd.copy_buffer staging_buffer, IndexBuffer }
97
+
98
+ # Submit both transfers and wait for them to complete
99
+ graphics_queue.submit([vertex_transfer_buffer, index_transfer_buffer])
100
+ # graphics_queue.wait_until_idle
101
+
102
+ UniformBuffers = []
103
+
104
+ png = ChunkyPNG::Image.from_file(File.expand_path('textures/viking_room.png', __dir__))
105
+ num_mip_levels = Vulkan.num_mip_levels(png.width, png.height)
106
+ texture = device.create_image dimensions: 2,
107
+ width: png.width,
108
+ height: png.height,
109
+ depth: 1,
110
+ mip_levels: num_mip_levels,
111
+ array_layers: 1,
112
+ format: :r8g8b8a8_unorm,
113
+ tiling: :optimal,
114
+ initial_layout: :undefined,
115
+ usage: [:transfer_dst, :sampled],
116
+ sharing: :exclusive,
117
+ samples: 1
118
+ texture.transition_layout command_pool, graphics_queue, to: :transfer_dst_optimal
119
+ num_mip_levels.times do |mip_level|
120
+ image_data = png.to_rgba_stream
121
+ image_data_buffer = device.create_buffer size: image_data.size,
122
+ usage: :transfer_src,
123
+ properties: [:host_visible, :host_coherent]
124
+ image_data_buffer.map { |data| data[0, image_data.size] = image_data }
125
+ texture.copy_from_buffer command_pool, graphics_queue, buffer: image_data_buffer,
126
+ width: png.width,
127
+ height: png.height,
128
+ mip_level: mip_level
129
+ png.resample_bilinear! png.width == 1 ? png.width : png.width / 2,
130
+ png.height == 1 ? png.height : png.height / 2
131
+ end
132
+ graphics_queue.wait_until_idle
133
+ texture.transition_layout command_pool, graphics_queue, to: :shader_ro_optimal
134
+ texture_view = texture.create_view
135
+ sampler = device.create_sampler max_lod: num_mip_levels#, min_lod: num_mip_levels / 2
136
+
137
+ shader_stages = [
138
+ device.create_shader_stage(file_path: File.expand_path('./shaders/model_loading.vert.spv', __dir__),
139
+ stage: Vulkan::VK_SHADER_STAGE_VERTEX_BIT),
140
+ device.create_shader_stage(file_path: File.expand_path('./shaders/model_loading.frag.spv', __dir__),
141
+ stage: Vulkan::VK_SHADER_STAGE_FRAGMENT_BIT)
142
+ ]
143
+
144
+ rebuild_swap_chain = proc do
145
+ # Create a swapchain for image presentation
146
+ $swapchain = device.create_swapchain surface: surface,
147
+ surface_width: window.vk_drawable_size[0],
148
+ surface_height: window.vk_drawable_size[1]
149
+
150
+ depth_format = device.physical_device.detect_supported_format(
151
+ :d32_sfloat, :d32_sfloat_s8_uint, :d24_unorm_s8_uint,
152
+ usage: :depth_stencil_attachment,
153
+ tiling: :optimal
154
+ )
155
+
156
+ color_image = device.create_image dimensions: 2,
157
+ width: $swapchain.width,
158
+ height: $swapchain.height,
159
+ depth: 1,
160
+ format: $swapchain.format,
161
+ usage: [:transient_attachment, :color_attachment],
162
+ samples: device.max_samples
163
+ color_image_view = color_image.create_view
164
+ color_image.transition_layout command_pool, graphics_queue, to: :color_attachment_optimal
165
+
166
+ depth_image = device.create_image dimensions: 2,
167
+ width: $swapchain.width,
168
+ height: $swapchain.height,
169
+ depth: 1,
170
+ format: depth_format,
171
+ usage: [:depth_stencil_attachment],
172
+ samples: device.max_samples
173
+ depth_image_view = depth_image.create_view aspects: :depth
174
+ depth_image.transition_layout command_pool, graphics_queue, to: :depth_stencil_attachment_optimal,
175
+ aspects: :depth
176
+
177
+ # Create render pass with one subpass
178
+ render_pass = device.create_renderpass
179
+ subpass = render_pass.add_subpass
180
+ subpass.add_color_attachment_ref index: render_pass.add_attachment(format: $swapchain.format,
181
+ final_layout: :color_attachment_optimal,
182
+ samples: device.max_samples)
183
+ subpass.set_depth_stencil_attachment_ref index: render_pass.add_attachment(format: depth_format,
184
+ samples: device.max_samples,
185
+ load_op: :clear,
186
+ store_op: :dont_care,
187
+ stencil_load_op: :dont_care,
188
+ stencil_store_op: :dont_care,
189
+ initial_layout: nil,
190
+ final_layout: :depth_stencil_attachment)
191
+ # subpass.add_color_attachment_ref index: render_pass.add_attachment(format: $swapchain.format,
192
+ # final_layout: :presentation_src)
193
+ subpass.add_resolve_attachment_ref index: render_pass.add_attachment(format: $swapchain.format,
194
+ final_layout: :presentation_src,
195
+ load_op: :dont_care)
196
+ render_pass.commit
197
+
198
+ # Create a framebuffer for each image in the swap chain, and associate each with the depth image
199
+ framebuffers = $swapchain.image_views.map do |swapchain_image_view|
200
+ device.create_framebuffer(width: $swapchain.width,
201
+ height: $swapchain.height,
202
+ render_pass: render_pass,
203
+ attachments: [color_image_view,
204
+ depth_image_view,
205
+ swapchain_image_view])
206
+ end
207
+
208
+ # Create graphic pipeline
209
+ pipeline = device.create_pipeline(viewport: { width: $swapchain.width, height: $swapchain.height })
210
+ pipeline.multisampling[:samples] = device.max_samples
211
+ pipeline.multisampling[:sample_shading] = true
212
+ pipeline.depth
213
+ pipeline.add_binding_description binding: 0,
214
+ stride: Vertex.size,
215
+ input_rate: :vertex
216
+
217
+ pipeline.add_attribute_description binding: 0,
218
+ location: 0,
219
+ format: :r32g32b32_sfloat,
220
+ offset: 0
221
+
222
+ pipeline.add_attribute_description binding: 0,
223
+ location: 1,
224
+ format: :r32g32b32_sfloat,
225
+ offset: Fiddle::SIZEOF_FLOAT * 3
226
+
227
+ pipeline.add_attribute_description binding: 0,
228
+ location: 2,
229
+ format: :r32g32_sfloat,
230
+ offset: Fiddle::SIZEOF_FLOAT * 6
231
+
232
+ # Create a uniform buffer for each image in the swapchain, so that we don't
233
+ # modify a buffer for a frame still in-flight
234
+ UniformBuffers.clear
235
+ $swapchain.size.times do |i|
236
+ UniformBuffers[i] = device.create_buffer size: UniformBufferStruct.size,
237
+ usage: Vulkan::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
238
+ properties: [:host_visible, :host_coherent]
239
+ end
240
+ descriptor_set_pool = device.create_descriptor_set_pool pool_sizes: [
241
+ {type: :uniform_buffer, count: $swapchain.size},
242
+ {type: :combined_image_sampler, count: $swapchain.size}
243
+ ],
244
+ max_sets: $swapchain.size
245
+ descriptor_set_layout = pipeline.add_descriptor_set_layout descriptors: [{
246
+ binding: 0,
247
+ type: :uniform_buffer,
248
+ stages: [:vertex]
249
+ }, {
250
+ binding: 1,
251
+ type: :combined_image_sampler,
252
+ stages: [:fragment]
253
+ }]
254
+ descriptor_sets = descriptor_set_pool.alloc(layouts: [descriptor_set_layout] * $swapchain.size)
255
+ descriptor_sets.each_with_index do |set, i|
256
+ set[0].set_buffer UniformBuffers[i]
257
+ set[1].set_image_view_and_sampler texture_view, sampler
258
+ set.commit
259
+ end
260
+
261
+ shader_stages.each { |stage| pipeline.add_shader_stage(stage) }
262
+ pipeline.commit(render_pass)
263
+
264
+ $command_buffers = command_pool.create_command_buffers(framebuffers.size) do |cmd, index|
265
+ cmd.render_pass(render_pass, framebuffer: framebuffers[index]) do
266
+ cmd.bind_pipeline(:graphics, pipeline)
267
+ cmd.bind_vertex_buffer(VertexBuffer)
268
+ cmd.bind_index_buffer(IndexBuffer, type: :uint32)
269
+ cmd.bind_descriptor_set(:graphics, descriptor_sets[index], pipeline_layout: pipeline.layout)
270
+ cmd.draw_indexed(NUM_INDICES, 1, 0, 0, 0)
271
+ end
272
+ end
273
+ end
274
+
275
+ rebuild_swap_chain.call
276
+
277
+ MAX_FRAMES_IN_FLIGHT = 2
278
+ image_available_semaphores = MAX_FRAMES_IN_FLIGHT.times.map { device.create_semaphore }
279
+ render_finished_semaphores = MAX_FRAMES_IN_FLIGHT.times.map { device.create_semaphore }
280
+ in_flight_fences = MAX_FRAMES_IN_FLIGHT.times.map { device.create_fence signaled: true }
281
+ current_frame = 0
282
+ frame_counter = 0
283
+ start_time = Time.now
284
+ done = false
285
+
286
+ Mat4.look_at Vec3.new([2, 2, 2]), Vec3.zero, Vec3.new([0, 0, 1]), $view_matrix
287
+ Mat4.perspective $projection_matrix, fovy: 45.to_radians,
288
+ aspect: $swapchain.width.to_f / $swapchain.height.to_f,
289
+ near: 0.1,
290
+ far: 10
291
+ # Convert OpenGL projection matrix into Vulkan projection matrix
292
+ # (e.g. NDC from z=-1..1 to z=0..1, and flip y)
293
+ $projection_matrix.mul_mat4 Mat4.new([Vec4.new([1.0, 0.0, 0.0, 0.0]),
294
+ Vec4.new([0.0, -1.0, 0.0, 0.0]),
295
+ Vec4.new([0.0, 0.0, 0.5, -0.5]),
296
+ Vec4.new([0.0, 0.0, 0.0, 1.0])]),
297
+ $projection_matrix
298
+ UniformBuffers.each { |b| b.map { |data| data[0, UniformBufferStruct.size] = $ubo[0, UniformBufferStruct.size] } }
299
+
300
+ # Begin main event loop & drawing
301
+ until done
302
+ frame_counter += 1
303
+ break if ENV['MAX_FRAMES'].to_i == frame_counter
304
+ # dump some FPS infos
305
+ uptime = ENV['TIME_STEP'] ? ENV['TIME_STEP'].to_f * frame_counter : Time.now - start_time
306
+ if frame_counter % 1000 == 0
307
+ fps = frame_counter / uptime
308
+ p ['fps: ', fps, 'frame-time (ms): ', 1000.0 / fps]
309
+ end
310
+ while event = SDL2::Event.poll
311
+ case event
312
+ when SDL2::Event::Quit then done = true
313
+ when SDL2::Event::Window::RESIZED then rebuild_swap_chain.call
314
+ end
315
+ end
316
+
317
+ begin
318
+ in_flight_fences[current_frame].wait
319
+ image_index = $swapchain.next_image_index(semaphore: image_available_semaphores[current_frame])
320
+ UniformBuffers[image_index].map do |data|
321
+ Mat4.identity $model_matrix
322
+ $model_matrix.rotate! Vec3.new([0, 0, 1]), uptime * 0.25 * 90.to_radians
323
+ data[0, Mat4.size] = $model_matrix.addr[0, Mat4.size]
324
+ end
325
+ in_flight_fences[current_frame].reset
326
+ graphics_queue.submit([$command_buffers[image_index]],
327
+ wait_semaphores: [image_available_semaphores[current_frame]],
328
+ wait_stages: [Vulkan::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT],
329
+ signal_semaphores: [render_finished_semaphores[current_frame]],
330
+ fence: in_flight_fences[current_frame])
331
+ presentation_queue.present(swapchains: [$swapchain],
332
+ image_indices: [image_index],
333
+ wait_semaphores: [render_finished_semaphores[current_frame]])
334
+ current_frame = (current_frame + 1) % MAX_FRAMES_IN_FLIGHT
335
+ rescue Vulkan::Error
336
+ case $!.code
337
+ when Vulkan::VK_ERROR_OUT_OF_DATE_KHR, Vulkan::VK_SUBOPTIMAL_KHR
338
+ rebuild_swap_chain.call
339
+ else raise
340
+ end
341
+ end
342
+ end
343
+
344
+ in_flight_fences.each { |fence| fence.wait_and_reset }
data/lib/fiddle_ext.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'fiddle'
2
+ require 'fiddle/import'
3
+
4
+ module Fiddle
5
+ class Pointer
6
+ # Copies data from the specified pointer into this one, starting at offset
7
+ # 0 and ending at either this pointer's size or the size of `other`,
8
+ # whichever is smaller.
9
+ def copy_from(other)
10
+ size = self.size > other.size ? other.size : self.size
11
+ self[0, size] = other[0, size]
12
+ self
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,66 @@
1
+ module Vulkan
2
+ class Buffer
3
+ include Vulkan::Checks
4
+ include Vulkan::Conversions
5
+ include Vulkan::Finalizer
6
+
7
+ attr_reader :memory
8
+ attr_reader :size
9
+ attr_reader :usage
10
+
11
+ def initialize(vk, physical_device, size:,
12
+ usage:,
13
+ sharing_mode: VK_SHARING_MODE_EXCLUSIVE,
14
+ flags: 0,
15
+ **memory_args)
16
+ @vk = vk
17
+ @size = size
18
+ @mapped = Vulkan.create_value('void *', nil)
19
+
20
+ buffer_info = VkBufferCreateInfo.malloc
21
+ buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO
22
+ buffer_info.size = size
23
+ buffer_info.usage = syms_to_buffer_usage_flags(usage)
24
+ buffer_info.sharingMode = sharing_mode
25
+ buffer_info.flags = flags
26
+ handle_p = Vulkan.create_value('void *', nil)
27
+ check_result @vk.vkCreateBuffer(vk.device, buffer_info, nil, handle_p)
28
+ @handle = handle_p.value
29
+ @memory = Vulkan::BufferMemory.new(@vk, physical_device, owner: self,
30
+ **memory_args)
31
+ finalize_with @vk, :vkDestroyBuffer, vk.device, @handle, nil
32
+ end
33
+
34
+ def map(*args, &block)
35
+ memory.map(*args, &block)
36
+ end
37
+
38
+ def flush(...)
39
+ memory.flush(...)
40
+ end
41
+
42
+ def flush_all(...)
43
+ memory.flush_all(...)
44
+ end
45
+
46
+ def invalidate(...)
47
+ memory.invalidate(...)
48
+ end
49
+
50
+ def invalidate_all(...)
51
+ memory.invalidate_all(...)
52
+ end
53
+
54
+ def mapped?
55
+ memory.mapped?
56
+ end
57
+
58
+ def unmap
59
+ memory.unmap
60
+ end
61
+
62
+ def data
63
+ memory.data
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ module Vulkan
2
+ class BufferMemory < Memory
3
+ def query_memory_requirements
4
+ VkMemoryRequirements.malloc.tap do |req|
5
+ @vk.vkGetBufferMemoryRequirements(@vk.device, @owner.to_ptr, req)
6
+ end
7
+ end
8
+
9
+ def bind
10
+ @vk.vkBindBufferMemory(@vk.device, @owner.to_ptr, to_ptr, 0);
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ module Vulkan
2
+ module Checks
3
+ # Checks whether the result was ok, raising the appropriate error if not.
4
+ def check_result(result)
5
+ case result
6
+ when VK_SUCCESS then return result
7
+ else raise Vulkan::Error::ResultCheckError, result
8
+ end
9
+ end
10
+
11
+ end
12
+ end