aboutsummaryrefslogtreecommitdiffstatsci
path: root/vke/src/FrameBuffer.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/FrameBuffer.cs
parent7d305b07ccaeb2a8cd342e3395db46f2f8fffade (diff)
Activable pattern wip
Diffstat (limited to 'vke/src/FrameBuffer.cs')
-rw-r--r--vke/src/FrameBuffer.cs122
1 files changed, 55 insertions, 67 deletions
diff --git a/vke/src/FrameBuffer.cs b/vke/src/FrameBuffer.cs
index 431c21e..e0b81a7 100644
--- a/vke/src/FrameBuffer.cs
+++ b/vke/src/FrameBuffer.cs
@@ -32,17 +32,19 @@ using static Vulkan.VulkanNative;
namespace VKE {
- public class Framebuffer : IDisposable {
+ public class Framebuffer : Activable {
internal VkFramebuffer handle;
RenderPass renderPass;
- public List<Image> attachments = new List<Image> ();
+
+ public List<Image> attachments = new List<Image> ();
VkFramebufferCreateInfo createInfo = VkFramebufferCreateInfo.New ();
+
public uint Width => createInfo.width;
public uint Height => createInfo.height;
public uint Layers => createInfo.layers;
- public Framebuffer (RenderPass _renderPass, uint _width, uint _height, uint _layers = 1) {
+ public Framebuffer (RenderPass _renderPass, uint _width, uint _height, uint _layers = 1) : base(_renderPass.dev) {
renderPass = _renderPass;
createInfo.width = _width;
createInfo.height = _height;
@@ -50,6 +52,46 @@ namespace VKE {
createInfo.renderPass = renderPass.handle;
}
+ public Framebuffer (RenderPass _renderPass, uint _width, uint _height, params Image[] views)
+ : this (_renderPass, _width, _height) {
+ for (int i = 0; i < views.Length; i++) {
+ Image v = views[i];
+ if (v == null) {
+ //automatically create attachment if not in unused state in the renderpass
+ VkAttachmentDescription ad = renderPass.attachments[i];
+ VkImageUsageFlags usage = VkImageUsageFlags.None;
+ VkImageAspectFlags aspectFlags = VkImageAspectFlags.None;
+
+ checkLayoutRequirements (ad.initialLayout, ref usage, ref aspectFlags);
+ checkLayoutRequirements (ad.finalLayout, ref usage, ref aspectFlags);
+ foreach (SubPass sp in renderPass.subpasses) {
+ //TODO:check subpass usage
+ }
+
+ v = new Image (renderPass.dev, ad.format, usage, VkMemoryPropertyFlags.DeviceLocal,
+ _width, _height, VkImageType.Image2D, ad.samples, VkImageTiling.Optimal, 1, createInfo.layers);
+ v.CreateView (VkImageViewType.Image2D, aspectFlags);
+ } else
+ v.Activate ();//increase ref and create handle if not already activated
+
+ attachments.Add (v);
+ }
+ Activate ();
+ }
+
+ public override void Activate () {
+ if (state != ActivableState.Activated) {
+ VkImageView[] views = attachments.Select (a => a.Descriptor.imageView).ToArray ();
+ createInfo.attachmentCount = (uint)views.Length;
+ createInfo.pAttachments = views.Pin ();
+
+ Utils.CheckResult (vkCreateFramebuffer (renderPass.dev.VkDev, ref createInfo, IntPtr.Zero, out handle));
+
+ views.Unpin ();
+ }
+ base.Activate ();
+ }
+
void checkLayoutRequirements (VkImageLayout layout, ref VkImageUsageFlags usage, ref VkImageAspectFlags aspectFlags) {
switch (layout) {
case VkImageLayout.ColorAttachmentOptimal:
@@ -84,71 +126,17 @@ namespace VKE {
}
}
-
- public Framebuffer (RenderPass _renderPass, uint _width, uint _height, params Image[] views)
- : this (_renderPass, _width, _height) {
- for (int i = 0; i < views.Length; i++) {
- Image v = views[i];
- if (v == null){
- //automatically create attachment if not in unused state in the renderpass
- VkAttachmentDescription ad = renderPass.attachments[i];
- VkImageUsageFlags usage = VkImageUsageFlags.None;
- VkImageAspectFlags aspectFlags = VkImageAspectFlags.None;
-
- checkLayoutRequirements (ad.initialLayout, ref usage, ref aspectFlags);
- checkLayoutRequirements (ad.finalLayout, ref usage, ref aspectFlags);
- foreach (SubPass sp in renderPass.subpasses) {
- //TODO:check subpass usage
- }
-
- v = new Image (renderPass.dev, ad.format, usage, VkMemoryPropertyFlags.DeviceLocal,
- _width, _height, VkImageType.Image2D, ad.samples, VkImageTiling.Optimal, 1, createInfo.layers);
- v.CreateView (VkImageViewType.Image2D, aspectFlags);
- }
- v.references++;
- attachments.Add (v);
- }
- Activate ();
- }
-
- public void Activate () {
- if (isDisposed) {
- GC.ReRegisterForFinalize (this);
- isDisposed = false;
- }
- VkImageView[] views;
- views = attachments.Select(a=>a.Descriptor.imageView).ToArray();
-
- createInfo.attachmentCount = (uint)views.Length;
- createInfo.pAttachments = views.Pin();
-
- Utils.CheckResult (vkCreateFramebuffer (renderPass.dev.VkDev, ref createInfo, IntPtr.Zero, out handle));
-
- views.Unpin();
- }
-
#region IDisposable Support
- private bool isDisposed = false; // Pour détecter les appels redondants
-
- protected virtual void Dispose (bool disposing) {
- if (!isDisposed) {
- renderPass.dev.DestroyFramebuffer (handle);
- if (disposing) {
- foreach (Image img in attachments)
- img.Dispose();
- } else
- System.Diagnostics.Debug.WriteLine ("A FrameBuffer has not been disposed.");
-
- isDisposed = true;
- }
- }
-
- ~Framebuffer () {
- Dispose (false);
- }
- public void Dispose () {
- Dispose (true);
- GC.SuppressFinalize (this);
+ protected override void Dispose (bool disposing) {
+ if (state == ActivableState.Activated)
+ dev.DestroyFramebuffer (handle);
+ if (disposing) {
+ foreach (Image img in attachments)
+ img.Dispose();
+ }else
+ System.Diagnostics.Debug.WriteLine ("VKE Activable object disposed by finalizer");
+
+ base.Dispose (disposing);
}
#endregion