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