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,294 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class Pipeline
|
|
3
|
+
include Vulkan::Checks
|
|
4
|
+
include Vulkan::Conversions
|
|
5
|
+
include Vulkan::Finalizer
|
|
6
|
+
|
|
7
|
+
attr_reader :layout
|
|
8
|
+
attr_reader :input
|
|
9
|
+
attr_reader :viewport
|
|
10
|
+
attr_reader :scissor
|
|
11
|
+
attr_reader :rasterizer
|
|
12
|
+
attr_reader :multisampling
|
|
13
|
+
attr_reader :blending
|
|
14
|
+
attr_reader :layouts
|
|
15
|
+
attr_reader :constant_ranges
|
|
16
|
+
attr_reader :descriptors
|
|
17
|
+
attr_accessor :specialization_constants
|
|
18
|
+
|
|
19
|
+
# TODO support multiple viewports
|
|
20
|
+
def initialize(vk, viewport: { }, scissor: { })
|
|
21
|
+
@vk = vk
|
|
22
|
+
@shader_stages = []
|
|
23
|
+
@layouts = []
|
|
24
|
+
@constant_ranges = []
|
|
25
|
+
@descriptors = []
|
|
26
|
+
@input = {
|
|
27
|
+
topology: :triangles,
|
|
28
|
+
primitive_restart: false
|
|
29
|
+
}
|
|
30
|
+
@viewport = {
|
|
31
|
+
left: 0,
|
|
32
|
+
top: 0,
|
|
33
|
+
width: 640,
|
|
34
|
+
height: 480,
|
|
35
|
+
min_depth: 0,
|
|
36
|
+
max_depth: 1
|
|
37
|
+
}.merge(viewport)
|
|
38
|
+
@scissor = {
|
|
39
|
+
left: 0,
|
|
40
|
+
top: 0,
|
|
41
|
+
width: 0xffffffff,
|
|
42
|
+
height: 0xffffffff
|
|
43
|
+
}.merge(scissor)
|
|
44
|
+
@rasterizer = {
|
|
45
|
+
depth_clamp: false,
|
|
46
|
+
discard_all: false,
|
|
47
|
+
polygon_mode: :fill,
|
|
48
|
+
line_width: 1.0,
|
|
49
|
+
cull_mode: :back,
|
|
50
|
+
front_face: :counter_clockwise,
|
|
51
|
+
depth_bias: false,
|
|
52
|
+
depth_bias_clamp: 0,
|
|
53
|
+
depth_bias_constant: 0,
|
|
54
|
+
depth_bias_slope: 0
|
|
55
|
+
}
|
|
56
|
+
@multisampling = {
|
|
57
|
+
sample_shading: false,
|
|
58
|
+
samples: 1,
|
|
59
|
+
min_sample_shading: 0.2,
|
|
60
|
+
sample_mask: nil,
|
|
61
|
+
alpha_to_coverage: false,
|
|
62
|
+
alpha_to_one: false
|
|
63
|
+
}
|
|
64
|
+
@blending = {
|
|
65
|
+
enabled: true,
|
|
66
|
+
color_writes: [ :red, :green, :blue, :alpha ],
|
|
67
|
+
src_color: :src_alpha,
|
|
68
|
+
dst_color: :one_minus_src_alpha,
|
|
69
|
+
src_alpha: :one,
|
|
70
|
+
dst_alpha: :zero,
|
|
71
|
+
color_op: :add,
|
|
72
|
+
alpha_op: :add
|
|
73
|
+
}
|
|
74
|
+
@binding_descriptions = []
|
|
75
|
+
@attribute_descriptions = []
|
|
76
|
+
@dynamic_states = []
|
|
77
|
+
@specialization_constants = {}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def add_binding_description(binding:, stride:, input_rate:)
|
|
81
|
+
binding_description = VkVertexInputBindingDescription.malloc
|
|
82
|
+
binding_description.binding = binding
|
|
83
|
+
binding_description.stride = stride
|
|
84
|
+
binding_description.inputRate = sym_to_vertex_input_rate(input_rate)
|
|
85
|
+
@binding_descriptions << binding_description
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def add_attribute_description(binding:, location:, format:, offset:)
|
|
89
|
+
attribute_description = VkVertexInputAttributeDescription.malloc
|
|
90
|
+
attribute_description.binding = binding
|
|
91
|
+
attribute_description.location = location
|
|
92
|
+
attribute_description.format = sym_to_format(format)
|
|
93
|
+
attribute_description.offset = offset
|
|
94
|
+
@attribute_descriptions << attribute_description
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def add_descriptor_set_layout(*a, **b)
|
|
98
|
+
if a.size == 1 && b.empty? && a.first.kind_of?(Vulkan::DescriptorSetLayout)
|
|
99
|
+
@layouts << a[0]
|
|
100
|
+
else
|
|
101
|
+
Vulkan::DescriptorSetLayout.new(@vk, *a, **b).tap { |layout| @layouts << layout }
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def add_shader_stage(shader_stage)
|
|
106
|
+
@shader_stages << shader_stage
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def depth(test: true,
|
|
110
|
+
write: true,
|
|
111
|
+
compare_op: :less,
|
|
112
|
+
bounds_test: false,
|
|
113
|
+
min_bounds: 0,
|
|
114
|
+
max_bounds: 1,
|
|
115
|
+
stencil_test: false,
|
|
116
|
+
stencil_front: nil,
|
|
117
|
+
stencil_back: nil)
|
|
118
|
+
@depth_stencil = VkPipelineDepthStencilStateCreateInfo.malloc
|
|
119
|
+
@depth_stencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO
|
|
120
|
+
@depth_stencil.depthTestEnable = bool_to_vk(test)
|
|
121
|
+
@depth_stencil.depthWriteEnable = bool_to_vk(write)
|
|
122
|
+
@depth_stencil.depthCompareOp = sym_to_compare_op(compare_op)
|
|
123
|
+
@depth_stencil.depthBoundsTestEnable = bool_to_vk(bounds_test)
|
|
124
|
+
@depth_stencil.minDepthBounds = min_bounds
|
|
125
|
+
@depth_stencil.maxDepthBounds = max_bounds
|
|
126
|
+
@depth_stencil.stencilTestEnable = bool_to_vk(stencil_test)
|
|
127
|
+
# TODO stencil test options
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def add_dynamic_state(which)
|
|
131
|
+
@dynamic_states << which
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def construct_specialization_info(specialization_constants_hash)
|
|
135
|
+
specialization_info = nil
|
|
136
|
+
if specialization_constants_hash&.any?
|
|
137
|
+
specialization_data = ""
|
|
138
|
+
specialization_entries = specialization_constants_hash.map do |id, data|
|
|
139
|
+
VkSpecializationMapEntry.malloc.tap do |entry|
|
|
140
|
+
entry.constantID = id
|
|
141
|
+
entry.offset = specialization_data.size
|
|
142
|
+
entry.size = data.size
|
|
143
|
+
specialization_data << data
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
specialization_info = VkSpecializationInfo.malloc
|
|
147
|
+
specialization_info.mapEntryCount = specialization_entries.count
|
|
148
|
+
specialization_info.pMapEntries = array_of_structures(specialization_entries)
|
|
149
|
+
specialization_info.dataSize = specialization_data.size
|
|
150
|
+
specialization_info.pData = specialization_data
|
|
151
|
+
end
|
|
152
|
+
specialization_info
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def commit(render_pass, first_subpass_index: 0)
|
|
156
|
+
@render_pass = render_pass
|
|
157
|
+
|
|
158
|
+
shader_stage_create_infos = @shader_stages.map do |stage|
|
|
159
|
+
stage_info = VkPipelineShaderStageCreateInfo.malloc
|
|
160
|
+
stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
|
|
161
|
+
stage_info.stage = syms_to_shader_stage_flags(stage.stage)
|
|
162
|
+
stage_info.module = stage.module_handle
|
|
163
|
+
stage_info.pName = Fiddle::Pointer[stage.entry_point]
|
|
164
|
+
specs = construct_specialization_info(@specialization_constants[stage.stage])
|
|
165
|
+
stage_info.pSpecializationInfo = specs
|
|
166
|
+
stage_info
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
vertex_input_info = VkPipelineVertexInputStateCreateInfo.malloc
|
|
170
|
+
vertex_input_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
|
|
171
|
+
vertex_input_info.vertexBindingDescriptionCount = @binding_descriptions.size
|
|
172
|
+
vertex_input_info.pVertexBindingDescriptions = array_of_structures(@binding_descriptions)
|
|
173
|
+
vertex_input_info.vertexAttributeDescriptionCount = @attribute_descriptions.size
|
|
174
|
+
vertex_input_info.pVertexAttributeDescriptions = array_of_structures(@attribute_descriptions)
|
|
175
|
+
|
|
176
|
+
input_assembly = VkPipelineInputAssemblyStateCreateInfo.malloc
|
|
177
|
+
input_assembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
|
|
178
|
+
input_assembly.topology = sym_to_topology(@input[:topology])
|
|
179
|
+
input_assembly.primitiveRestartEnable = bool_to_vk(@input[:primitive_restart])
|
|
180
|
+
|
|
181
|
+
viewport = VkViewport.malloc
|
|
182
|
+
viewport.x = @viewport[:left]
|
|
183
|
+
viewport.y = @viewport[:top]
|
|
184
|
+
viewport.width = @viewport[:width]
|
|
185
|
+
viewport.height = @viewport[:height]
|
|
186
|
+
viewport.minDepth = @viewport[:min_depth]
|
|
187
|
+
viewport.maxDepth = @viewport[:max_depth]
|
|
188
|
+
|
|
189
|
+
scissor = VkRect2D.malloc
|
|
190
|
+
scissor.offset.x = @scissor[:left]
|
|
191
|
+
scissor.offset.y = @scissor[:top]
|
|
192
|
+
scissor.extent.width = @scissor[:width]
|
|
193
|
+
scissor.extent.height = @scissor[:height]
|
|
194
|
+
|
|
195
|
+
viewport_state = VkPipelineViewportStateCreateInfo.malloc
|
|
196
|
+
viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
|
|
197
|
+
# TODO support multiple viewports and scissors
|
|
198
|
+
viewport_state.viewportCount = 1
|
|
199
|
+
viewport_state.pViewports = viewport
|
|
200
|
+
viewport_state.scissorCount = 1
|
|
201
|
+
viewport_state.pScissors = scissor
|
|
202
|
+
|
|
203
|
+
rasterizer = VkPipelineRasterizationStateCreateInfo.malloc
|
|
204
|
+
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
|
|
205
|
+
rasterizer.depthClampEnable = bool_to_vk(@rasterizer[:depth_clamp])
|
|
206
|
+
rasterizer.rasterizerDiscardEnable = bool_to_vk(@rasterizer[:discard_all])
|
|
207
|
+
rasterizer.polygonMode = sym_to_polygon_mode(@rasterizer[:polygon_mode])
|
|
208
|
+
rasterizer.lineWidth = @rasterizer[:line_width]
|
|
209
|
+
rasterizer.cullMode = sym_to_cull_mode(@rasterizer[:cull_mode])
|
|
210
|
+
rasterizer.frontFace = sym_to_front_face(@rasterizer[:front_face])
|
|
211
|
+
rasterizer.depthBiasEnable = bool_to_vk(@rasterizer[:depth_bias])
|
|
212
|
+
rasterizer.depthBiasConstantFactor = @rasterizer[:depth_bias_constant]
|
|
213
|
+
rasterizer.depthBiasClamp = @rasterizer[:depth_bias_clamp]
|
|
214
|
+
rasterizer.depthBiasSlopeFactor = @rasterizer[:depth_bias_slope]
|
|
215
|
+
|
|
216
|
+
multisampling = VkPipelineMultisampleStateCreateInfo.malloc
|
|
217
|
+
multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
|
218
|
+
multisampling.sampleShadingEnable = bool_to_vk(@multisampling[:sample_shading])
|
|
219
|
+
multisampling.rasterizationSamples = num_to_samples(@multisampling[:samples])
|
|
220
|
+
multisampling.minSampleShading = @multisampling[:min_sample_shading]
|
|
221
|
+
multisampling.pSampleMask = @multisampling[:sample_mask]
|
|
222
|
+
multisampling.alphaToCoverageEnable = bool_to_vk(@multisampling[:alpha_to_coverage])
|
|
223
|
+
multisampling.alphaToOneEnable = @multisampling[:alpha_to_one] ? VK_TRUE : VK_FALSE
|
|
224
|
+
|
|
225
|
+
color_blend_attachment = VkPipelineColorBlendAttachmentState.malloc
|
|
226
|
+
color_blend_attachment.colorWriteMask = @blending[:color_writes].reduce(0) do |v, sym|
|
|
227
|
+
v | sym_to_color_component_bit(sym)
|
|
228
|
+
end
|
|
229
|
+
color_blend_attachment.blendEnable = bool_to_vk(@blending[:enabled])
|
|
230
|
+
color_blend_attachment.srcColorBlendFactor = sym_to_blend_factor(@blending[:src_color])
|
|
231
|
+
color_blend_attachment.dstColorBlendFactor = sym_to_blend_factor(@blending[:dst_color])
|
|
232
|
+
color_blend_attachment.colorBlendOp = sym_to_blend_op(@blending[:color_op])
|
|
233
|
+
color_blend_attachment.srcAlphaBlendFactor = sym_to_blend_factor(@blending[:src_alpha])
|
|
234
|
+
color_blend_attachment.dstAlphaBlendFactor = sym_to_blend_factor(@blending[:dst_alpha])
|
|
235
|
+
color_blend_attachment.alphaBlendOp = sym_to_blend_op(@blending[:alpha_op])
|
|
236
|
+
|
|
237
|
+
color_blending = VkPipelineColorBlendStateCreateInfo.malloc
|
|
238
|
+
color_blending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
|
239
|
+
color_blending.logicOpEnable = VK_FALSE;
|
|
240
|
+
color_blending.logicOp = VK_LOGIC_OP_COPY; # TODO
|
|
241
|
+
color_blending.attachmentCount = 1 # TODO multiple blend attachments
|
|
242
|
+
color_blending.pAttachments = color_blend_attachment
|
|
243
|
+
color_blending.blendConstants[0] = 0.0 # TODO
|
|
244
|
+
color_blending.blendConstants[1] = 0.0 # TODO
|
|
245
|
+
color_blending.blendConstants[2] = 0.0 # TODO
|
|
246
|
+
color_blending.blendConstants[3] = 0.0 # TODO
|
|
247
|
+
|
|
248
|
+
pipeline_layout_info = VkPipelineLayoutCreateInfo.malloc
|
|
249
|
+
pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
|
|
250
|
+
pipeline_layout_info.setLayoutCount = @layouts.size
|
|
251
|
+
pipeline_layout_info.pSetLayouts = array_of_structures(@layouts.map { |l| Vulkan.create_value('void *', l.to_ptr) })
|
|
252
|
+
pipeline_layout_info.pushConstantRangeCount = 0 # @constant_ranges.size
|
|
253
|
+
pipeline_layout_info.pPushConstantRanges = nil # FIXME
|
|
254
|
+
raise NotImplemented, 'push constant ranges not implemented' if @constant_ranges.any?
|
|
255
|
+
|
|
256
|
+
pipeline_layout_p = Vulkan.create_value('void *', nil)
|
|
257
|
+
check_result @vk.vkCreatePipelineLayout(@vk.device, pipeline_layout_info, nil, pipeline_layout_p)
|
|
258
|
+
@layout = pipeline_layout_p.value
|
|
259
|
+
finalize_with @vk, :vkDestroyPipelineLayout, @vk.device, @layout, nil
|
|
260
|
+
|
|
261
|
+
if @dynamic_states.any?
|
|
262
|
+
dynamic_states = VkPipelineDynamicStateCreateInfo.malloc
|
|
263
|
+
dynamic_states.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
|
|
264
|
+
dynamic_states.dynamicStateCount = @dynamic_states.count
|
|
265
|
+
dynamic_states.pDynamicStates = array_of_uint32s(@dynamic_states.map { |state| sym_to_dynamic_state(state) })
|
|
266
|
+
else
|
|
267
|
+
dynamic_states = nil
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
pipeline_info = VkGraphicsPipelineCreateInfo.malloc
|
|
271
|
+
pipeline_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
|
|
272
|
+
pipeline_info.stageCount = shader_stage_create_infos.size
|
|
273
|
+
pipeline_info.pStages = array_of_structures(shader_stage_create_infos)
|
|
274
|
+
pipeline_info.pVertexInputState = vertex_input_info
|
|
275
|
+
pipeline_info.pInputAssemblyState = input_assembly
|
|
276
|
+
pipeline_info.pViewportState = viewport_state
|
|
277
|
+
pipeline_info.pRasterizationState = rasterizer
|
|
278
|
+
pipeline_info.pMultisampleState = multisampling
|
|
279
|
+
pipeline_info.pDepthStencilState = @depth_stencil
|
|
280
|
+
pipeline_info.pColorBlendState = color_blending
|
|
281
|
+
pipeline_info.pDynamicState = dynamic_states
|
|
282
|
+
pipeline_info.layout = @layout
|
|
283
|
+
pipeline_info.renderPass = render_pass.to_ptr
|
|
284
|
+
pipeline_info.subpass = first_subpass_index
|
|
285
|
+
pipeline_info.basePipelineHandle = nil # TODO
|
|
286
|
+
pipeline_info.basePipelineIndex = -1 # TODO
|
|
287
|
+
|
|
288
|
+
pipeline_p = Vulkan.create_value('void *', nil)
|
|
289
|
+
check_result @vk.vkCreateGraphicsPipelines(@vk.device, nil, 1, pipeline_info, nil, pipeline_p)
|
|
290
|
+
@handle = pipeline_p.value
|
|
291
|
+
finalize_with @vk, :vkDestroyPipeline, @vk.device, @handle, nil
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'fiddle'
|
|
2
|
+
require 'rbconfig'
|
|
3
|
+
|
|
4
|
+
module Vulkan
|
|
5
|
+
module Platform
|
|
6
|
+
def calling_convention_human
|
|
7
|
+
case calling_convention
|
|
8
|
+
when Fiddle::Function::STDCALL then :stdcall
|
|
9
|
+
when Fiddle::Function::DEFAULT then :default
|
|
10
|
+
else raise "BUG: can't identify calling convention???"
|
|
11
|
+
end
|
|
12
|
+
rescue NameError
|
|
13
|
+
:default
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def calling_convention
|
|
17
|
+
case Vulkan.os
|
|
18
|
+
when :windows then Fiddle::Function::STDCALL
|
|
19
|
+
else Fiddle::Function::DEFAULT
|
|
20
|
+
end
|
|
21
|
+
rescue NameError
|
|
22
|
+
Fiddle::Function::DEFAULT
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def os
|
|
26
|
+
case RbConfig::CONFIG['host_os']
|
|
27
|
+
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/ then :windows
|
|
28
|
+
when /darwin|mac os/ then :osx
|
|
29
|
+
when /linux/, /solaris|bsd/ then :linux
|
|
30
|
+
else raise 'could not determine vulkan library to load for this OS'
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/vulkan/queue.rb
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class Queue
|
|
3
|
+
include Vulkan::Checks
|
|
4
|
+
include Vulkan::Conversions
|
|
5
|
+
|
|
6
|
+
attr_reader :priority
|
|
7
|
+
attr_reader :index
|
|
8
|
+
|
|
9
|
+
def initialize(vk, handle, priority:, index:)
|
|
10
|
+
@vk = vk
|
|
11
|
+
@handle = handle
|
|
12
|
+
@priority = priority
|
|
13
|
+
@index = index
|
|
14
|
+
|
|
15
|
+
# pointers used and reused during queue submit and presentment, to avoid
|
|
16
|
+
# unnecessary GC
|
|
17
|
+
@wait_semaphores_buffers = { 0 => nil }
|
|
18
|
+
@wait_stages_buffers = { 0 => nil }
|
|
19
|
+
@signal_semaphores_buffers = { 0 => nil }
|
|
20
|
+
@command_buffers_buffers = { 0 => nil }
|
|
21
|
+
@submit_infos = { 0 => nil, 1 => Vulkan.struct("infos[1]" => VkSubmitInfo).malloc }
|
|
22
|
+
@submit_infos[1].infos[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO
|
|
23
|
+
@image_indices_buffers = { 0 => nil }
|
|
24
|
+
@swapchains_buffers = { 0 => nil }
|
|
25
|
+
@present_info = VkPresentInfoKHR.malloc
|
|
26
|
+
@present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def submit_infos(submit_infos, fence = nil)
|
|
30
|
+
submit_infos_p = @submit_infos[submit_infos.size] ||= Vulkan.struct("infos[#{submit_infos.size}]" => VkSubmitInfo).malloc
|
|
31
|
+
submit_infos.each_with_index do |info, i|
|
|
32
|
+
next if submit_infos_p.infos[i] == info
|
|
33
|
+
submit_infos_p.infos[i].copy_from(info)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
check_result @vk.vkQueueSubmit(to_ptr, submit_infos.size, submit_infos_p, fence)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def wait_until_idle
|
|
40
|
+
@vk.vkQueueWaitIdle(to_ptr)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def submit(command_buffers, wait_semaphores: [], wait_stages: [], signal_semaphores: [], fence: nil)
|
|
44
|
+
wait_stages_p = @wait_stages_buffers[wait_stages.size] ||= Vulkan.struct(["VkPipelineStageFlags stages[#{wait_stages.size}]"]).malloc
|
|
45
|
+
wait_stages.each_with_index { |stage, index| wait_stages_p.stages[index] = stage }
|
|
46
|
+
|
|
47
|
+
wait_semaphores_p = @wait_semaphores_buffers[wait_semaphores.size] ||= Fiddle::Pointer.malloc(wait_semaphores.size * Fiddle::SIZEOF_VOIDP)
|
|
48
|
+
array_of_pointers(wait_semaphores, wait_semaphores_p)
|
|
49
|
+
|
|
50
|
+
signal_semaphores_p = @signal_semaphores_buffers[signal_semaphores.size] ||= Fiddle::Pointer.malloc(signal_semaphores.size * Fiddle::SIZEOF_VOIDP)
|
|
51
|
+
array_of_pointers(signal_semaphores, signal_semaphores_p)
|
|
52
|
+
|
|
53
|
+
command_buffers_p = @command_buffers_buffers[command_buffers.size] ||= Fiddle::Pointer.malloc(command_buffers.size * Fiddle::SIZEOF_VOIDP)
|
|
54
|
+
array_of_pointers(command_buffers, command_buffers_p)
|
|
55
|
+
|
|
56
|
+
submit_info = @submit_infos[1].infos[0]
|
|
57
|
+
submit_info.waitSemaphoreCount = wait_semaphores.size
|
|
58
|
+
submit_info.pWaitSemaphores = wait_semaphores_p
|
|
59
|
+
submit_info.pWaitDstStageMask = wait_stages_p
|
|
60
|
+
submit_info.commandBufferCount = command_buffers.size
|
|
61
|
+
submit_info.pCommandBuffers = command_buffers_p
|
|
62
|
+
submit_info.signalSemaphoreCount = signal_semaphores.size
|
|
63
|
+
submit_info.pSignalSemaphores = signal_semaphores_p
|
|
64
|
+
|
|
65
|
+
submit_infos(@submit_infos[1].infos, fence)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def present(swapchains:, image_indices:, wait_semaphores: [])
|
|
69
|
+
raise ArgumentError, "swapchains and image_indices must have same sizes" unless swapchains.size == image_indices.size
|
|
70
|
+
|
|
71
|
+
wait_semaphores_p = @wait_semaphores_buffers[wait_semaphores.size] ||= Fiddle::Pointer.malloc(wait_semaphores.size * Fiddle::SIZEOF_VOIDP)
|
|
72
|
+
array_of_pointers(wait_semaphores, wait_semaphores_p)
|
|
73
|
+
|
|
74
|
+
image_indices_p = @image_indices_buffers[image_indices.size] ||= Vulkan.struct(["uint32_t indices[#{image_indices.size}]"]).malloc
|
|
75
|
+
data = image_indices.pack("I*")
|
|
76
|
+
image_indices_p[0, data.size] = data
|
|
77
|
+
|
|
78
|
+
swapchains_p = @swapchains_buffers[swapchains.size] ||= Fiddle::Pointer.malloc(swapchains.size * Fiddle::SIZEOF_VOIDP)
|
|
79
|
+
array_of_pointers(swapchains, swapchains_p)
|
|
80
|
+
|
|
81
|
+
@present_info.waitSemaphoreCount = wait_semaphores.size
|
|
82
|
+
@present_info.pWaitSemaphores = wait_semaphores_p
|
|
83
|
+
@present_info.swapchainCount = swapchains.size
|
|
84
|
+
@present_info.pSwapchains = swapchains_p
|
|
85
|
+
@present_info.pImageIndices = image_indices_p
|
|
86
|
+
@present_info.pResults = nil
|
|
87
|
+
check_result @vk.vkQueuePresentKHR(to_ptr, @present_info)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def to_ptr
|
|
91
|
+
@handle
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class QueueFamily < Hash
|
|
3
|
+
include Vulkan::Checks
|
|
4
|
+
|
|
5
|
+
attr_reader :physical_device
|
|
6
|
+
|
|
7
|
+
def initialize(instance, physical_device, family_index)
|
|
8
|
+
super()
|
|
9
|
+
@physical_device = physical_device
|
|
10
|
+
@vk = Vulkan[instance, nil]
|
|
11
|
+
@family_index = family_index
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def supports?(feature)
|
|
15
|
+
self[:supports].include?(feature)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def supports_presentation?(surface)
|
|
19
|
+
supported_p = Vulkan.create_value('VkBool32', 0)
|
|
20
|
+
check_result @vk.vkGetPhysicalDeviceSurfaceSupportKHR(@physical_device.to_ptr,
|
|
21
|
+
@family_index,
|
|
22
|
+
surface.to_ptr,
|
|
23
|
+
supported_p)
|
|
24
|
+
return supported_p.value == VK_TRUE
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class RenderPass
|
|
3
|
+
class Subpass
|
|
4
|
+
include Vulkan::Conversions
|
|
5
|
+
|
|
6
|
+
def initialize(vk, bind_point: :graphics)
|
|
7
|
+
@color_attachments = []
|
|
8
|
+
@input_attachments = []
|
|
9
|
+
@resolve_attachments = []
|
|
10
|
+
@preserve_attachments = []
|
|
11
|
+
|
|
12
|
+
@ptr = VkSubpassDescription.malloc
|
|
13
|
+
@ptr.pipelineBindPoint = sym_to_pipeline_bind_point(bind_point)
|
|
14
|
+
@ptr.colorAttachmentCount = 0
|
|
15
|
+
@ptr.pColorAttachments = nil
|
|
16
|
+
@ptr.inputAttachmentCount = 0
|
|
17
|
+
@ptr.pInputAttachments = nil
|
|
18
|
+
@ptr.pResolveAttachments = nil
|
|
19
|
+
@ptr.pDepthStencilAttachment = nil
|
|
20
|
+
@ptr.preserveAttachmentCount = 0
|
|
21
|
+
@ptr.pPreserveAttachments = nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def add_attachment_ref(ary, index:, layout:, addr_mbr:, count_mbr:)
|
|
25
|
+
ary << create_attachment_ref(index, layout)
|
|
26
|
+
update_attachment_refs(ary, addr_mbr: addr_mbr, count_mbr: count_mbr)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def update_attachment_refs(ary, addr_mbr:, count_mbr:)
|
|
30
|
+
@ptr.send(:"#{addr_mbr}=", array_of_structures(ary))
|
|
31
|
+
@ptr.send(:"#{count_mbr}=", ary.size) if count_mbr
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def add_color_attachment_ref(index:, layout: :color)
|
|
35
|
+
add_attachment_ref(@color_attachments, index: index,
|
|
36
|
+
layout: layout,
|
|
37
|
+
addr_mbr: :pColorAttachments,
|
|
38
|
+
count_mbr: :colorAttachmentCount)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_resolve_attachment_ref(index:, layout: :color)
|
|
42
|
+
add_attachment_ref(@resolve_attachments, index: index,
|
|
43
|
+
layout: layout,
|
|
44
|
+
addr_mbr: :pResolveAttachments,
|
|
45
|
+
count_mbr: nil)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def add_input_attachment_ref(index:, layout:)
|
|
49
|
+
add_attachment_ref(@input_attachments, index: index,
|
|
50
|
+
layout: layout,
|
|
51
|
+
addr_mbr: :pInputAttachments,
|
|
52
|
+
count_mbr: :inputAttachmentCount)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def add_preserve_attachment_ref(index:, layout:)
|
|
56
|
+
add_attachment_ref(@preserve_attachments, index: index,
|
|
57
|
+
layout: layout,
|
|
58
|
+
addr_mbr: :pPreserveStencilAttachments,
|
|
59
|
+
count_mbr: :preserveStencilAttachmentCount)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def set_depth_stencil_attachment_ref(index:, layout: :depth_stencil_attachment_optimal)
|
|
63
|
+
ref = create_attachment_ref(index, layout)
|
|
64
|
+
@depth_stencil_attachment = ref
|
|
65
|
+
@ptr.pDepthStencilAttachment = ref
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def to_ptr
|
|
69
|
+
@ptr&.to_ptr
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def create_attachment_ref(index, layout)
|
|
73
|
+
ref = VkAttachmentReference.malloc
|
|
74
|
+
ref.attachment = index # attachment index
|
|
75
|
+
ref.layout = sym_to_image_layout(layout)
|
|
76
|
+
ref
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class RenderPass
|
|
3
|
+
include Vulkan::Checks
|
|
4
|
+
include Vulkan::Conversions
|
|
5
|
+
include Vulkan::Finalizer
|
|
6
|
+
|
|
7
|
+
attr_reader :attachments
|
|
8
|
+
|
|
9
|
+
def initialize(vk)
|
|
10
|
+
@vk = vk
|
|
11
|
+
@attachments = []
|
|
12
|
+
@subpasses = []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_ptr
|
|
16
|
+
super || raise(RuntimeError, 'call #commit first')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def commit
|
|
20
|
+
render_pass_info = VkRenderPassCreateInfo.malloc
|
|
21
|
+
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
|
|
22
|
+
render_pass_info.attachmentCount = @attachments.size
|
|
23
|
+
render_pass_info.pAttachments = array_of_structures(@attachments)
|
|
24
|
+
render_pass_info.subpassCount = @subpasses.size
|
|
25
|
+
render_pass_info.pSubpasses = array_of_structures(@subpasses)
|
|
26
|
+
|
|
27
|
+
dependency = VkSubpassDependency.malloc
|
|
28
|
+
dependency.srcSubpass = VK_SUBPASS_EXTERNAL
|
|
29
|
+
dependency.dstSubpass = 0
|
|
30
|
+
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
|
|
31
|
+
dependency.srcAccessMask = 0
|
|
32
|
+
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
|
|
33
|
+
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
|
|
34
|
+
|
|
35
|
+
render_pass_info.dependencyCount = 1
|
|
36
|
+
render_pass_info.pDependencies = dependency
|
|
37
|
+
|
|
38
|
+
render_pass_p = Vulkan.create_value('void *', nil)
|
|
39
|
+
check_result @vk.vkCreateRenderPass(@vk.device, render_pass_info, nil, render_pass_p)
|
|
40
|
+
@handle = render_pass_p.value
|
|
41
|
+
finalize_with @vk, :vkDestroyRenderPass, @vk.device, @handle, nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def add_attachment(format:,
|
|
45
|
+
samples: 1,
|
|
46
|
+
load_op: :clear,
|
|
47
|
+
store_op: :store,
|
|
48
|
+
stencil_load_op: :dont_care,
|
|
49
|
+
stencil_store_op: :dont_care,
|
|
50
|
+
initial_layout: nil,
|
|
51
|
+
final_layout: :presentation_src)
|
|
52
|
+
attachment = VkAttachmentDescription.malloc
|
|
53
|
+
attachment.format = sym_to_image_format(format)
|
|
54
|
+
attachment.samples = num_to_samples(samples)
|
|
55
|
+
attachment.loadOp = sym_to_load_op(load_op)
|
|
56
|
+
attachment.storeOp = sym_to_store_op(store_op)
|
|
57
|
+
attachment.stencilLoadOp = sym_to_load_op(stencil_load_op)
|
|
58
|
+
attachment.stencilStoreOp = sym_to_store_op(stencil_store_op)
|
|
59
|
+
attachment.initialLayout = sym_to_image_layout(initial_layout)
|
|
60
|
+
attachment.finalLayout = sym_to_image_layout(final_layout)
|
|
61
|
+
@attachments << attachment
|
|
62
|
+
@attachments.size - 1
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def add_subpass(**args)
|
|
66
|
+
subpass = Vulkan::RenderPass::Subpass.new(@vk, **args)
|
|
67
|
+
@subpasses << subpass
|
|
68
|
+
subpass
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class Sampler
|
|
3
|
+
include Vulkan::Checks
|
|
4
|
+
include Vulkan::Conversions
|
|
5
|
+
include Vulkan::Finalizer
|
|
6
|
+
|
|
7
|
+
def initialize(vk, device,
|
|
8
|
+
mag_filter: :linear,
|
|
9
|
+
min_filter: :linear,
|
|
10
|
+
address_mode_u: :repeat,
|
|
11
|
+
address_mode_v: :repeat,
|
|
12
|
+
address_mode_w: :repeat,
|
|
13
|
+
anisotropy: device.feature_enabled?(:sampler_anisotropy),
|
|
14
|
+
max_anisotropy: anisotropy ? 16 : 1,
|
|
15
|
+
border_color: :int_opaque_black,
|
|
16
|
+
unnormalized_coords: false,
|
|
17
|
+
compare: false,
|
|
18
|
+
compare_op: :always,
|
|
19
|
+
mipmap_mode: :linear,
|
|
20
|
+
mip_lod_bias: 0,
|
|
21
|
+
min_lod: 0,
|
|
22
|
+
max_lod: 0
|
|
23
|
+
)
|
|
24
|
+
sampler_info = VkSamplerCreateInfo.malloc
|
|
25
|
+
sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO
|
|
26
|
+
sampler_info.magFilter = sym_to_filter(mag_filter)
|
|
27
|
+
sampler_info.minFilter = sym_to_filter(min_filter)
|
|
28
|
+
sampler_info.addressModeU = sym_to_sampler_address_mode(address_mode_u)
|
|
29
|
+
sampler_info.addressModeV = sym_to_sampler_address_mode(address_mode_v)
|
|
30
|
+
sampler_info.addressModeW = sym_to_sampler_address_mode(address_mode_w)
|
|
31
|
+
sampler_info.anisotropyEnable = bool_to_vk(anisotropy)
|
|
32
|
+
sampler_info.maxAnisotropy = max_anisotropy
|
|
33
|
+
sampler_info.borderColor = sym_to_border_color(border_color)
|
|
34
|
+
sampler_info.unnormalizedCoordinates = bool_to_vk(unnormalized_coords)
|
|
35
|
+
sampler_info.compareEnable = bool_to_vk(compare)
|
|
36
|
+
sampler_info.compareOp = sym_to_compare_op(compare_op)
|
|
37
|
+
sampler_info.mipmapMode = sym_to_sampler_mipmap_mode(mipmap_mode)
|
|
38
|
+
sampler_info.mipLodBias = mip_lod_bias
|
|
39
|
+
sampler_info.minLod = min_lod
|
|
40
|
+
sampler_info.maxLod = max_lod
|
|
41
|
+
|
|
42
|
+
handle_p = Vulkan.create_value('void *', nil)
|
|
43
|
+
check_result vk.vkCreateSampler(vk.device, sampler_info, nil, handle_p)
|
|
44
|
+
@handle = handle_p.value
|
|
45
|
+
finalize_with vk, :vkDestroySampler, vk.device, @handle, nil
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Vulkan
|
|
2
|
+
class Semaphore
|
|
3
|
+
include Vulkan::Checks
|
|
4
|
+
include Vulkan::Finalizer
|
|
5
|
+
|
|
6
|
+
def initialize(vk)
|
|
7
|
+
@vk = vk
|
|
8
|
+
semaphore_info = VkSemaphoreCreateInfo.malloc
|
|
9
|
+
semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
|
|
10
|
+
sem_p = Vulkan.create_value('void *', nil)
|
|
11
|
+
check_result @vk.vkCreateSemaphore(@vk.device, semaphore_info, nil, sem_p)
|
|
12
|
+
@handle = sem_p.value
|
|
13
|
+
finalize_with @vk, :vkDestroySemaphore, @vk.device, @handle, nil
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|