aboutsummaryrefslogtreecommitdiff
path: root/stockton-render/src/draw
diff options
context:
space:
mode:
authortcmal <me@aria.rip>2024-08-25 17:44:21 +0100
committertcmal <me@aria.rip>2024-08-25 17:44:21 +0100
commit6ab78e3c14acfa7b9d29c9f9e36ffed1ab9e7c43 (patch)
tree09404d55f21f494ffdbcfd276701d3100b0149fa /stockton-render/src/draw
parent509c1f2b38d0287ec027b8671cb4f6bc68bc9e66 (diff)
fix(render): destroy shader modules properly
Diffstat (limited to 'stockton-render/src/draw')
-rw-r--r--stockton-render/src/draw/context.rs29
1 files changed, 24 insertions, 5 deletions
diff --git a/stockton-render/src/draw/context.rs b/stockton-render/src/draw/context.rs
index 9da5789..ed5b5ec 100644
--- a/stockton-render/src/draw/context.rs
+++ b/stockton-render/src/draw/context.rs
@@ -119,7 +119,13 @@ pub struct RenderingContext<'a> {
pub index_buffer: ManuallyDrop<StagedBuffer<'a, (u16, u16, u16)>>,
/// Our camera settings
- camera: WorkingCamera
+ camera: WorkingCamera,
+
+ /// The vertex shader module
+ vs_module: ManuallyDrop<ShaderModule>,
+
+ /// The fragment shader module
+ fs_module: ManuallyDrop<ShaderModule>
}
impl<'a> RenderingContext<'a> {
@@ -262,7 +268,7 @@ impl<'a> RenderingContext<'a> {
descriptor_set_layouts.push(texture_store.descriptor_set_layout.deref());
// Graphics pipeline
- let (pipeline_layout, pipeline) = Self::create_pipeline(&mut device, swapchain_properties.extent, &subpass, descriptor_set_layouts)?;
+ let (pipeline_layout, pipeline, vs_module, fs_module) = Self::create_pipeline(&mut device, swapchain_properties.extent, &subpass, descriptor_set_layouts)?;
// Swapchain and associated resources
let target_chain = TargetChain::new(&mut device, &adapter, &mut surface, &renderpass, &mut cmd_pool, swapchain_properties, None).map_err(|e| error::CreationError::TargetChainCreationError (e) )?;
@@ -287,6 +293,9 @@ impl<'a> RenderingContext<'a> {
vert_buffer: ManuallyDrop::new(vert_buffer),
index_buffer: ManuallyDrop::new(index_buffer),
+ vs_module: ManuallyDrop::new(vs_module),
+ fs_module: ManuallyDrop::new(fs_module),
+
camera
})
}
@@ -311,7 +320,10 @@ impl<'a> RenderingContext<'a> {
self.device
.destroy_pipeline_layout(ManuallyDrop::into_inner(read(&self.pipeline_layout)));
- let (pipeline_layout, pipeline) = {
+ self.device.destroy_shader_module(ManuallyDrop::into_inner(read(&self.vs_module)));
+ self.device.destroy_shader_module(ManuallyDrop::into_inner(read(&self.fs_module)));
+
+ let (pipeline_layout, pipeline, vs_module, fs_module) = {
let mut descriptor_set_layouts: ArrayVec<[_; 2]> = ArrayVec::new();
descriptor_set_layouts.push(self.texture_store.descriptor_set_layout.deref());
@@ -326,6 +338,9 @@ impl<'a> RenderingContext<'a> {
self.pipeline_layout = ManuallyDrop::new(pipeline_layout);
self.pipeline = ManuallyDrop::new(pipeline);
+ self.vs_module = ManuallyDrop::new(vs_module);
+ self.fs_module = ManuallyDrop::new(fs_module);
+
let old_swapchain = ManuallyDrop::into_inner(read(&self.target_chain)).deactivate_with_recyling(&mut self.device, &mut self.cmd_pool);
self.target_chain = ManuallyDrop::new(TargetChain::new(&mut self.device, &self.adapter, &mut self.surface, &self.renderpass, &mut self.cmd_pool, properties, Some(old_swapchain))
.map_err(|e| error::CreationError::TargetChainCreationError (e) )?);
@@ -338,6 +353,8 @@ impl<'a> RenderingContext<'a> {
(
PipelineLayout,
GraphicsPipeline,
+ ShaderModule,
+ ShaderModule
), error::CreationError> where T: IntoIterator, T::Item: Borrow<DescriptorSetLayout> {
use hal::pso::*;
use hal::format::Format;
@@ -486,7 +503,7 @@ impl<'a> RenderingContext<'a> {
device.create_graphics_pipeline(&pipeline_desc, None)
}.map_err(|e| error::CreationError::PipelineError (e))?;
- Ok((layout, pipeline))
+ Ok((layout, pipeline, vs_module, fs_module))
}
/// Draw all vertices in the buffer
@@ -618,7 +635,6 @@ impl<'a> RenderingContext<'a> {
impl<'a> core::ops::Drop for RenderingContext<'a> {
fn drop(&mut self) {
- // TODO: Destroy shader modules
self.device.wait_idle().unwrap();
unsafe {
@@ -636,6 +652,9 @@ impl<'a> core::ops::Drop for RenderingContext<'a> {
self.device
.destroy_render_pass(ManuallyDrop::into_inner(read(&self.renderpass)));
+ self.device.destroy_shader_module(ManuallyDrop::into_inner(read(&self.vs_module)));
+ self.device.destroy_shader_module(ManuallyDrop::into_inner(read(&self.fs_module)));
+
self.device.destroy_graphics_pipeline(ManuallyDrop::into_inner(read(&self.pipeline)));
self.device