use common::logging::macros::*;
use raw_window_handle::{RawDisplayHandle, RawWindowHandle};
use thiserror::Error;
use super::VulkanBackend;
use crate::renderer::backend::instance;
#[derive(Debug, Error)]
pub enum VulkanSurfaceError {
#[error("vulkan result has an error value: [{0:?}] {0}")]
UnexpectedResult(ash::vk::Result),
#[error("transparent")]
DisplayHandleError,
}
pub(super) struct VulkanSurface {
raw: ash::vk::SurfaceKHR,
loader: ash::khr::surface::Instance,
}
impl Drop for VulkanSurface {
fn drop(&mut self) {
unsafe {
self.loader.destroy_surface(self.raw, None);
}
trace!("surface destroyed");
}
}
impl std::fmt::Debug for VulkanSurface {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("<Vulkan Surface>").finish()
}
}
impl VulkanBackend {
pub(super) fn create_surface(
entry: &ash::Entry,
instance: &instance::VulkanInstance,
display_handle: RawDisplayHandle,
window_handle: RawWindowHandle,
) -> Result<VulkanSurface, VulkanSurfaceError> {
let raw = unsafe { ash_window::create_surface(entry, instance.get(), display_handle, window_handle, None).map_err(VulkanSurfaceError::UnexpectedResult)? };
let loader = ash::khr::surface::Instance::new(entry, instance.get());
trace!("surface initialized");
Ok(VulkanSurface { raw, loader })
}
}