Using the Renderer

Now we can instantiate a renderer in our obsidian_app library, before moving on to filling out the Vulkan graphics backend.

List the obsidian_render library as a dependency in crates/obsidian_app/Cargo.toml:

obsidian_render = { path = "../obsidian_render" }

Now we can instantiate the renderer by modifying crates/obsidian_app/src/

Import the library types:

use obsidian_render::{Render, Backend};

Add a renderer property to the Application struct as a boxed trait object, and instantiate it in a constructor:

pub struct Application {
    pub renderer: Box<dyn Render>,

impl Application {
    pub fn new(window: &Window) -> Result<Self> {
        let logical_size = window.inner_size();
        let window_dimensions = [logical_size.width, logical_size.height];
        let renderer = Box::new(Render::create_backend(
        Ok(Self { renderer })

The Application can now be created with the constructor in the run_application method:

// '_window' becomes 'window' here since it is now used
let (event_loop, window) = create_window(&configuration)?;

let mut application = Application::new(&window)?;

If you run the program now with cargo run --release, the log output should include a message saying that the Vulkan render backend was created.