Skip to main content

ursus_core/render/resource/
image.rs

1use crate::render::resource::desc::{ExternalImageDesc, ResourceDesc, ResourceKind};
2use crate::vulkan::core::memory::destroy_image_resources;
3use crate::vulkan::core::{memory, DeviceContext};
4use ash::vk;
5use memory::ImageDesc;
6
7pub struct TransientImage {
8    pub image: vk::Image,
9    pub view: vk::ImageView,
10    pub memory: vk::DeviceMemory,
11    pub format: vk::Format,
12    pub extent: vk::Extent2D,
13    pub kind: ResourceKind,
14    pub name: String,
15    device: ash::Device,
16}
17
18impl TransientImage {
19    pub(crate) fn new(ctx: DeviceContext, desc: &ResourceDesc, width: u32, height: u32) -> anyhow::Result<Self> {
20        let img_desc = ImageDesc {
21            format: desc.format.to_vk(),
22            width,
23            height,
24            usage: desc.usage.to_vk(),
25            aspect_mask: desc.kind.aspect_mask(),
26            mip_levels: 1,
27        };
28        let img = memory::alloc_image(ctx, &img_desc)?;
29
30        log::debug!("TransientImage '{}': {}x{} {:?}", desc.name, width, height, desc.format);
31
32        Ok(Self {
33            image: img.image,
34            view: img.view,
35            memory: img.memory,
36            format: desc.format.to_vk(),
37            extent: vk::Extent2D { width, height },
38            kind: desc.kind,
39            name: desc.name.clone(),
40            device: ctx.device.clone(),
41        })
42    }
43}
44
45impl Drop for TransientImage {
46    fn drop(&mut self) {
47        unsafe { destroy_image_resources(&self.device, self.image, self.view, self.memory) }
48    }
49}
50
51pub(crate) struct ExternalSlot {
52    pub desc: ExternalImageDesc,
53    pub image: vk::Image,
54    pub view: vk::ImageView,
55    pub extent: vk::Extent2D,
56}
57
58pub(crate) enum ResourceEntry {
59    Transient {
60        desc: ResourceDesc,
61        image: Box<Option<TransientImage>>,
62    },
63    External(ExternalSlot),
64}
65
66pub struct ImageRef<'a> {
67    pub image: vk::Image,
68    pub view: vk::ImageView,
69    pub format: vk::Format,
70    pub extent: vk::Extent2D,
71    pub kind: ResourceKind,
72    pub name: &'a str,
73}
74
75pub trait GpuImage {
76    fn image(&self) -> vk::Image;
77    fn view(&self) -> vk::ImageView;
78    fn extent(&self) -> vk::Extent2D;
79    fn format(&self) -> vk::Format;
80    fn kind(&self) -> ResourceKind;
81}
82
83impl GpuImage for TransientImage {
84    fn image(&self) -> vk::Image {
85        self.image
86    }
87    fn view(&self) -> vk::ImageView {
88        self.view
89    }
90    fn extent(&self) -> vk::Extent2D {
91        self.extent
92    }
93    fn format(&self) -> vk::Format {
94        self.format
95    }
96    fn kind(&self) -> ResourceKind {
97        self.kind
98    }
99}
100
101impl<'a> GpuImage for ImageRef<'a> {
102    fn image(&self) -> vk::Image {
103        self.image
104    }
105    fn view(&self) -> vk::ImageView {
106        self.view
107    }
108    fn extent(&self) -> vk::Extent2D {
109        self.extent
110    }
111    fn format(&self) -> vk::Format {
112        self.format
113    }
114    fn kind(&self) -> ResourceKind {
115        self.kind
116    }
117}