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,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
|