Sfoglia il codice sorgente

app/gfx: bugfix always epoch for delete of buffer must match creation epoch

darkfi 1 anno fa
parent
commit
b1d36ebccf
1 ha cambiato i file con 31 aggiunte e 19 eliminazioni
  1. 31 19
      bin/app/src/gfx/mod.rs

+ 31 - 19
bin/app/src/gfx/mod.rs

@@ -108,13 +108,14 @@ pub type ManagedTexturePtr = Arc<ManagedTexture>;
 #[derive(Clone)]
 pub struct ManagedTexture {
     id: GfxTextureId,
+    epoch: u32,
     render_api: RenderApi,
     tag: DebugTag,
 }
 
 impl Drop for ManagedTexture {
     fn drop(&mut self) {
-        self.render_api.delete_unmanaged_texture(self.id, self.tag);
+        self.render_api.delete_unmanaged_texture(self.id, self.epoch, self.tag);
     }
 }
 
@@ -130,6 +131,7 @@ pub type ManagedBufferPtr = Arc<ManagedBuffer>;
 #[derive(Clone)]
 pub struct ManagedBuffer {
     id: GfxBufferId,
+    epoch: u32,
     render_api: RenderApi,
     tag: DebugTag,
     buftype: u8,
@@ -137,7 +139,7 @@ pub struct ManagedBuffer {
 
 impl Drop for ManagedBuffer {
     fn drop(&mut self) {
-        self.render_api.delete_unmanaged_buffer(self.id, self.tag, self.buftype);
+        self.render_api.delete_unmanaged_buffer(self.id, self.epoch, self.tag, self.buftype);
     }
 }
 
@@ -166,18 +168,22 @@ impl RenderApi {
         self.epoch.fetch_add(1, Ordering::SeqCst) + 1
     }
 
-    fn send(&self, method: GraphicsMethod) {
+    fn send(&self, method: GraphicsMethod) -> EpochIndex {
         let epoch = self.epoch.load(Ordering::Relaxed);
+        self.send_with_epoch(method, epoch);
+        epoch
+    }
+    fn send_with_epoch(&self, method: GraphicsMethod, epoch: EpochIndex) {
         let _ = self.method_req.try_send((epoch, method)).unwrap();
     }
 
-    fn new_unmanaged_texture(&self, width: u16, height: u16, data: Vec<u8>) -> GfxTextureId {
+    fn new_unmanaged_texture(&self, width: u16, height: u16, data: Vec<u8>) -> (GfxTextureId, EpochIndex) {
         let gfx_texture_id = NEXT_TEXTURE_ID.fetch_add(1, Ordering::SeqCst);
 
         let method = GraphicsMethod::NewTexture((width, height, data, gfx_texture_id));
-        self.send(method);
+        let epoch = self.send(method);
 
-        gfx_texture_id
+        (gfx_texture_id, epoch)
     }
 
     pub fn new_texture(
@@ -187,56 +193,62 @@ impl RenderApi {
         data: Vec<u8>,
         tag: DebugTag,
     ) -> ManagedTexturePtr {
+        let (id, epoch) = self.new_unmanaged_texture(width, height, data);
         Arc::new(ManagedTexture {
-            id: self.new_unmanaged_texture(width, height, data),
+            id,
+            epoch,
             render_api: self.clone(),
             tag,
         })
     }
 
-    fn delete_unmanaged_texture(&self, texture: GfxTextureId, tag: DebugTag) {
+    fn delete_unmanaged_texture(&self, texture: GfxTextureId, epoch: EpochIndex, tag: DebugTag) {
         let method = GraphicsMethod::DeleteTexture((texture, tag));
-        self.send(method);
+        self.send_with_epoch(method, epoch);
     }
 
-    fn new_unmanaged_vertex_buffer(&self, verts: Vec<Vertex>) -> GfxBufferId {
+    fn new_unmanaged_vertex_buffer(&self, verts: Vec<Vertex>) -> (GfxBufferId, EpochIndex) {
         let gfx_buffer_id = NEXT_BUFFER_ID.fetch_add(1, Ordering::SeqCst);
 
         let method = GraphicsMethod::NewVertexBuffer((verts, gfx_buffer_id));
-        self.send(method);
+        let epoch = self.send(method);
 
-        gfx_buffer_id
+        (gfx_buffer_id, epoch)
     }
 
-    fn new_unmanaged_index_buffer(&self, indices: Vec<u16>) -> GfxBufferId {
+    fn new_unmanaged_index_buffer(&self, indices: Vec<u16>) -> (GfxBufferId, EpochIndex) {
         let gfx_buffer_id = NEXT_BUFFER_ID.fetch_add(1, Ordering::SeqCst);
 
         let method = GraphicsMethod::NewIndexBuffer((indices, gfx_buffer_id));
-        self.send(method);
+        let epoch = self.send(method);
 
-        gfx_buffer_id
+        (gfx_buffer_id, epoch)
     }
 
     pub fn new_vertex_buffer(&self, verts: Vec<Vertex>, tag: DebugTag) -> ManagedBufferPtr {
+        let (id, epoch) = self.new_unmanaged_vertex_buffer(verts);
         Arc::new(ManagedBuffer {
-            id: self.new_unmanaged_vertex_buffer(verts),
+            id,
+            epoch,
             render_api: self.clone(),
             tag,
             buftype: 0,
         })
     }
     pub fn new_index_buffer(&self, indices: Vec<u16>, tag: DebugTag) -> ManagedBufferPtr {
+        let (id, epoch) = self.new_unmanaged_index_buffer(indices);
         Arc::new(ManagedBuffer {
-            id: self.new_unmanaged_index_buffer(indices),
+            id,
+            epoch,
             render_api: self.clone(),
             tag,
             buftype: 1,
         })
     }
 
-    fn delete_unmanaged_buffer(&self, buffer: GfxBufferId, tag: DebugTag, buftype: u8) {
+    fn delete_unmanaged_buffer(&self, buffer: GfxBufferId, epoch: EpochIndex, tag: DebugTag, buftype: u8) {
         let method = GraphicsMethod::DeleteBuffer((buffer, tag, buftype));
-        self.send(method);
+        self.send_with_epoch(method, epoch);
     }
 
     pub fn replace_draw_calls(&self, timest: u64, dcs: Vec<(u64, GfxDrawCall)>) {