ursus_core/render/resource/
image.rs1use 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}