Skip to content

Commit abc9299

Browse files
committed
ash: split mod graphics into renderer and render_pipeline, like wgpu
1 parent f7884b2 commit abc9299

File tree

9 files changed

+809
-108
lines changed

9 files changed

+809
-108
lines changed

generated/graphics/ash/cargo-gpu/mygraphics/src/ash_renderer/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::ash_renderer::device::MyDevice;
2-
use crate::ash_renderer::graphics::{MyRenderPipelineManager, MyRenderer};
2+
use crate::ash_renderer::render_pipeline::MyRenderPipelineManager;
3+
use crate::ash_renderer::renderer::MyRenderer;
34
use crate::ash_renderer::swapchain::MySwapchainManager;
45
use crate::util::enable_debug_layer;
56
use ash::util::read_spv;
@@ -12,7 +13,8 @@ use winit::{
1213
};
1314

1415
pub mod device;
15-
pub mod graphics;
16+
pub mod render_pipeline;
17+
pub mod renderer;
1618
pub mod single_command_buffer;
1719
pub mod swapchain;
1820

graphics/mygraphics/src/ash_renderer/graphics.rs renamed to generated/graphics/ash/cargo-gpu/mygraphics/src/ash_renderer/render_pipeline.rs

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
use crate::ash_renderer::device::MyDevice;
2-
use crate::ash_renderer::single_command_buffer::SingleCommandBuffer;
3-
use crate::ash_renderer::swapchain::DrawFrame;
42
use anyhow::Context;
53
use ash::vk;
64
use mygraphics_shaders::ShaderConstants;
75
use std::sync::Arc;
86

97
/// Manages the creation and recreation of [`MyRenderPipeline`], whenever new shader code ([`Self::set_shader_code`])
10-
/// is submitted or the spec constant is changed ([`Self::set_sky_fs_sun_intensity_factor`])
8+
/// is submitted
119
pub struct MyRenderPipelineManager {
1210
pub device: Arc<MyDevice>,
1311
color_out_format: vk::Format,
@@ -239,102 +237,3 @@ impl Drop for MyRenderPipelineManager {
239237
}
240238
}
241239
}
242-
243-
/// The renderer manages our command buffer and submits the commands, using [`MyRenderPipeline`] for drawing.
244-
pub struct MyRenderer {
245-
pub device: Arc<MyDevice>,
246-
pub pipeline: MyRenderPipelineManager,
247-
pub command: SingleCommandBuffer,
248-
}
249-
250-
impl MyRenderer {
251-
pub fn new(pipeline: MyRenderPipelineManager) -> anyhow::Result<Self> {
252-
Ok(Self {
253-
command: SingleCommandBuffer::new(pipeline.device.clone())?,
254-
device: pipeline.device.clone(),
255-
pipeline,
256-
})
257-
}
258-
259-
pub fn render_frame(
260-
&mut self,
261-
frame: DrawFrame,
262-
push_constants: ShaderConstants,
263-
) -> anyhow::Result<()> {
264-
unsafe {
265-
let device = &self.device;
266-
let pipeline = self.pipeline.get_pipeline()?;
267-
let cmd = self.command.cmd;
268-
269-
device.reset_command_pool(self.command.pool, vk::CommandPoolResetFlags::default())?;
270-
271-
{
272-
device.begin_command_buffer(
273-
cmd,
274-
&vk::CommandBufferBeginInfo::default()
275-
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT),
276-
)?;
277-
device.cmd_pipeline_barrier2(
278-
cmd,
279-
&vk::DependencyInfo::default().image_memory_barriers(&[
280-
vk::ImageMemoryBarrier2::default()
281-
.image(frame.image)
282-
.src_access_mask(vk::AccessFlags2::NONE)
283-
.src_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
284-
.old_layout(vk::ImageLayout::UNDEFINED)
285-
.dst_access_mask(vk::AccessFlags2::COLOR_ATTACHMENT_WRITE)
286-
.dst_stage_mask(vk::PipelineStageFlags2::COLOR_ATTACHMENT_OUTPUT)
287-
.new_layout(vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
288-
.subresource_range(
289-
vk::ImageSubresourceRange::default()
290-
.aspect_mask(vk::ImageAspectFlags::COLOR)
291-
.base_mip_level(0)
292-
.level_count(1)
293-
.base_array_layer(0)
294-
.layer_count(1),
295-
),
296-
]),
297-
);
298-
pipeline.render(device, cmd, frame.image_view, frame.extent, push_constants)?;
299-
device.cmd_pipeline_barrier2(
300-
cmd,
301-
&vk::DependencyInfo::default().image_memory_barriers(&[
302-
vk::ImageMemoryBarrier2::default()
303-
.image(frame.image)
304-
.src_access_mask(vk::AccessFlags2::COLOR_ATTACHMENT_WRITE)
305-
.src_stage_mask(vk::PipelineStageFlags2::COLOR_ATTACHMENT_OUTPUT)
306-
.old_layout(vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
307-
.dst_access_mask(vk::AccessFlags2::NONE)
308-
.dst_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
309-
.new_layout(vk::ImageLayout::PRESENT_SRC_KHR)
310-
.subresource_range(
311-
vk::ImageSubresourceRange::default()
312-
.aspect_mask(vk::ImageAspectFlags::COLOR)
313-
.base_mip_level(0)
314-
.level_count(1)
315-
.base_array_layer(0)
316-
.layer_count(1),
317-
),
318-
]),
319-
);
320-
device.end_command_buffer(cmd)?;
321-
}
322-
323-
device.queue_submit2(
324-
device.main_queue,
325-
&[vk::SubmitInfo2::default()
326-
.wait_semaphore_infos(&[vk::SemaphoreSubmitInfo::default()
327-
.semaphore(frame.acquire_semaphore)
328-
.stage_mask(vk::PipelineStageFlags2::TOP_OF_PIPE)])
329-
.command_buffer_infos(&[
330-
vk::CommandBufferSubmitInfo::default().command_buffer(cmd)
331-
])
332-
.signal_semaphore_infos(&[vk::SemaphoreSubmitInfo::default()
333-
.semaphore(frame.draw_finished_semaphore)
334-
.stage_mask(vk::PipelineStageFlags2::BOTTOM_OF_PIPE)])],
335-
frame.draw_finished_fence,
336-
)?;
337-
Ok(())
338-
}
339-
}
340-
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
use crate::ash_renderer::device::MyDevice;
2+
use crate::ash_renderer::render_pipeline::MyRenderPipelineManager;
3+
use crate::ash_renderer::single_command_buffer::SingleCommandBuffer;
4+
use crate::ash_renderer::swapchain::DrawFrame;
5+
use ash::vk;
6+
use mygraphics_shaders::ShaderConstants;
7+
use std::sync::Arc;
8+
9+
/// The renderer manages our command buffer and submits the commands, using [`MyRenderPipeline`] for drawing.
10+
pub struct MyRenderer {
11+
pub device: Arc<MyDevice>,
12+
pub pipeline: MyRenderPipelineManager,
13+
pub command: SingleCommandBuffer,
14+
}
15+
16+
impl MyRenderer {
17+
pub fn new(pipeline: MyRenderPipelineManager) -> anyhow::Result<Self> {
18+
Ok(Self {
19+
command: SingleCommandBuffer::new(pipeline.device.clone())?,
20+
device: pipeline.device.clone(),
21+
pipeline,
22+
})
23+
}
24+
25+
pub fn render_frame(
26+
&mut self,
27+
frame: DrawFrame,
28+
push_constants: ShaderConstants,
29+
) -> anyhow::Result<()> {
30+
unsafe {
31+
let device = &self.device;
32+
let pipeline = self.pipeline.get_pipeline()?;
33+
let cmd = self.command.cmd;
34+
35+
device.reset_command_pool(self.command.pool, vk::CommandPoolResetFlags::default())?;
36+
37+
{
38+
device.begin_command_buffer(
39+
cmd,
40+
&vk::CommandBufferBeginInfo::default()
41+
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT),
42+
)?;
43+
device.cmd_pipeline_barrier2(
44+
cmd,
45+
&vk::DependencyInfo::default().image_memory_barriers(&[
46+
vk::ImageMemoryBarrier2::default()
47+
.image(frame.image)
48+
.src_access_mask(vk::AccessFlags2::NONE)
49+
.src_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
50+
.old_layout(vk::ImageLayout::UNDEFINED)
51+
.dst_access_mask(vk::AccessFlags2::COLOR_ATTACHMENT_WRITE)
52+
.dst_stage_mask(vk::PipelineStageFlags2::COLOR_ATTACHMENT_OUTPUT)
53+
.new_layout(vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
54+
.subresource_range(
55+
vk::ImageSubresourceRange::default()
56+
.aspect_mask(vk::ImageAspectFlags::COLOR)
57+
.base_mip_level(0)
58+
.level_count(1)
59+
.base_array_layer(0)
60+
.layer_count(1),
61+
),
62+
]),
63+
);
64+
pipeline.render(device, cmd, frame.image_view, frame.extent, push_constants)?;
65+
device.cmd_pipeline_barrier2(
66+
cmd,
67+
&vk::DependencyInfo::default().image_memory_barriers(&[
68+
vk::ImageMemoryBarrier2::default()
69+
.image(frame.image)
70+
.src_access_mask(vk::AccessFlags2::COLOR_ATTACHMENT_WRITE)
71+
.src_stage_mask(vk::PipelineStageFlags2::COLOR_ATTACHMENT_OUTPUT)
72+
.old_layout(vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
73+
.dst_access_mask(vk::AccessFlags2::NONE)
74+
.dst_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
75+
.new_layout(vk::ImageLayout::PRESENT_SRC_KHR)
76+
.subresource_range(
77+
vk::ImageSubresourceRange::default()
78+
.aspect_mask(vk::ImageAspectFlags::COLOR)
79+
.base_mip_level(0)
80+
.level_count(1)
81+
.base_array_layer(0)
82+
.layer_count(1),
83+
),
84+
]),
85+
);
86+
device.end_command_buffer(cmd)?;
87+
}
88+
89+
device.queue_submit2(
90+
device.main_queue,
91+
&[vk::SubmitInfo2::default()
92+
.wait_semaphore_infos(&[vk::SemaphoreSubmitInfo::default()
93+
.semaphore(frame.acquire_semaphore)
94+
.stage_mask(vk::PipelineStageFlags2::TOP_OF_PIPE)])
95+
.command_buffer_infos(&[
96+
vk::CommandBufferSubmitInfo::default().command_buffer(cmd)
97+
])
98+
.signal_semaphore_infos(&[vk::SemaphoreSubmitInfo::default()
99+
.semaphore(frame.draw_finished_semaphore)
100+
.stage_mask(vk::PipelineStageFlags2::BOTTOM_OF_PIPE)])],
101+
frame.draw_finished_fence,
102+
)?;
103+
Ok(())
104+
}
105+
}
106+
}

generated/graphics/ash/spirv-builder/mygraphics/src/ash_renderer/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::ash_renderer::device::MyDevice;
2-
use crate::ash_renderer::graphics::{MyRenderPipelineManager, MyRenderer};
2+
use crate::ash_renderer::render_pipeline::MyRenderPipelineManager;
3+
use crate::ash_renderer::renderer::MyRenderer;
34
use crate::ash_renderer::swapchain::MySwapchainManager;
45
use crate::util::enable_debug_layer;
56
use ash::util::read_spv;
@@ -12,7 +13,8 @@ use winit::{
1213
};
1314

1415
pub mod device;
15-
pub mod graphics;
16+
pub mod render_pipeline;
17+
pub mod renderer;
1618
pub mod single_command_buffer;
1719
pub mod swapchain;
1820

0 commit comments

Comments
 (0)