vulkan-ruby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.simplecov +6 -0
- data/.travis.yml +5 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +51 -0
- data/LICENSE.txt +21 -0
- data/README.md +93 -0
- data/Rakefile +14 -0
- data/bin/console +14 -0
- data/bin/setup +9 -0
- data/bin/setup.bat +2 -0
- data/examples/models/viking_room.obj +16053 -0
- data/examples/screenshots/vt10-viking_room.png +0 -0
- data/examples/shaders/depth_buffering.vert +25 -0
- data/examples/shaders/depth_buffering.vert.spv +0 -0
- data/examples/shaders/model_loading.frag +13 -0
- data/examples/shaders/model_loading.frag.spv +0 -0
- data/examples/shaders/model_loading.vert +25 -0
- data/examples/shaders/model_loading.vert.spv +0 -0
- data/examples/shaders/textures.frag +13 -0
- data/examples/shaders/textures.frag.spv +0 -0
- data/examples/shaders/textures.vert +25 -0
- data/examples/shaders/textures.vert.spv +0 -0
- data/examples/shaders/triangle.frag +10 -0
- data/examples/shaders/triangle.frag.spv +0 -0
- data/examples/shaders/triangle.vert +25 -0
- data/examples/shaders/triangle.vert.spv +0 -0
- data/examples/shaders/uniform_buffer.vert +22 -0
- data/examples/shaders/uniform_buffer.vert.spv +0 -0
- data/examples/shaders/vertex_buffer.vert +16 -0
- data/examples/shaders/vertex_buffer.vert.spv +0 -0
- data/examples/textures/texture.png +0 -0
- data/examples/textures/viking_room.png +0 -0
- data/examples/vt00_dump_info.rb +24 -0
- data/examples/vt01_triangle.rb +140 -0
- data/examples/vt02_vertex_buffer_triangle_host_visible.rb +164 -0
- data/examples/vt03_vertex_buffer_triangle_device_local.rb +174 -0
- data/examples/vt04_index_buffer_device_local.rb +193 -0
- data/examples/vt05_uniform_buffers.rb +237 -0
- data/examples/vt06_textures.rb +275 -0
- data/examples/vt07_depth_buffering.rb +315 -0
- data/examples/vt08_model_loading.rb +321 -0
- data/examples/vt09_mipmaps.rb +329 -0
- data/examples/vt10_multisampling.rb +344 -0
- data/lib/fiddle_ext.rb +15 -0
- data/lib/vulkan/buffer.rb +66 -0
- data/lib/vulkan/buffer_memory.rb +13 -0
- data/lib/vulkan/checks.rb +12 -0
- data/lib/vulkan/command_buffer.rb +380 -0
- data/lib/vulkan/command_pool.rb +28 -0
- data/lib/vulkan/conversions.rb +511 -0
- data/lib/vulkan/descriptor_pool.rb +45 -0
- data/lib/vulkan/descriptor_set.rb +86 -0
- data/lib/vulkan/descriptor_set_layout.rb +39 -0
- data/lib/vulkan/dispatch_table.rb +78 -0
- data/lib/vulkan/error.rb +43 -0
- data/lib/vulkan/fence.rb +32 -0
- data/lib/vulkan/finalizer.rb +43 -0
- data/lib/vulkan/framebuffer.rb +37 -0
- data/lib/vulkan/generated/commands.rb +298 -0
- data/lib/vulkan/generated/enums.rb +1049 -0
- data/lib/vulkan/generated/extensions/reserved_do_not_use_146.rb +8 -0
- data/lib/vulkan/generated/extensions/reserved_do_not_use_94.rb +8 -0
- data/lib/vulkan/generated/extensions/vk_amd_buffer_marker.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_draw_indirect_count.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_134.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_135.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_136.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_140.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_142.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_143.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_17.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_18.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_182.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_183.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_184.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_187.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_188.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_189.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_20.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_214.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_226.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_227.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_228.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_229.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_230.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_231.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_232.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_233.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_234.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_235.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_236.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_24.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_25.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_32.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_33.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_35.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_39.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_40.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_41.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_44.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_45.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_extension_46.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_gcn_shader.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_gpu_shader_half_float.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_gpu_shader_int16.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_memory_overallocation_behavior.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_amd_mixed_attachment_samples.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_negative_viewport_height.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_rasterization_order.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_ballot.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_core_properties.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_explicit_vertex_parameter.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_fragment_mask.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_image_load_store_lod.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_info.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_shader_trinary_minmax.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_amd_texture_gather_bias_lod.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_android_external_memory_android_hardware_buffer.rb +17 -0
- data/lib/vulkan/generated/extensions/vk_android_native_buffer.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_arm_extension_01.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_arm_extension_198.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_acquire_xlib_display.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_astc_decode_mode.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_ext_blend_operation_advanced.rb +60 -0
- data/lib/vulkan/generated/extensions/vk_ext_calibrated_timestamps.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_ext_conditional_rendering.rb +16 -0
- data/lib/vulkan/generated/extensions/vk_ext_conservative_rasterization.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_ext_debug_marker.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_ext_debug_report.rb +16 -0
- data/lib/vulkan/generated/extensions/vk_ext_debug_utils.rb +16 -0
- data/lib/vulkan/generated/extensions/vk_ext_depth_range_unrestricted.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_descriptor_indexing.rb +18 -0
- data/lib/vulkan/generated/extensions/vk_ext_direct_mode_display.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_discard_rectangles.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_ext_display_control.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_ext_display_surface_counter.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_160.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_176.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_177.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_219.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_220.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_222.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_223.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_extension_28.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_external_memory_dma_buf.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_ext_external_memory_host.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_ext_global_priority.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_ext_hdr_metadata.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_ext_image_drm_format_modifier.rb +24 -0
- data/lib/vulkan/generated/extensions/vk_ext_inline_uniform_block.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_ext_macos_ios_window.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_pci_bus_info.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_ext_post_depth_coverage.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_queue_family_foreign.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_ext_sample_locations.rb +17 -0
- data/lib/vulkan/generated/extensions/vk_ext_sampler_filter_minmax.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_ext_shader_stencil_export.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_shader_subgroup_ballot.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_shader_subgroup_vote.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_shader_viewport_index_layer.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_ext_swapchain_colorspace.rb +24 -0
- data/lib/vulkan/generated/extensions/vk_ext_transform_feedback.rb +20 -0
- data/lib/vulkan/generated/extensions/vk_ext_validation_cache.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_ext_validation_flags.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_ext_vertex_attribute_divisor.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_fuchsia_imagepipe_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_google_decorate_string.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_display_timing.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_192.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_193.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_194.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_195.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_196.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_216.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_217.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_49.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_extension_50.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_google_hlsl_functionality1.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_img_extension_107.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_img_extension_108.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_img_extension_109.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_img_extension_111.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_img_extension_69.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_img_filter_cubic.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_img_format_pvrtc.rb +18 -0
- data/lib/vulkan/generated/extensions/vk_intel_extension_210.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_intel_extension_211.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_intel_extension_243.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_16bit_storage.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_8bit_storage.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_android_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_bind_memory2.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_create_renderpass2.rb +17 -0
- data/lib/vulkan/generated/extensions/vk_khr_dedicated_allocation.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_descriptor_update_template.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_khr_device_group.rb +33 -0
- data/lib/vulkan/generated/extensions/vk_khr_device_group_creation.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_display.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_display_swapchain.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_draw_indirect_count.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_driver_properties.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_117.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_119.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_200.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_201.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_208.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_209.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_221.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_237.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_238.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_239.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_240.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_extension_83.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_fence.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_fence_capabilities.rb +19 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_fence_fd.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_fence_win32.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_memory.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_memory_capabilities.rb +26 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_memory_fd.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_memory_win32.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_semaphore.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_semaphore_capabilities.rb +20 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_semaphore_fd.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_external_semaphore_win32.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_get_display_properties2.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_khr_get_memory_requirements2.rb +15 -0
- data/lib/vulkan/generated/extensions/vk_khr_get_physical_device_properties2.rb +19 -0
- data/lib/vulkan/generated/extensions/vk_khr_get_surface_capabilities2.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_image_format_list.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_incremental_present.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_maintenance1.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_maintenance2.rb +22 -0
- data/lib/vulkan/generated/extensions/vk_khr_maintenance3.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_khr_mir_surface.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_multiview.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_push_descriptor.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_relaxed_block_layout.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_sampler_mirror_clamp_to_edge.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_sampler_ycbcr_conversion.rb +73 -0
- data/lib/vulkan/generated/extensions/vk_khr_shader_atomic_int64.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_shader_draw_parameters.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_shared_presentable_image.rb +14 -0
- data/lib/vulkan/generated/extensions/vk_khr_storage_buffer_storage_class.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_khr_surface.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_khr_swapchain.rb +24 -0
- data/lib/vulkan/generated/extensions/vk_khr_variable_pointers.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_vulkan_memory_model.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_wayland_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_win32_keyed_mutex.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_win32_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_xcb_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_khr_xlib_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_mesa_extension_244.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_mvk_ios_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_mvk_macos_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_mvk_moltenvk.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nn_vi_surface.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_clip_space_w_scaling.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_nv_compute_shader_derivatives.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_corner_sampled_image.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_nv_dedicated_allocation.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_nv_device_diagnostic_checkpoints.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_101.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_103.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_104.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_151.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_152.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_155.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_164.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_168.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_241.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_242.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_245.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_extension_53.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_external_memory.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_nv_external_memory_capabilities.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_external_memory_win32.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_nv_fill_rectangle.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_fragment_coverage_to_color.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_fragment_shader_barycentric.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_framebuffer_mixed_samples.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_geometry_shader_passthrough.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_glsl_shader.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_mesh_shader.rb +16 -0
- data/lib/vulkan/generated/extensions/vk_nv_ray_tracing.rb +40 -0
- data/lib/vulkan/generated/extensions/vk_nv_representative_fragment_test.rb +12 -0
- data/lib/vulkan/generated/extensions/vk_nv_sample_mask_override_coverage.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_scissor_exclusive.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_nv_shader_image_footprint.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_shader_subgroup_partitioned.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_shading_rate_image.rb +20 -0
- data/lib/vulkan/generated/extensions/vk_nv_viewport_array2.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nv_viewport_swizzle.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nv_win32_keyed_mutex.rb +11 -0
- data/lib/vulkan/generated/extensions/vk_nvx_device_generated_commands.rb +21 -0
- data/lib/vulkan/generated/extensions/vk_nvx_extension_30.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nvx_extension_31.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nvx_extension_48.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nvx_extension_52.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_nvx_multiview_per_view_attributes.rb +13 -0
- data/lib/vulkan/generated/extensions/vk_qcom_extension_171.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_qcom_extension_172.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_qcom_extension_173.rb +10 -0
- data/lib/vulkan/generated/extensions/vk_qcom_extension_174.rb +10 -0
- data/lib/vulkan/generated/extensions.rb +251 -0
- data/lib/vulkan/generated/structs.rb +2600 -0
- data/lib/vulkan/generated/types.rb +348 -0
- data/lib/vulkan/generated/vk.xml +10127 -0
- data/lib/vulkan/generated.rb +77 -0
- data/lib/vulkan/image.rb +263 -0
- data/lib/vulkan/image_memory.rb +13 -0
- data/lib/vulkan/image_view.rb +46 -0
- data/lib/vulkan/instance.rb +183 -0
- data/lib/vulkan/logical_device.rb +165 -0
- data/lib/vulkan/memory.rb +171 -0
- data/lib/vulkan/mock/swapchain_surface_info.rb +42 -0
- data/lib/vulkan/mock.rb +5 -0
- data/lib/vulkan/physical_device.rb +162 -0
- data/lib/vulkan/pipeline.rb +294 -0
- data/lib/vulkan/platform.rb +34 -0
- data/lib/vulkan/queue.rb +94 -0
- data/lib/vulkan/queue_family.rb +27 -0
- data/lib/vulkan/render_pass/subpass.rb +80 -0
- data/lib/vulkan/render_pass.rb +71 -0
- data/lib/vulkan/sampler.rb +48 -0
- data/lib/vulkan/semaphore.rb +16 -0
- data/lib/vulkan/shader_stage.rb +33 -0
- data/lib/vulkan/surface.rb +10 -0
- data/lib/vulkan/swapchain.rb +87 -0
- data/lib/vulkan/swapchain_builder.rb +111 -0
- data/lib/vulkan/swapchain_surface_info.rb +54 -0
- data/lib/vulkan/version.rb +3 -0
- data/lib/vulkan/window_surface.rb +13 -0
- data/lib/vulkan-ruby.rb +1 -0
- data/lib/vulkan.rb +91 -0
- data/tasks/examples.rake +29 -0
- data/tasks/fetch.rake +9 -0
- data/tasks/generate/commands.rake +51 -0
- data/tasks/generate/enums.rake +43 -0
- data/tasks/generate/extensions.rake +35 -0
- data/tasks/generate/structs.rake +117 -0
- data/tasks/generate/types.rake +91 -0
- data/tasks/generate.rake +2 -0
- data/tasks/helpers.rb +59 -0
- data/tasks/shaders.rake +8 -0
- data/vulkan-ruby.gemspec +45 -0
- metadata +546 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'fiddle/types'
|
2
|
+
|
3
|
+
module Vulkan
|
4
|
+
load_vulkan_library
|
5
|
+
|
6
|
+
typealias 'int8_t', 'char'
|
7
|
+
typealias 'int16_t', 'short'
|
8
|
+
typealias 'int32_t', 'int'
|
9
|
+
typealias 'int64_t', 'long'
|
10
|
+
typealias 'uint8_t', 'unsigned char'
|
11
|
+
typealias 'uint16_t', 'unsigned short'
|
12
|
+
typealias 'uint32_t', 'unsigned int'
|
13
|
+
typealias 'uint64_t', 'unsigned long'
|
14
|
+
|
15
|
+
# platform-specific definitions, but we need them even on alternatives,
|
16
|
+
# or else things get complicated when parsing vk.xml
|
17
|
+
# X11
|
18
|
+
typealias 'Display', 'void' # HACK: since only pointers to this type are used, its size need not be known
|
19
|
+
typealias 'VisualID', 'unsigned long'
|
20
|
+
typealias 'XID', 'unsigned long'
|
21
|
+
typealias 'Window', 'XID'
|
22
|
+
typealias 'RROutput', 'XID'
|
23
|
+
# Wayland
|
24
|
+
typealias 'wl_display', 'void' # HACK: since only pointers to this type are used, its size need not be known
|
25
|
+
typealias 'wl_surface', 'void' # HACK: since only pointers to this type are used, its size need not be known
|
26
|
+
# Windows
|
27
|
+
include Fiddle::Win32Types
|
28
|
+
typealias 'WCHAR', 'unsigned short'
|
29
|
+
typealias 'LPCWSTR', 'WCHAR *'
|
30
|
+
# XCB
|
31
|
+
typealias 'xcb_connection_t', 'void' # HACK: since only pointers to this type are used, its size need not be known
|
32
|
+
typealias 'xcb_visualid_t', 'uint32_t'
|
33
|
+
typealias 'xcb_window_t', 'uint32_t'
|
34
|
+
# Zircon
|
35
|
+
typealias 'zx_handle_t', 'uint32_t'
|
36
|
+
|
37
|
+
class << self
|
38
|
+
@@lookup_map = {}
|
39
|
+
@@function_registry = {}
|
40
|
+
|
41
|
+
# Returns a dispatch table for the given instance and device.
|
42
|
+
def [](instance, device)
|
43
|
+
hash = [instance, device].hash
|
44
|
+
@@lookup_map[hash] ||= Vulkan::DispatchTable.new(instance, device)
|
45
|
+
end
|
46
|
+
|
47
|
+
def register_function(proto, params)
|
48
|
+
# DispatchTable can use method_missing to know the name of a function to
|
49
|
+
# look up, but we need to know the params and its return type, which come
|
50
|
+
# from vk.xml and which are foreign concepts to ruby so we need to
|
51
|
+
# persist that information for lookup within method_missing. See
|
52
|
+
# DispatchTable#method_missing.
|
53
|
+
signature = "#{proto}(#{params})"
|
54
|
+
name, ctype, argtype = parse_signature(signature, Vulkan.send(:type_alias))
|
55
|
+
function_registry[name.intern] = {
|
56
|
+
name: name,
|
57
|
+
return_type: ctype,
|
58
|
+
params_types: argtype,
|
59
|
+
prototype: proto,
|
60
|
+
params: params,
|
61
|
+
signature: signature
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def function_registry
|
66
|
+
@@function_registry
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
require_relative 'generated/types'
|
71
|
+
require_relative 'generated/enums'
|
72
|
+
require_relative 'generated/structs'
|
73
|
+
|
74
|
+
extern "PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance instance, const char* pName)", :stdcall
|
75
|
+
require_relative 'generated/commands'
|
76
|
+
require_relative 'generated/extensions'
|
77
|
+
end
|
data/lib/vulkan/image.rb
ADDED
@@ -0,0 +1,263 @@
|
|
1
|
+
module Vulkan
|
2
|
+
class Image
|
3
|
+
include Vulkan::Checks
|
4
|
+
include Vulkan::Conversions
|
5
|
+
include Vulkan::Finalizer
|
6
|
+
|
7
|
+
attr_reader :dimensions
|
8
|
+
attr_reader :width
|
9
|
+
attr_reader :height
|
10
|
+
attr_reader :depth
|
11
|
+
attr_reader :mip_levels
|
12
|
+
attr_reader :array_layers
|
13
|
+
attr_reader :format
|
14
|
+
attr_reader :tiling
|
15
|
+
attr_reader :initial_layout
|
16
|
+
attr_reader :layout
|
17
|
+
attr_reader :usage
|
18
|
+
attr_reader :sharing
|
19
|
+
attr_reader :samples
|
20
|
+
attr_reader :memory
|
21
|
+
|
22
|
+
# You should only set this if you have transitioned the image to a
|
23
|
+
# different layout outside of this class, by working directly with
|
24
|
+
# a command buffer.
|
25
|
+
attr_writer :layout
|
26
|
+
|
27
|
+
def initialize(vk, physical_device,
|
28
|
+
dimensions: ,
|
29
|
+
width: ,
|
30
|
+
height: ,
|
31
|
+
depth: ,
|
32
|
+
mip_levels: 1,
|
33
|
+
array_layers: 1,
|
34
|
+
format: :r8g8b8a8_unorm,
|
35
|
+
tiling: :optimal,
|
36
|
+
initial_layout: :undefined,
|
37
|
+
usage: [:transfer_dst, :sampled],
|
38
|
+
sharing: :exclusive,
|
39
|
+
samples: 1,
|
40
|
+
flags: [],
|
41
|
+
properties: :device_local)
|
42
|
+
@vk = vk
|
43
|
+
@dimensions = dimensions
|
44
|
+
@width = width
|
45
|
+
@height = height
|
46
|
+
@depth = depth
|
47
|
+
@mip_levels = mip_levels
|
48
|
+
@array_layers = array_layers
|
49
|
+
@format = format
|
50
|
+
@tiling = tiling
|
51
|
+
@initial_layout = @layout = initial_layout
|
52
|
+
@usage = usage
|
53
|
+
@sharing = sharing
|
54
|
+
@samples = samples
|
55
|
+
image_info = VkImageCreateInfo.malloc
|
56
|
+
image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
|
57
|
+
image_info.imageType = sym_to_image_type((1..3).include?(dimensions) ? :"#{dimensions}d" : dimensions)
|
58
|
+
image_info.extent.width = width
|
59
|
+
image_info.extent.height = height
|
60
|
+
image_info.extent.depth = depth
|
61
|
+
image_info.mipLevels = mip_levels
|
62
|
+
image_info.arrayLayers = array_layers
|
63
|
+
image_info.format = sym_to_image_format(format)
|
64
|
+
image_info.tiling = sym_to_image_tiling(tiling)
|
65
|
+
image_info.initialLayout = sym_to_image_layout(initial_layout)
|
66
|
+
image_info.usage = syms_to_image_usage_flags(usage)
|
67
|
+
image_info.sharingMode = sym_to_sharing_mode(sharing)
|
68
|
+
image_info.samples = sym_to_samples(samples)
|
69
|
+
image_info.flags = syms_to_image_create_flags(flags)
|
70
|
+
handle_p = Vulkan.create_value('VkImage')
|
71
|
+
check_result @vk.vkCreateImage(@vk.device, image_info, nil, handle_p)
|
72
|
+
@handle = handle_p.value
|
73
|
+
@memory = Vulkan::ImageMemory.new(@vk, physical_device, owner: self, properties: properties)
|
74
|
+
finalize_with @vk, :vkDestroyImage, @vk.device, @handle, nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_view(format: self.format,
|
78
|
+
base_mip_level: 0,
|
79
|
+
level_count: mip_levels - base_mip_level,
|
80
|
+
base_array_layer: 0,
|
81
|
+
layer_count: array_layers - base_array_layer,
|
82
|
+
aspects: :color,
|
83
|
+
**other_image_view_args)
|
84
|
+
ImageView.new(@vk, self, format,
|
85
|
+
base_mip_level: base_mip_level,
|
86
|
+
level_count: level_count,
|
87
|
+
base_array_layer: base_array_layer,
|
88
|
+
layer_count: layer_count,
|
89
|
+
aspects: aspects,
|
90
|
+
**other_image_view_args)
|
91
|
+
end
|
92
|
+
|
93
|
+
def detect_transition_access_and_stage_flags(from, to)
|
94
|
+
from, to = sym_to_image_layout(from), sym_to_image_layout(to)
|
95
|
+
if from == VK_IMAGE_LAYOUT_UNDEFINED &&
|
96
|
+
to == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
|
97
|
+
return {
|
98
|
+
src_access: 0,
|
99
|
+
dst_access: :transfer_write,
|
100
|
+
src_stages: :top_of_pipe,
|
101
|
+
dst_stages: :transfer,
|
102
|
+
dependencies: 0
|
103
|
+
}
|
104
|
+
elsif from == VK_IMAGE_LAYOUT_UNDEFINED &&
|
105
|
+
to == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
106
|
+
return {
|
107
|
+
src_access: 0,
|
108
|
+
dst_access: :shader_read,
|
109
|
+
src_stages: :color_attachment_output,
|
110
|
+
dst_stages: :fragment_shader,
|
111
|
+
dependencies: 0
|
112
|
+
}
|
113
|
+
elsif from == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL &&
|
114
|
+
to == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
|
115
|
+
return {
|
116
|
+
src_access: :transfer_write,
|
117
|
+
dst_access: :shader_read,
|
118
|
+
src_stages: :transfer,
|
119
|
+
dst_stages: :fragment_shader,
|
120
|
+
dependencies: 0
|
121
|
+
}
|
122
|
+
elsif from == VK_IMAGE_LAYOUT_UNDEFINED &&
|
123
|
+
to == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
|
124
|
+
return {
|
125
|
+
src_access: 0,
|
126
|
+
dst_access: [ :depth_stencil_attachment_read, :depth_stencil_attachment_write ],
|
127
|
+
src_stages: :top_of_pipe,
|
128
|
+
dst_stages: :early_fragment_tests,
|
129
|
+
dependencies: 0
|
130
|
+
}
|
131
|
+
elsif from == VK_IMAGE_LAYOUT_UNDEFINED &&
|
132
|
+
to == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
|
133
|
+
return {
|
134
|
+
src_access: 0,
|
135
|
+
dst_access: [ :color_attachment_read, :color_attachment_write ],
|
136
|
+
src_stages: :top_of_pipe,
|
137
|
+
dst_stages: :color_attachment_output,
|
138
|
+
dependencies: 0
|
139
|
+
}
|
140
|
+
else
|
141
|
+
raise ArgumentError, "unsupported layout transition (%s to %s)!" % [from.inspect, to.inspect]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Transitions the layout for this image using the given command buffer.
|
146
|
+
# Does not submit the command buffer. Use #transition_layout if you want
|
147
|
+
# to be sure the image has fully transitioned before continuing.
|
148
|
+
def transition_layout_using(cmd,
|
149
|
+
from: self.layout,
|
150
|
+
to:,
|
151
|
+
src_queue_family: nil,
|
152
|
+
dst_queue_family: nil,
|
153
|
+
base_mip_level: 0,
|
154
|
+
level_count: mip_levels - base_mip_level,
|
155
|
+
base_array_layer: 0,
|
156
|
+
layer_count: array_layers - base_array_layer,
|
157
|
+
aspects: :color)
|
158
|
+
access_opts = detect_transition_access_and_stage_flags(from, to)
|
159
|
+
cmd.pipeline_image_barrier from_layout: from,
|
160
|
+
to_layout: to,
|
161
|
+
src_queue_family: src_queue_family,
|
162
|
+
dst_queue_family: dst_queue_family,
|
163
|
+
image: self,
|
164
|
+
aspects: aspects,
|
165
|
+
base_mip_level: base_mip_level,
|
166
|
+
level_count: level_count,
|
167
|
+
base_array_layer: base_array_layer,
|
168
|
+
layer_count: layer_count,
|
169
|
+
**access_opts
|
170
|
+
@layout = to
|
171
|
+
end
|
172
|
+
|
173
|
+
# Transitions the layout for this image, using the given command pool to
|
174
|
+
# allocate a command buffer and using the given queue to submit it. If
|
175
|
+
# `wait_until_idle` is true, this method will block until the queue is
|
176
|
+
# idle. Otherwise, it will return as soon as the command buffer is
|
177
|
+
# submitted. See #transition_layout_with for other arguments.
|
178
|
+
def transition_layout(command_pool, queue, wait_until_idle: true, **other_args)
|
179
|
+
command_buffer = command_pool.create_command_buffer(usage: :one_time_submit) do |cmd|
|
180
|
+
transition_layout_using(cmd, **other_args)
|
181
|
+
end
|
182
|
+
queue.submit([command_buffer])
|
183
|
+
queue.wait_until_idle if wait_until_idle
|
184
|
+
end
|
185
|
+
|
186
|
+
def copy_from_buffer(command_pool, queue,
|
187
|
+
buffer:,
|
188
|
+
buffer_offset: 0,
|
189
|
+
buffer_row_length: 0,
|
190
|
+
buffer_image_height: 0,
|
191
|
+
x: 0,
|
192
|
+
y: 0,
|
193
|
+
z: 0,
|
194
|
+
width: self.width - x,
|
195
|
+
height: self.height - y,
|
196
|
+
depth: self.depth - z,
|
197
|
+
aspects: :color,
|
198
|
+
mip_level: 0,
|
199
|
+
base_array_layer: 0,
|
200
|
+
layer_count: array_layers - base_array_layer,
|
201
|
+
wait_until_idle: true)
|
202
|
+
command_buffer = command_pool.create_command_buffer(usage: :one_time_submit) do |cmd|
|
203
|
+
cmd.copy_buffer_to_image buffer, self, [
|
204
|
+
buffer_offset: buffer_offset,
|
205
|
+
buffer_row_length: buffer_row_length,
|
206
|
+
buffer_image_height: buffer_image_height,
|
207
|
+
x: x,
|
208
|
+
y: y,
|
209
|
+
z: z,
|
210
|
+
width: width,
|
211
|
+
height: height,
|
212
|
+
depth: depth,
|
213
|
+
aspects: aspects,
|
214
|
+
mip_level: mip_level,
|
215
|
+
base_array_layer: base_array_layer,
|
216
|
+
layer_count: layer_count
|
217
|
+
]
|
218
|
+
end
|
219
|
+
|
220
|
+
queue.submit([command_buffer])
|
221
|
+
queue.wait_until_idle if wait_until_idle
|
222
|
+
end
|
223
|
+
|
224
|
+
# See CommandBuffer#blit_image for details. If `:wait_until_idle` is true,
|
225
|
+
# this method won't return until the blit operation has completed and its
|
226
|
+
# queue is idle.
|
227
|
+
def blit_from(command_pool, queue,
|
228
|
+
src:,
|
229
|
+
src_layout: :transfer_src_optimal,
|
230
|
+
dst_layout: :transfer_dst_optimal,
|
231
|
+
regions:,
|
232
|
+
filter: :nearest,
|
233
|
+
wait_until_idle: false)
|
234
|
+
command_buffer = command_pool.create_command_buffer(usage: :one_time_submit) do |cmd|
|
235
|
+
cmd.blit_image src_image: src,
|
236
|
+
src_image_layout: src_layout,
|
237
|
+
dst_image: self,
|
238
|
+
dst_image_layout: dst_layout,
|
239
|
+
regions: regions,
|
240
|
+
filter: filter
|
241
|
+
end
|
242
|
+
|
243
|
+
queue.submit([command_buffer])
|
244
|
+
queue.wait_until_idle if wait_until_idle
|
245
|
+
end
|
246
|
+
|
247
|
+
def map(*args, &block)
|
248
|
+
memory.map(*args, &block)
|
249
|
+
end
|
250
|
+
|
251
|
+
def mapped?
|
252
|
+
memory.mapped?
|
253
|
+
end
|
254
|
+
|
255
|
+
def unmap
|
256
|
+
memory.unmap
|
257
|
+
end
|
258
|
+
|
259
|
+
def data
|
260
|
+
memory.data
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Vulkan
|
2
|
+
class ImageMemory < Memory
|
3
|
+
def query_memory_requirements
|
4
|
+
VkMemoryRequirements.malloc.tap do |req|
|
5
|
+
@vk.vkGetImageMemoryRequirements(@vk.device, @owner.to_ptr, req)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def bind
|
10
|
+
@vk.vkBindImageMemory(@vk.device, @owner.to_ptr, to_ptr, 0);
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Vulkan
|
2
|
+
class ImageView
|
3
|
+
include Vulkan::Checks
|
4
|
+
include Vulkan::Conversions
|
5
|
+
include Vulkan::Finalizer
|
6
|
+
|
7
|
+
attr_reader :image
|
8
|
+
|
9
|
+
def initialize(vk, image, image_format,
|
10
|
+
view_type: VK_IMAGE_VIEW_TYPE_2D,
|
11
|
+
red_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
|
12
|
+
green_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
|
13
|
+
blue_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
|
14
|
+
alpha_swizzle: VK_COMPONENT_SWIZZLE_IDENTITY,
|
15
|
+
aspects: :color,
|
16
|
+
base_mip_level: 0,
|
17
|
+
level_count: 1,
|
18
|
+
base_array_layer: 0,
|
19
|
+
layer_count: 1)
|
20
|
+
@vk = vk
|
21
|
+
@image = image
|
22
|
+
create_info = VkImageViewCreateInfo.malloc
|
23
|
+
create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
|
24
|
+
create_info.image = image.respond_to?(:to_ptr) ? image.to_ptr : image
|
25
|
+
create_info.viewType = view_type
|
26
|
+
create_info.format = sym_to_image_format(image_format)
|
27
|
+
create_info.components.r = red_swizzle
|
28
|
+
create_info.components.g = green_swizzle
|
29
|
+
create_info.components.b = blue_swizzle
|
30
|
+
create_info.components.a = alpha_swizzle
|
31
|
+
create_info.subresourceRange.aspectMask = syms_to_image_aspect_flags(aspects)
|
32
|
+
create_info.subresourceRange.baseMipLevel = base_mip_level
|
33
|
+
create_info.subresourceRange.levelCount = level_count
|
34
|
+
create_info.subresourceRange.baseArrayLayer = base_array_layer
|
35
|
+
create_info.subresourceRange.layerCount = layer_count
|
36
|
+
view_p = Vulkan.create_value("void *", nil)
|
37
|
+
check_result @vk.vkCreateImageView(vk.device, create_info, nil, view_p)
|
38
|
+
@handle = view_p.value
|
39
|
+
finalize_with @vk, :vkDestroyImageView, vk.device, @handle, nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_ptr
|
43
|
+
@handle
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
module Vulkan
|
2
|
+
class Instance
|
3
|
+
extend Vulkan::Checks
|
4
|
+
extend Vulkan::Conversions
|
5
|
+
include Vulkan::Checks
|
6
|
+
include Vulkan::Conversions
|
7
|
+
include Vulkan::Finalizer
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def extensions
|
11
|
+
@extensions ||= begin
|
12
|
+
property_count_ptr = Vulkan.create_value("uint32_t", 0)
|
13
|
+
check_result Vulkan[nil, nil].vkEnumerateInstanceExtensionProperties(nil, property_count_ptr, nil)
|
14
|
+
property_count = property_count_ptr.value
|
15
|
+
container = Vulkan.struct("properties[#{property_count}]" => VkExtensionProperties).malloc
|
16
|
+
check_result Vulkan[nil, nil].vkEnumerateInstanceExtensionProperties(nil, property_count_ptr, container)
|
17
|
+
container.properties.map { |prop| struct_to_hash(prop) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def layers
|
22
|
+
@layers ||= begin
|
23
|
+
property_count_ptr = Vulkan.create_value("uint32_t", 0)
|
24
|
+
check_result Vulkan[nil, nil].vkEnumerateInstanceLayerProperties(property_count_ptr, nil)
|
25
|
+
property_count = property_count_ptr.value
|
26
|
+
container_struct = Vulkan.struct("properties[#{property_count}]" => VkLayerProperties)
|
27
|
+
container = container_struct.malloc
|
28
|
+
check_result Vulkan[nil, nil].vkEnumerateInstanceLayerProperties(property_count_ptr, container)
|
29
|
+
container.properties.map { |prop| struct_to_hash(prop) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def extension_names
|
34
|
+
extensions.map { |ext| ext[:extension_name] }
|
35
|
+
end
|
36
|
+
|
37
|
+
def layer_names
|
38
|
+
layers.map { |layer| layer[:layer_name] }
|
39
|
+
end
|
40
|
+
|
41
|
+
def version
|
42
|
+
ver_p = Vulkan.create_value('uint32_t', 0)
|
43
|
+
check_result Vulkan[nil, nil].vkEnumerateInstanceVersion(ver_p)
|
44
|
+
vk_parse_version ver_p.value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def initialize(application_name: $0, application_version: '1.0.0',
|
49
|
+
engine_name: 'vulkan-ruby', engine_version: Vulkan::VERSION,
|
50
|
+
api_version: self.class.version, extensions: ,
|
51
|
+
layers: [])
|
52
|
+
layers.concat ENV['LAYERS'].split(/\:\s/) if ENV['LAYERS']
|
53
|
+
extensions.concat ENV['INSTANCE_EXTENSIONS'].split(/\:\s/) if ENV['INSTANCE_EXTENSIONS']
|
54
|
+
|
55
|
+
if ENV['DEBUG']
|
56
|
+
extension_names = self.class.extension_names
|
57
|
+
%w(
|
58
|
+
VK_EXT_debug_utils
|
59
|
+
).each { |ext_name| extensions << ext_name if extension_names.include?(ext_name) }
|
60
|
+
|
61
|
+
layer_names = self.class.layer_names
|
62
|
+
%w(
|
63
|
+
VK_LAYER_LUNARG_standard_validation
|
64
|
+
VK_LAYER_LUNARG_parameter_validation
|
65
|
+
VK_LAYER_LUNARG_assistant_layer
|
66
|
+
VK_LAYER_LUNARG_api_dump
|
67
|
+
VK_LAYER_GOOGLE_unique_objects
|
68
|
+
VK_LAYER_LUNARG_demo_layer
|
69
|
+
VK_LAYER_GOOGLE_threading
|
70
|
+
VK_LAYER_LUNARG_monitor
|
71
|
+
VK_LAYER_LUNARG_starter_layer
|
72
|
+
VK_LAYER_LUNARG_core_validation
|
73
|
+
VK_LAYER_LUNARG_object_tracker
|
74
|
+
).each do |layer_name|
|
75
|
+
layers << layer_name if layer_names.include?(layer_name)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
extensions_p = Vulkan.struct("names[#{extensions.size}]" => ['char *name']).malloc
|
80
|
+
extensions.each_with_index do |ext, i|
|
81
|
+
extname = ext.kind_of?(String) ? ext : ext[:extension_name]
|
82
|
+
extensions_p.names[i].name = Fiddle::Pointer[extname.b + "\x00"]
|
83
|
+
end
|
84
|
+
|
85
|
+
layers_p = Vulkan.struct("names[#{layers.size}]" => ['char *name']).malloc
|
86
|
+
layers.each_with_index do |layer, i|
|
87
|
+
layer_name = layer.kind_of?(String) ? layer : layer[:layer_name]
|
88
|
+
layers_p.names[i].name = Fiddle::Pointer[layer_name.b + "\x00"]
|
89
|
+
end
|
90
|
+
|
91
|
+
application_info = VkApplicationInfo.malloc
|
92
|
+
application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO
|
93
|
+
application_info.pNext = nil
|
94
|
+
application_info.pApplicationName = application_name
|
95
|
+
application_info.applicationVersion = vk_make_version(application_version)
|
96
|
+
application_info.pEngineName = 'vulkan-ruby'
|
97
|
+
application_info.engineVersion = vk_make_version(engine_version)
|
98
|
+
application_info.apiVersion = vk_make_version(api_version)
|
99
|
+
|
100
|
+
instance_info = VkInstanceCreateInfo.malloc
|
101
|
+
instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
|
102
|
+
instance_info.pNext = nil
|
103
|
+
instance_info.flags = 0
|
104
|
+
instance_info.pApplicationInfo = application_info
|
105
|
+
instance_info.enabledLayerCount = layers.size
|
106
|
+
instance_info.ppEnabledLayerNames = layers_p
|
107
|
+
instance_info.enabledExtensionCount = extensions.size
|
108
|
+
instance_info.ppEnabledExtensionNames = extensions_p
|
109
|
+
|
110
|
+
instance_wrapper = Vulkan.create_value("void *", nil)
|
111
|
+
check_result Vulkan[nil, nil].vkCreateInstance(instance_info, nil, instance_wrapper)
|
112
|
+
@handle = instance_wrapper.value
|
113
|
+
@vk = Vulkan[self, nil]
|
114
|
+
hook_debug_utils_callback if extensions.include?('VK_EXT_debug_utils')
|
115
|
+
finalize_with @vk, :vkDestroyInstance, @handle, nil
|
116
|
+
end
|
117
|
+
|
118
|
+
def on_log(&cb)
|
119
|
+
@log_callback = cb
|
120
|
+
end
|
121
|
+
|
122
|
+
def hook_debug_utils_callback
|
123
|
+
_, return_type, param_types = Vulkan.parse_signature('VkBool32 debug_callback(int messageSeverity,' +
|
124
|
+
'int messageType,' +
|
125
|
+
'void *pCallbackData,' +
|
126
|
+
'void *pUserData)')
|
127
|
+
@debug_util_callback = Fiddle::Closure::BlockCaller.new(return_type, param_types) do |msg_severity, msg_type, cb_data_addr, user_arg_addr|
|
128
|
+
data = VkDebugUtilsMessengerCallbackDataEXT.new(cb_data_addr)
|
129
|
+
type = const_to_symbol(msg_type, /^VK_DEBUG_UTILS_MESSAGE_TYPE_(.*?)_BIT_EXT$/)
|
130
|
+
severity = const_to_symbol(msg_severity, /^VK_DEBUG_UTILS_MESSAGE_SEVERITY_(.*?)_BIT_EXT$/)
|
131
|
+
if @log_callback
|
132
|
+
@log_callback.call severity, type, data.pMessage.to_s
|
133
|
+
else
|
134
|
+
puts ['[UTIL]', "[#{severity}]", "[#{type}]", data.pMessage.to_s].join("\t")
|
135
|
+
end
|
136
|
+
VK_FALSE # don't bail
|
137
|
+
end
|
138
|
+
|
139
|
+
create_info = VkDebugUtilsMessengerCreateInfoEXT.malloc
|
140
|
+
create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT
|
141
|
+
create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
|
142
|
+
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
|
143
|
+
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT
|
144
|
+
create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
|
145
|
+
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
|
146
|
+
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT
|
147
|
+
create_info.pUserData = nil
|
148
|
+
create_info.pfnUserCallback = @debug_util_callback
|
149
|
+
|
150
|
+
callback_p = Vulkan.create_value('void *', nil)
|
151
|
+
check_result @vk.vkCreateDebugUtilsMessengerEXT(to_ptr, create_info, nil, callback_p)
|
152
|
+
@debug_util_callback_handle = callback_p.value
|
153
|
+
finalize_with @vk, :vkDestroyDebugUtilsMessengerEXT, to_ptr, @debug_util_callback_handle, nil
|
154
|
+
end
|
155
|
+
|
156
|
+
def create_window_surface(window)
|
157
|
+
WindowSurface.new(self, window)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Returns an array of physical device handles. Use these to query the
|
161
|
+
# capabilities of each physical device, and to create logical devices
|
162
|
+
# based on the results.
|
163
|
+
def physical_device_handles
|
164
|
+
@physical_device_handles ||= begin
|
165
|
+
# get device count
|
166
|
+
device_count_ptr = Vulkan.create_value("uint32_t", 0)
|
167
|
+
# check_result func.call(@handle, device_count_ptr, nil)
|
168
|
+
check_result @vk.vkEnumeratePhysicalDevices(@handle, device_count_ptr, nil)
|
169
|
+
device_count = device_count_ptr.value
|
170
|
+
# allocate n devices
|
171
|
+
container_struct = Vulkan.struct("handles[#{device_count}]" => ['VkPhysicalDevice handle'])
|
172
|
+
container = container_struct.malloc
|
173
|
+
# check_result func.call(@handle, device_count_ptr, container)
|
174
|
+
check_result @vk.vkEnumeratePhysicalDevices(@handle, device_count_ptr, container)
|
175
|
+
container.handles
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def physical_devices
|
180
|
+
@physical_devices ||= physical_device_handles.map { |dev| PhysicalDevice.new(self, dev.handle) }
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|