{"id":48067701,"url":"https://github.com/dust-engine/pumicite","last_synced_at":"2026-04-04T14:37:23.004Z","repository":{"id":337784259,"uuid":"1152040319","full_name":"dust-engine/pumicite","owner":"dust-engine","description":"A Vulkan rendering framework for Bevy that preserves direct, low-level GPU control.","archived":false,"fork":false,"pushed_at":"2026-03-29T08:22:49.000Z","size":446,"stargazers_count":21,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T09:01:45.425Z","etag":null,"topics":["bevy","vulkan"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dust-engine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-07T09:13:16.000Z","updated_at":"2026-03-23T17:02:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dust-engine/pumicite","commit_stats":null,"previous_names":["dust-engine/pumicite"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dust-engine/pumicite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dust-engine%2Fpumicite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dust-engine%2Fpumicite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dust-engine%2Fpumicite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dust-engine%2Fpumicite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dust-engine","download_url":"https://codeload.github.com/dust-engine/pumicite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dust-engine%2Fpumicite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31403072,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bevy","vulkan"],"created_at":"2026-04-04T14:37:22.908Z","updated_at":"2026-04-04T14:37:22.980Z","avatar_url":"https://github.com/dust-engine.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pumicite\n\nA Vulkan rendering framework for Bevy that preserves direct, low-level GPU control\nwhile using Bevy's ECS as the backbone for scheduling, concurrency, and resource\nmanagement.\n\n\u003cimg src=\"https://repository-images.githubusercontent.com/1152040319/4887a04b-f01e-41ae-8aa4-5d9e2db84f48\" height=\"250px\"\u003e\n\n## Why Pumicite?\n\nBevy's built-in renderer uses wgpu, which prioritizes safety over giving you direct\ncontrol of the GPU. Pumicite takes a different approach: it provides you with the essential tools\nto write an efficient and flexible Vulkan application, but leaves enough room for you to fine tune your\napplication and make the best out of Vulkan.\n\nInstead of building a render graph abstraction on top of Bevy, it treats **Bevy systems as render graph nodes**\nand **system ordering as node dependencies**. A schedule build pass automatically\nhandles command buffer allocation, barrier insertion, and queue submission.\n\nYou write Bevy systems that record Vulkan commands. Pumicite takes care of the rest.\n\n```rust\nuse bevy::prelude::*;\nuse bevy_pumicite::prelude::*;\n\nfn main() {\n    let mut app = App::new();\n    app.add_plugins(bevy_pumicite::DefaultPlugins);\n    app.add_systems(PostUpdate, clear.in_set(DefaultRenderSet));\n    app.run();\n}\n\nfn clear(\n    mut swapchain_image: Query\u003c\u0026mut SwapchainImage, With\u003cbevy::window::PrimaryWindow\u003e\u003e,\n    mut state: SubmissionState,\n    time: Res\u003cTime\u003e,\n) {\n    let Ok(mut swapchain_image) = swapchain_image.single_mut() else { return };\n\n    state.record(|encoder| {\n        let Some(current) = swapchain_image.current_image() else { return };\n        let current = encoder.lock(current, vk::PipelineStageFlags2::CLEAR);\n        encoder.use_image_resource(\n            current, \u0026mut swapchain_image.state,\n            Access::CLEAR, vk::ImageLayout::TRANSFER_DST_OPTIMAL,\n            0..1, 0..1, false,\n        );\n        encoder.emit_barriers();\n\n        let hue = (time.elapsed_secs() * 72.0) % 360.0;\n        let color: bevy::color::Srgba = bevy::color::Hsla::new(hue, 0.8, 0.5, 1.0).into();\n        encoder.clear_color_image_with_layout(\n            current,\n            \u0026vk::ClearColorValue { float32: color.to_f32_array() },\n            vk::ImageLayout::TRANSFER_DST_OPTIMAL,\n        );\n    });\n}\n```\n\n## Key Features\n\n- **System-as-Render-Graph** -- Bevy systems are render graph nodes. The ECS scheduler\n  handles dependency tracking, mutual exclusion, and parallel execution. A\n  `ScheduleBuildPass` transforms system sets into `vkQueueSubmit` calls.\n\n- **Coroutine-as-Render-Graph** -- Record commands with Rust async/await, or ideally coroutines\n  when it stabilizes. Yield points emit barriers and enable cross-future barrier merging.\n\n- **GPUMutex** -- Timeline semaphore-based cross-queue synchronization. Lock a resource\n  on a command encoder and semaphore waits are inserted automatically. Safe deferred\n  cleanup via a recycler thread.\n\n- **Resource State Tracking** -- Declare how you're about to use a resource and the\n  framework computes the minimal pipeline barrier. You control the tracking granularity\n  and where state is stored.\n\n- **Bindless Rendering** -- Global descriptor heaps using `VK_EXT_mutable_descriptor_type`.\n  All resources in one array, accessed by index through push constants. No descriptor\n  set switching between draws. Forward compatible with `VK_EXT_descriptor_heap`.\n\n- **Dynamic Rendering** -- No legacy `VkRenderPass` or `VkFramebuffer`. Attachments are\n  specified inline when you begin rendering.\n\n## Requirements\n\n- **Rust**: Nightly\n- **Vulkan**: 1.2+ with `VK_KHR_synchronization2` and `VK_KHR_timeline_semaphore`\n- **Platform**: Windows, Linux, macOS (via MoltenVK or KosmicKrisp)\n\n## Getting Started\n\n### With Bevy\n\n```toml\n[dependencies]\nbevy = { version = \"0.17.0-dev\", default-features = false, features = [\n    \"bevy_winit\", \"bevy_asset\", \"multi_threaded\"\n] }\nbevy_pumicite = \"0.1\"\n\n[patch.crates-io]\n# Unfortunately, we need to fork bevy for now. The goal is to eventually upstream all the changes.\nbevy = { git = \"https://github.com/dust-engine/bevy\", branch = \"release-0.17.3\" }\n```\n\n```rust\nfn main() {\n    App::new()\n        .add_plugins(bevy_pumicite::DefaultPlugins)\n        .run();\n}\n```\n\n### Without Bevy\n\n```toml\n[dependencies]\npumicite = \"0.1\"\n```\n\n```rust\nuse pumicite::prelude::*;\n\nlet (device, mut queue) = Device::create_system_default().unwrap();\nlet allocator = Allocator::new(device.clone()).unwrap();\n```\n\n## Examples\n\nRun examples with:\n\n```bash\ncargo run --example \u003cname\u003e\n```\n\n| Example | Description |\n|---|---|\n| `basics` | Headless image clear -- no window, no Bevy |\n| `clear` | Window that clears to a cycling color |\n| `triangle` | Graphics pipeline with dynamic rendering |\n| `mandelbrot` | Interactive compute shader with push descriptors |\n| `bindless` | Compute shader using bindless descriptor indexing |\n| `sky_atmosphere` | Precomputed atmospheric scattering LUTs |\n| `mesh_shading` | Mesh shader pipeline with dynamic rendering |\n| `mesh_shader_culling` | Mesh shader culling with egui debug UI |\n| `egui` | egui integration for immediate-mode debug UIs |\n| `gltf` | glTF model loading with PBR shading |\n\n## Crates\n\n| Crate | Description |\n|---|---|\n| `pumicite` | Core Vulkan wrapper -- device, commands, sync, memory, pipelines |\n| `bevy_pumicite` | Bevy integration -- plugins, submission sets, asset loaders, swapchain |\n| `pumicite_egui` | egui integration for debug UIs |\n| `pumicite_scene` | Scene and glTF loading |\n\n## Tutorial\n\nThe [tutorial](https://github.com/dust-engine/pumicite/wiki) walks through Pumicite from the ground up:\n\n1. [Overview](https://github.com/dust-engine/pumicite/wiki/Overview) -- Motivation, philosophy, and key concepts\n2. [Getting Started](https://github.com/dust-engine/pumicite/wiki/Getting-Started) -- Device creation and first command buffer\n3. [Resource Management](https://github.com/dust-engine/pumicite/wiki/Resource%20Management) -- Buffers, images, and memory allocation\n4. [Synchronization](https://github.com/dust-engine/pumicite/wiki/Synchronization) -- Barriers, resource state tracking, and GPUMutex\n5. [Bevy Integration](https://github.com/dust-engine/pumicite/wiki/Bevy%20Integration) -- Plugins, submission sets, and the ECS render graph\n6. [Compute](https://github.com/dust-engine/pumicite/wiki/Compute) -- Compute pipelines, dispatch, and multi-pass workflows\n7. [Rendering](https://github.com/dust-engine/pumicite/wiki/Rendering) -- Dynamic rendering, graphics pipelines, and draw commands\n8. [Bindless](https://github.com/dust-engine/pumicite/wiki/Bindless) -- Descriptor heaps and bindless resource indexing\n\n## License\n\nDual-licensed under [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE).\n\n---\n\n**Note**: Pumicite is under active development. We offer no API stability guarantee until 1.0 release. Use at your own risk.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdust-engine%2Fpumicite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdust-engine%2Fpumicite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdust-engine%2Fpumicite/lists"}