Fix `VK_ERROR_SURFACE_LOST_KHR`, `VK_ERROR_OUT_OF_POOL_MEMORY`, typos in shader names

- `VK_ERROR_SURFACE_LOST_KHR` was caused by the sdl window being
  dropped, it is now kept in gamestate to prevent that
- `VK_ERROR_OUT_OF_POOL_MEMORY` was caused by the descriptor pool having
  a hardcodes size for the number of descriptor sets instead of that number
  depending on the required number of sets

Note: We are still broken, a window opens and controls seem to work
      fine, but nothing is shown in the window
master
Avery 7 days ago
parent 2f15842ca4
commit dbce32f625
Signed by: Avery
GPG Key ID: 4E53F4CB69B2CC8D

@ -25,6 +25,7 @@ pub struct Camera {
impl Game<InWorld> { impl Game<InWorld> {
pub fn main_loop(mut self) -> Game<RenderAvailable> { pub fn main_loop(mut self) -> Game<RenderAvailable> {
println!("Starting main loop");
let mut event_pump = self let mut event_pump = self
.state .state
.sdl_context .sdl_context

@ -7,14 +7,13 @@ mod render;
use ash::Device; use ash::Device;
use ash::Entry; use ash::Entry;
use ash::Instance; use ash::Instance;
use ash::khr::surface;
use ash::vk; use ash::vk;
use game::Camera; use game::Camera;
use render::SwapchainCtx; use render::SwapchainCtx;
use render::loading_world::Component; use render::loading_world::Component;
use render::loading_world::WorldComponent; use render::loading_world::WorldComponent;
use render::skybox::Skybox; use render::skybox::Skybox;
use sdl2::Sdl; use sdl2::{Sdl, video::Window as SdlWindow};
use std::collections::HashMap; use std::collections::HashMap;
@ -32,7 +31,6 @@ pub struct RenderCtx {
pdev: vk::PhysicalDevice, pdev: vk::PhysicalDevice,
dev: Device, dev: Device,
surface: vk::SurfaceKHR, surface: vk::SurfaceKHR,
surface_loader: surface::Instance,
queue: vk::Queue, queue: vk::Queue,
queue_idx: u32, queue_idx: u32,
cmd_buf: vk::CommandBuffer, cmd_buf: vk::CommandBuffer,
@ -43,6 +41,7 @@ pub struct RenderCtx {
pub struct Window { pub struct Window {
width: u32, width: u32,
height: u32, height: u32,
_sdl: SdlWindow,
} }
pub struct RenderAvailable { pub struct RenderAvailable {

@ -277,11 +277,11 @@ impl Game<LoadingWorld> {
fn load_cube_shaders(ctx: &RenderCtx) -> (vk::ShaderModule, vk::ShaderModule) { fn load_cube_shaders(ctx: &RenderCtx) -> (vk::ShaderModule, vk::ShaderModule) {
let shader_vert_shader = ctx.shader_mod_from_file( let shader_vert_shader = ctx.shader_mod_from_file(
"shaders/shader_vert.spv", "shaders/cube_vert.spv",
vk::ShaderModuleCreateFlags::empty(), vk::ShaderModuleCreateFlags::empty(),
); );
let shader_frag_shader = ctx.shader_mod_from_file( let shader_frag_shader = ctx.shader_mod_from_file(
"shaders/shader_rag.spv", "shaders/cube_frag.spv",
vk::ShaderModuleCreateFlags::empty(), vk::ShaderModuleCreateFlags::empty(),
); );

@ -110,7 +110,7 @@ impl Game<InWorld> {
state: state:
InWorld { InWorld {
sdl_context, sdl_context,
window: Window { width, height }, window: Window { width, height, .. },
ctx: RenderCtx { dev, cmd_buf, .. }, ctx: RenderCtx { dev, cmd_buf, .. },
skybox, skybox,
components, components,

@ -2,7 +2,6 @@ use std::ffi::{CStr, CString};
use ash::{ use ash::{
Device, Entry, Instance, Device, Entry, Instance,
khr::surface,
vk::{self}, vk::{self},
}; };
use raw_window_handle::{HasDisplayHandle as _, HasWindowHandle as _}; use raw_window_handle::{HasDisplayHandle as _, HasWindowHandle as _};
@ -43,19 +42,20 @@ impl Game<Unstarted> {
let host_invis_idx = let host_invis_idx =
find_host_invisible(&instance, &pdev).expect("No host invisible memory found"); find_host_invisible(&instance, &pdev).expect("No host invisible memory found");
let surface_loader = surface::Instance::new(&entry, &instance);
Game { Game {
state: RenderAvailable { state: RenderAvailable {
sdl_context, sdl_context,
window: crate::Window { width, height }, window: crate::Window {
width,
height,
_sdl: window,
},
ctx: RenderCtx { ctx: RenderCtx {
entry, entry,
instance, instance,
pdev, pdev,
dev, dev,
surface, surface,
surface_loader,
queue, queue,
queue_idx, queue_idx,
cmd_buf, cmd_buf,

@ -137,6 +137,7 @@ impl Game<LoadingWorld> {
} }
pub fn start_world(self) -> Game<InWorld> { pub fn start_world(self) -> Game<InWorld> {
println!("Starting world");
let Self { let Self {
state: state:
LoadingWorld { LoadingWorld {
@ -153,7 +154,8 @@ impl Game<LoadingWorld> {
components, components,
}, },
} = self; } = self;
let desc_pool = setup_desc_pool(&ctx, requested_descriptors);
let desc_pool = setup_desc_pool(&ctx, requested_descriptors, (components.len() + 1) as u32);
let mut desc_sets = make_desc_sets( let mut desc_sets = make_desc_sets(
&ctx, &ctx,
@ -187,6 +189,8 @@ impl Game<LoadingWorld> {
let sem_finish = ctx.make_sem(); let sem_finish = ctx.make_sem();
let fence_flight = ctx.make_fence(); let fence_flight = ctx.make_fence();
println!("Starting world");
Game { Game {
state: InWorld { state: InWorld {
sdl_context, sdl_context,
@ -284,6 +288,7 @@ fn setup_render_pass(ctx: &RenderCtx) -> vk::RenderPass {
fn setup_desc_pool( fn setup_desc_pool(
ctx: &RenderCtx, ctx: &RenderCtx,
requested_descriptors: HashMap<vk::DescriptorType, u32>, requested_descriptors: HashMap<vk::DescriptorType, u32>,
num_sets: u32,
) -> vk::DescriptorPool { ) -> vk::DescriptorPool {
let pool_sizes = requested_descriptors let pool_sizes = requested_descriptors
.into_iter() .into_iter()
@ -295,7 +300,7 @@ fn setup_desc_pool(
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let pool_info = vk::DescriptorPoolCreateInfo::default() let pool_info = vk::DescriptorPoolCreateInfo::default()
.max_sets(1) .max_sets(num_sets)
.pool_sizes(&pool_sizes); .pool_sizes(&pool_sizes);
let pool = unsafe { let pool = unsafe {
ctx.dev ctx.dev

@ -198,7 +198,7 @@ fn load_skybox_shaders(ctx: &RenderCtx) -> (vk::ShaderModule, vk::ShaderModule)
vk::ShaderModuleCreateFlags::empty(), vk::ShaderModuleCreateFlags::empty(),
); );
let skybox_frag_shader = ctx.shader_mod_from_file( let skybox_frag_shader = ctx.shader_mod_from_file(
"shaders/skybox_rag.spv", "shaders/skybox_frag.spv",
vk::ShaderModuleCreateFlags::empty(), vk::ShaderModuleCreateFlags::empty(),
); );

Loading…
Cancel
Save