rotex-vulkan 0.1.1

A Vulkan backend for rotex_core
Documentation
use ash::vk;

use crate::backend::vulkan::{
    DescriptorPool, DescriptorSet, Device, Framebuffer, GraphicsPipeline, GraphicsPipelineLayout,
    RenderPass, RotexBuffer, RotexImage, RotexSampler, Semaphore, VulkanSurface, VulkanSwapchain,
};
use rotex_types::resource::{MaterialDescriptor, MaterialId, TextureDescriptor};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(super) struct VertexLayoutId(pub(super) u64);

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(super) enum DepthMode {
    Disabled,
    Enabled,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(super) struct MaterialPipelineKey {
    pub(super) material_id: MaterialId,
    pub(super) vertex_layout_id: VertexLayoutId,
    pub(super) depth_mode: DepthMode,
    pub(super) render_pass: vk::RenderPass,
}

impl DepthMode {
    pub(super) fn is_enabled(self) -> bool {
        matches!(self, Self::Enabled)
    }
}

pub(super) struct MeshResource {
    pub(super) vertex_buffer: RotexBuffer,
    pub(super) index_buffer: RotexBuffer,
    pub(super) index_type: vk::IndexType,
    pub(super) index_count: u32,
    pub(super) vertex_layout_id: VertexLayoutId,
}

pub(super) struct MaterialResource {
    pub(super) descriptor: MaterialDescriptor,
}

pub(super) struct TextureResource {
    pub(super) descriptor: TextureDescriptor,
    pub(super) image: RotexImage,
    pub(super) sampler: RotexSampler,
    pub(super) descriptor_set: DescriptorSet,
}

impl TextureResource {
    pub(super) fn destroy(self, device: &Device, descriptor_pool: &DescriptorPool) {
        let _ = descriptor_pool.free_sets(device, &[self.descriptor_set]);
        self.sampler.destroy(device);
        self.image.destroy(device);
    }
}

pub(super) struct MaterialPipeline {
    pub(super) layout: GraphicsPipelineLayout,
    pub(super) pipeline: GraphicsPipeline,
}

pub(super) struct RenderTargets {
    pub(super) render_pass: RenderPass,
    pub(super) framebuffers: Vec<Framebuffer>,
    pub(super) depth_image: Option<RotexImage>,
}

impl RenderTargets {
    pub(super) fn destroy(self, device: &Device) {
        for framebuffer in self.framebuffers {
            framebuffer.destroy(device);
        }
        self.render_pass.destroy(device);
        if let Some(depth_image) = self.depth_image {
            depth_image.destroy(device);
        }
    }
}

pub(super) struct SurfaceState {
    pub(super) surface: VulkanSurface,
    pub(super) swapchain: VulkanSwapchain,
    pub(super) extent: vk::Extent2D,
    pub(super) color_targets: RenderTargets,
    pub(super) depth_targets: Option<RenderTargets>,
    pub(super) image_available: Semaphore,
    pub(super) render_finished: Vec<Semaphore>,
}