# louisforestier/vulkanengine architecture

> Architecture diagram of the GitHub repository louisforestier/vulkanengine, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/louisforestier/vulkanengine
- Repository: https://github.com/louisforestier/vulkanengine

## Overview

VulkanEngine is a learning-focused Vulkan renderer with a companion asset-baking tool. The principal runtime path starts at the application entry point, initializes the windowed Vulkan engine, processes events and UI, batches renderables, and submits graphics work for presentation. Separately, the baker converts PNG textures and OBJ meshes into compressed asset files using the shared asset library. The graph reflects the sampled engine and asset code; GPU-driven and bindless rendering are README plans, not established runtime stages in the available evidence.

Main entry points: [`engine/vk_engine.cpp`](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_engine.cpp) (Vulkan engine), [`assetlib/asset_loader.cpp`](https://github.com/louisforestier/vulkanengine/blob/main/assetlib/asset_loader.cpp) (Asset file I/O), [`asset-baker/asset_main.cpp`](https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp) (Asset baker), [`engine/main.cpp`](https://github.com/louisforestier/vulkanengine/blob/main/engine/main.cpp) (Application entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application"]
  node_main["Application entry<br/>[main.cpp]"]
end

subgraph group_render["Rendering Engine"]
  node_engine["Vulkan engine<br/>[vk_engine.cpp]"]
  node_input["SDL event handler<br/>[event_handler.cpp]"]
  node_camera["Camera<br/>[camera.cpp]"]
  node_ui["ImGui widgets<br/>[imgui_widgets.cpp]"]
  node_device_select["GPU selection"]
  node_device_build["Device setup"]
  node_instance_build["Instance setup"]
  node_swapchain["Swapchain<br/>[vk_swapchain.cpp]"]
  node_descriptors["Descriptors<br/>[vk_descriptors.cpp]"]
  node_pipeline["Graphics pipeline<br/>[vk_pipeline.cpp]"]
  node_mesh["Mesh GPU resources<br/>[vk_mesh.cpp]"]
  node_textures["Texture GPU resources<br/>[vk_textures.cpp]"]
  node_profiler["Vulkan profiler<br/>[vk_profiler.cpp]"]
end

subgraph group_assets["Asset Pipeline"]
  node_asset_main["Asset baker<br/>[asset_main.cpp]"]
  node_mesh_convert["OBJ conversion<br/>[asset_main.cpp]"]
  node_texture_convert["PNG conversion<br/>[asset_main.cpp]"]
  node_mesh_format["Mesh packing<br/>[mesh_asset.cpp]"]
  node_texture_format["Texture packing<br/>[texture_asset.cpp]"]
  node_asset_io["Asset file I/O<br/>[asset_loader.cpp]"]
  node_asset_files["Baked asset files"]
end

subgraph group_platform["Platform And GPU"]
  node_sdl["SDL"]
  node_vulkan["Vulkan GPU"]
  node_tracy["Tracy"]
end

node_user(("User"))

node_user -->|"starts"| node_main
node_main -->|"initializes and runs"| node_engine
node_engine -->|"builds instance"| node_instance_build
node_engine -->|"selects GPU"| node_device_select
node_engine -->|"builds device"| node_device_build
node_engine -->|"creates swapchain"| node_swapchain
node_engine -->|"creates descriptors"| node_descriptors
node_engine -->|"builds pipelines"| node_pipeline
node_engine -->|"uploads meshes"| node_mesh
node_engine -->|"loads images"| node_textures
node_engine -->|"dispatches events"| node_input
node_engine -->|"updates view"| node_camera
node_engine -->|"draws UI"| node_ui
node_engine -->|"profiles rendering"| node_profiler
node_engine -->|"uses window and events"| node_sdl
node_engine -->|"submits graphics work"| node_vulkan
node_engine -.->|"emits profiling data"| node_tracy
node_sdl -->|"delivers events"| node_engine
node_asset_main -->|"converts OBJ"| node_mesh_convert
node_asset_main -->|"converts PNG"| node_texture_convert
node_mesh_convert -->|"packs mesh data"| node_mesh_format
node_texture_convert -->|"packs pixels"| node_texture_format
node_asset_main -->|"saves assets"| node_asset_io
node_mesh_format -->|"provides packed data"| node_asset_io
node_texture_format -->|"provides packed data"| node_asset_io
node_asset_io -->|"writes binary files"| node_asset_files

click node_main "https://github.com/louisforestier/vulkanengine/blob/main/engine/main.cpp"
click node_engine "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_engine.cpp"
click node_input "https://github.com/louisforestier/vulkanengine/blob/main/engine/event_handler.cpp"
click node_camera "https://github.com/louisforestier/vulkanengine/blob/main/engine/camera.cpp"
click node_ui "https://github.com/louisforestier/vulkanengine/blob/main/engine/imgui_widgets.cpp"
click node_device_select "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_device_selector.cpp"
click node_device_build "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_device_builder.cpp"
click node_instance_build "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_instance_builder.cpp"
click node_swapchain "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_swapchain.cpp"
click node_descriptors "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_descriptors.cpp"
click node_pipeline "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_pipeline.cpp"
click node_mesh "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_mesh.cpp"
click node_textures "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_textures.cpp"
click node_profiler "https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_profiler.cpp"
click node_asset_main "https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp"
click node_mesh_convert "https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp"
click node_texture_convert "https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp"
click node_mesh_format "https://github.com/louisforestier/vulkanengine/blob/main/assetlib/mesh_asset.cpp"
click node_texture_format "https://github.com/louisforestier/vulkanengine/blob/main/assetlib/texture_asset.cpp"
click node_asset_io "https://github.com/louisforestier/vulkanengine/blob/main/assetlib/asset_loader.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_main,node_user toneBlue
class node_engine,node_input,node_camera,node_ui,node_device_select,node_device_build,node_instance_build,node_swapchain,node_descriptors,node_pipeline,node_mesh,node_textures,node_profiler toneAmber
class node_asset_main,node_mesh_convert,node_texture_convert,node_mesh_format,node_texture_format,node_asset_io,node_asset_files toneMint
class node_sdl,node_vulkan,node_tracy toneRose
```

## Components

### Application

- [Application entry](https://github.com/louisforestier/vulkanengine/blob/main/engine/main.cpp): `engine/main.cpp`

### Rendering Engine

- [Vulkan engine](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_engine.cpp): `engine/vk_engine.cpp`
- [SDL event handler](https://github.com/louisforestier/vulkanengine/blob/main/engine/event_handler.cpp): `engine/event_handler.cpp`
- [Camera](https://github.com/louisforestier/vulkanengine/blob/main/engine/camera.cpp): `engine/camera.cpp`
- [ImGui widgets](https://github.com/louisforestier/vulkanengine/blob/main/engine/imgui_widgets.cpp): `engine/imgui_widgets.cpp`
- [GPU selection](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_device_selector.cpp): `engine/vk_device_selector.cpp`
- [Device setup](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_device_builder.cpp): `engine/vk_device_builder.cpp`
- [Instance setup](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_instance_builder.cpp): `engine/vk_instance_builder.cpp`
- [Swapchain](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_swapchain.cpp): `engine/vk_swapchain.cpp`
- [Descriptors](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_descriptors.cpp): `engine/vk_descriptors.cpp`
- [Graphics pipeline](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_pipeline.cpp): `engine/vk_pipeline.cpp`
- [Mesh GPU resources](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_mesh.cpp): `engine/vk_mesh.cpp`
- [Texture GPU resources](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_textures.cpp): `engine/vk_textures.cpp`
- [Vulkan profiler](https://github.com/louisforestier/vulkanengine/blob/main/engine/vk_profiler.cpp): `engine/vk_profiler.cpp`

### Asset Pipeline

- [Asset baker](https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp): `asset-baker/asset_main.cpp`
- [OBJ conversion](https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp): `asset-baker/asset_main.cpp`
- [PNG conversion](https://github.com/louisforestier/vulkanengine/blob/main/asset-baker/asset_main.cpp): `asset-baker/asset_main.cpp`
- [Mesh packing](https://github.com/louisforestier/vulkanengine/blob/main/assetlib/mesh_asset.cpp): `assetlib/mesh_asset.cpp`
- [Texture packing](https://github.com/louisforestier/vulkanengine/blob/main/assetlib/texture_asset.cpp): `assetlib/texture_asset.cpp`
- [Asset file I/O](https://github.com/louisforestier/vulkanengine/blob/main/assetlib/asset_loader.cpp): `assetlib/asset_loader.cpp`
- **Baked asset files**

### Platform And GPU

- **SDL**
- **Vulkan GPU**
- **Tracy**

### Other components

- **User**

## Connections

- User → Application entry: starts
- Application entry → Vulkan engine: initializes and runs
- Vulkan engine → Instance setup: builds instance
- Vulkan engine → GPU selection: selects GPU
- Vulkan engine → Device setup: builds device
- Vulkan engine → Swapchain: creates swapchain
- Vulkan engine → Descriptors: creates descriptors
- Vulkan engine → Graphics pipeline: builds pipelines
- Vulkan engine → Mesh GPU resources: uploads meshes
- Vulkan engine → Texture GPU resources: loads images
- Vulkan engine → SDL event handler: dispatches events
- Vulkan engine → Camera: updates view
- Vulkan engine → ImGui widgets: draws UI
- Vulkan engine → Vulkan profiler: profiles rendering
- Vulkan engine → SDL: uses window and events
- Vulkan engine → Vulkan GPU: submits graphics work
- Vulkan engine → Tracy: emits profiling data
- SDL → Vulkan engine: delivers events
- Asset baker → OBJ conversion: converts OBJ
- Asset baker → PNG conversion: converts PNG
- OBJ conversion → Mesh packing: packs mesh data
- PNG conversion → Texture packing: packs pixels
- Asset baker → Asset file I/O: saves assets
- Mesh packing → Asset file I/O: provides packed data
- Texture packing → Asset file I/O: provides packed data
- Asset file I/O → Baked asset files: writes binary files
