aboutsummaryrefslogtreecommitdiffstatsci
path: root/vke/src/Resource.cs
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2019-04-05 14:13:20 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2019-04-05 14:13:20 +0200
commit04d94de392b6e5ca4f82acc233df7b3f97abca36 (patch)
tree27df9645ea97cf36c99cb4f8ed5f347cc00cb458 /vke/src/Resource.cs
parent7d305b07ccaeb2a8cd342e3395db46f2f8fffade (diff)
Activable pattern wip
Diffstat (limited to 'vke/src/Resource.cs')
-rw-r--r--vke/src/Resource.cs52
1 files changed, 12 insertions, 40 deletions
diff --git a/vke/src/Resource.cs b/vke/src/Resource.cs
index 2c87e50..22b7375 100644
--- a/vke/src/Resource.cs
+++ b/vke/src/Resource.cs
@@ -6,9 +6,7 @@ using Vulkan;
using static Vulkan.VulkanNative;
namespace VKE {
- public abstract class Resource : IDisposable {
- internal uint references;
- protected Device dev;
+ public abstract class Resource : Activable {
protected VkDeviceMemory vkMemory;
protected UInt64 deviceMemSize;
protected IntPtr mappedData;
@@ -17,21 +15,13 @@ namespace VKE {
public IntPtr MappedData => mappedData;
public UInt64 AllocatedDeviceMemorySize => deviceMemSize;
- protected Resource (Device device, VkMemoryPropertyFlags memoryFlags) {
- dev = device;
+ protected Resource (Device device, VkMemoryPropertyFlags memoryFlags) : base (device) {
MemoryFlags = memoryFlags;
}
protected abstract VkMemoryRequirements getMemoryRequirements ();
protected abstract void bindMemory (ulong offset);
- //memory is not allocated and bindind in here because Activate may be called in ctor of
- //derrived classes, and appropriate virtual allocateMemory and bindMemory must be called
- public virtual void Activate () {
- if (isDisposed)
- GC.ReRegisterForFinalize (this);
- }
-
protected void allocateMemory () {
VkMemoryRequirements memReqs = getMemoryRequirements ();
VkMemoryAllocateInfo memInfo = VkMemoryAllocateInfo.New ();
@@ -68,34 +58,16 @@ namespace VKE {
vkFlushMappedMemoryRanges (dev.VkDev, 1, ref range);
}
- #region IDisposable Support
- protected bool isDisposed;
-
- protected virtual void Dispose (bool disposing) {
- if (!isDisposed) {
- if (disposing) {
- // TODO: supprimer l'état managé (objets managés).
- }
-
- if (mappedData != IntPtr.Zero)
- Unmap ();
- vkFreeMemory (dev.VkDev, vkMemory, IntPtr.Zero);
-
- isDisposed = true;
- }
- }
-
- ~Resource () {
- Dispose (false);
- }
-
- public void Dispose () {
- if (references>0)
- references--;
- if (references>0)
- return;
- Dispose (true);
- GC.SuppressFinalize (this);
+ #region IDisposable Support
+ protected override void Dispose (bool disposing) {
+ if (!disposing)
+ System.Diagnostics.Debug.WriteLine ("VKE Activable object disposed by finalizer");
+ if (state == ActivableState.Activated) {
+ if (mappedData != IntPtr.Zero)
+ Unmap ();
+ vkFreeMemory (dev.VkDev, vkMemory, IntPtr.Zero);
+ }
+ base.Dispose (disposing);
}
#endregion
}