From 5419e7996af9e8fe1ba1813603c21b275faab845 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Mon, 6 Dec 2021 20:43:53 +0100 Subject: [PATCH] vk.net default_ctor_stype_structs ok, no leak, vk.net commit=db77286 --- samples/ClearScreen/main.cs | 2 +- samples/common/SampleBase.cs | 4 ++-- vke/src/ExtensionMethods.cs | 4 ++-- vke/src/ShaderInfo.cs | 5 +++-- vke/src/base/Device.cs | 21 ++++++++++----------- vke/src/base/Fence.cs | 2 +- vke/src/base/Image.cs | 3 +-- vke/src/base/Instance.cs | 3 +++ vke/src/base/PhysicalDevice.cs | 2 ++ vke/src/base/Queue.cs | 4 +--- vke/src/base/RenderPass.cs | 2 ++ vke/src/base/SubPass.cs | 2 +- vke/src/base/SwapChain.cs | 6 +++--- 13 files changed, 32 insertions(+), 28 deletions(-) diff --git a/samples/ClearScreen/main.cs b/samples/ClearScreen/main.cs index caf5cbc..f5edebd 100644 --- a/samples/ClearScreen/main.cs +++ b/samples/ClearScreen/main.cs @@ -1,6 +1,7 @@ // Copyright (c) 2019 Jean-Philippe Bruyère // // This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) +using System; using vke; using Vulkan; @@ -24,7 +25,6 @@ namespace ClearScreen { //bound to it, and a draw and present semaphore to sync the rendering. protected override void initVulkan () { base.initVulkan (); - //there are several method to clear the screen with vulkan. One is to //use the renderpass CLEAR load operation so that attachment layout transitioning //is handled automatically by the render pass. diff --git a/samples/common/SampleBase.cs b/samples/common/SampleBase.cs index 2104a69..959d821 100644 --- a/samples/common/SampleBase.cs +++ b/samples/common/SampleBase.cs @@ -6,7 +6,7 @@ namespace vke public abstract class SampleBase : VkWindow { public SampleBase (string name = "VkWindow", uint _width = 800, uint _height = 600, bool vSync = false) : base (name, _width, _height, vSync){} - protected override void initVulkan() + /*protected override void initVulkan() { base.initVulkan(); #if DEBUG @@ -16,6 +16,6 @@ namespace vke Console.ResetColor (); } #endif - } + }*/ } } diff --git a/vke/src/ExtensionMethods.cs b/vke/src/ExtensionMethods.cs index 972932f..6c94a66 100644 --- a/vke/src/ExtensionMethods.cs +++ b/vke/src/ExtensionMethods.cs @@ -87,7 +87,7 @@ namespace vke { #region shaderc - public static ShaderInfo CreateShaderInfo (this shaderc.Compiler comp, Device dev, string shaderPath, shaderc.ShaderKind shaderKind, + /*public static ShaderInfo CreateShaderInfo (this shaderc.Compiler comp, Device dev, string shaderPath, shaderc.ShaderKind shaderKind, SpecializationInfo specializationInfo = null, string entryPoint = "main") { using (shaderc.Result res = comp.Compile (shaderPath, shaderKind)) { @@ -96,7 +96,7 @@ namespace vke { VkShaderStageFlags stageFlags = Utils.ShaderKindToStageFlag (shaderKind); return new ShaderInfo (dev, stageFlags, res.CodePointer, (UIntPtr)res.CodeLength, specializationInfo, entryPoint); } - } + }*/ #endregion #region temp diff --git a/vke/src/ShaderInfo.cs b/vke/src/ShaderInfo.cs index 9e12500..c3fcea1 100644 --- a/vke/src/ShaderInfo.cs +++ b/vke/src/ShaderInfo.cs @@ -15,7 +15,7 @@ namespace vke { public VkShaderStageFlags Stage => info.stage; public VkPipelineShaderStageCreateInfo Info => info; - public void RecreateModule(IntPtr code, UIntPtr codeSize) { + public void RecreateModule(uint[] code, UIntPtr codeSize) { if (dev == null) throw new Exception ("[ShaderInfo]Trying to recreate unowned shader module."); dev.DestroyShaderModule (info.module); @@ -32,7 +32,7 @@ namespace vke { /// Code size in byte /// Specialization info. /// shader entry point - public ShaderInfo (Device dev, VkShaderStageFlags stageFlags, IntPtr code, UIntPtr codeSize, SpecializationInfo specializationInfo = null, string entryPoint = "main"): + public ShaderInfo (Device dev, VkShaderStageFlags stageFlags, uint[] code, UIntPtr codeSize, SpecializationInfo specializationInfo = null, string entryPoint = "main"): this(stageFlags, dev.CreateShaderModule (code, codeSize), specializationInfo, entryPoint) { this.dev = dev;//keep dev for destroying module created in this CTOR } @@ -72,6 +72,7 @@ namespace vke { System.Diagnostics.Debug.WriteLine ("VKE ShaderInfo disposed by finalizer"); dev?.DestroyShaderModule (info.module); + info.Dispose(); disposedValue = true; } diff --git a/vke/src/base/Device.cs b/vke/src/base/Device.cs index 4288cc1..cd47146 100644 --- a/vke/src/base/Device.cs +++ b/vke/src/base/Device.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using Vulkan; using static Vulkan.Vk; @@ -38,7 +39,6 @@ namespace vke { public void Activate (VkPhysicalDeviceFeatures enabledFeatures, params string[] extensions) { List qInfos = new List (); - List> prioritiesLists = new List> ();//store pinned lists for later unpin foreach (IGrouping qfams in queues.GroupBy (q => q.qFamIndex)) { int qTot = qfams.Count (); @@ -60,9 +60,8 @@ namespace vke { sType = VkStructureType.DeviceQueueCreateInfo, queueCount = qCountReached ? phy.QueueFamilies[qfams.Key].queueCount : qIndex, queueFamilyIndex = qfams.Key, - pQueuePriorities = priorities.Pin () + pQueuePriorities = priorities }); - prioritiesLists.Add (priorities);//add for unpined } //enable only supported exceptions @@ -86,9 +85,8 @@ namespace vke { Utils.CheckResult (vkCreateDevice (phy.Handle, ref deviceCreateInfo, IntPtr.Zero, out dev)); deviceCreateInfo.Dispose(); - - foreach (List fa in prioritiesLists) - fa.Unpin (); + foreach (VkDeviceQueueCreateInfo qI in qInfos) + qI.Dispose(); if (deviceExtensions.Count > 0) deviceExtensions.Unpin (); @@ -169,7 +167,7 @@ namespace vke { // Iterate over all memory types available for the Device used in this example for (uint i = 0; i < phy.memoryProperties.memoryTypeCount; i++) { if ((typeBits & 1) == 1) { - if ((phy.memoryProperties.memoryTypes[i].propertyFlags & properties) == properties) { + if ((phy.memoryProperties.memoryTypes.AsSpan[(int)i].propertyFlags & properties) == properties) { return i; } } @@ -197,8 +195,8 @@ namespace vke { using (BinaryReader br = new BinaryReader (stream)) { byte[] shaderCode = br.ReadBytes ((int)stream.Length); UIntPtr shaderSize = (UIntPtr)shaderCode.Length; - VkShaderModule shaderModule = CreateShaderModule (shaderCode.Pin (), shaderSize); - shaderCode.Unpin (); + Span tmp = MemoryMarshal.Cast (shaderCode); + VkShaderModule shaderModule = CreateShaderModule (tmp.ToArray(), shaderSize); return shaderModule; } } @@ -209,11 +207,12 @@ namespace vke { /// unmanaged pointer holding the spirv code. Pointer must stay valid only during /// the call to this method. /// spirv code byte size. - public VkShaderModule CreateShaderModule (IntPtr code, UIntPtr codeSize) { + public VkShaderModule CreateShaderModule (uint[] code, UIntPtr codeSize) { VkShaderModuleCreateInfo moduleCreateInfo = VkShaderModuleCreateInfo.New (); moduleCreateInfo.codeSize = codeSize; moduleCreateInfo.pCode = code; - Utils.CheckResult (vkCreateShaderModule (VkDev, ref moduleCreateInfo, IntPtr.Zero, out VkShaderModule shaderModule)); + Utils.CheckResult (vkCreateShaderModule (Handle, ref moduleCreateInfo, IntPtr.Zero, out VkShaderModule shaderModule)); + moduleCreateInfo.Dispose(); return shaderModule; } diff --git a/vke/src/base/Fence.cs b/vke/src/base/Fence.cs index 80c5a9c..ab04404 100644 --- a/vke/src/base/Fence.cs +++ b/vke/src/base/Fence.cs @@ -18,7 +18,7 @@ namespace vke { public Fence (Device dev, bool signaled = false, string name = "fence") : base (dev, name) { info.flags = signaled ? VkFenceCreateFlags.Signaled : 0; Activate (); - } + } protected override VkDebugUtilsObjectNameInfoEXT DebugUtilsInfo => new VkDebugUtilsObjectNameInfoEXT (VkObjectType.Fence, handle.Handle); diff --git a/vke/src/base/Image.cs b/vke/src/base/Image.cs index 7e41054..821053a 100644 --- a/vke/src/base/Image.cs +++ b/vke/src/base/Image.cs @@ -451,9 +451,8 @@ namespace vke { if (info.sharingMode == VkSharingMode.Concurrent && queuesFamillies?.Length > 0) { info.queueFamilyIndexCount = (uint)queuesFamillies.Length; - info.pQueueFamilyIndices = queuesFamillies.Pin (); + info.pQueueFamilyIndices = queuesFamillies; Utils.CheckResult (vkCreateImage (Dev.Handle, ref info, IntPtr.Zero, out handle)); - queuesFamillies.Unpin (); } else Utils.CheckResult (vkCreateImage (Dev.Handle, ref info, IntPtr.Zero, out handle)); diff --git a/vke/src/base/Instance.cs b/vke/src/base/Instance.cs index 57611e5..de1fe5b 100644 --- a/vke/src/base/Instance.cs +++ b/vke/src/base/Instance.cs @@ -101,6 +101,9 @@ namespace vke { if (result != VkResult.Success) throw new InvalidOperationException ("Could not create Vulkan instance. Error: " + result); + instanceCreateInfo.Dispose(); + appInfo.Dispose(); + Vk.LoadInstanceFunctionPointers (inst); } } diff --git a/vke/src/base/PhysicalDevice.cs b/vke/src/base/PhysicalDevice.cs index 57a50b0..1ab1d48 100644 --- a/vke/src/base/PhysicalDevice.cs +++ b/vke/src/base/PhysicalDevice.cs @@ -77,6 +77,7 @@ namespace vke { // Gather physical Device memory properties IntPtr tmp = Marshal.AllocHGlobal (Marshal.SizeOf ()); vkGetPhysicalDeviceMemoryProperties (phy, tmp); + memoryProperties = Marshal.PtrToStructure (tmp); Marshal.FreeHGlobal (tmp); @@ -88,6 +89,7 @@ namespace vke { vkGetPhysicalDeviceQueueFamilyProperties (phy, out queueFamilyCount, QueueFamilies.Pin ()); QueueFamilies.Unpin (); + Console.WriteLine("PhysicalDeviceCollection"); HasSwapChainSupport = GetDeviceExtensionSupported (Ext.D.VK_KHR_swapchain); } diff --git a/vke/src/base/Queue.cs b/vke/src/base/Queue.cs index e1f2562..13fa8c5 100644 --- a/vke/src/base/Queue.cs +++ b/vke/src/base/Queue.cs @@ -44,13 +44,11 @@ namespace vke { uint idx = swapChain.currentImageIndex; VkSwapchainKHR sc = swapChain.Handle; present.pSwapchains = sc; - present.pImageIndices = idx.Pin(); + present.pImageIndices = idx; present.pWaitSemaphores = wait; vkQueuePresentKHR (handle, ref present); - idx.Unpin(); - present.Dispose(); } } diff --git a/vke/src/base/RenderPass.cs b/vke/src/base/RenderPass.cs index cd1c975..ea9cda9 100644 --- a/vke/src/base/RenderPass.cs +++ b/vke/src/base/RenderPass.cs @@ -117,6 +117,8 @@ namespace vke { PNext.ReleasePointer (); renderPassInfo.Dispose (); + foreach (VkSubpassDescription spd in spDescs) + spd.Dispose (); } base.Activate (); } diff --git a/vke/src/base/SubPass.cs b/vke/src/base/SubPass.cs index 828e5a6..93cb275 100644 --- a/vke/src/base/SubPass.cs +++ b/vke/src/base/SubPass.cs @@ -60,7 +60,7 @@ namespace vke { subpassDescription.pInputAttachments = inputRefs; ; } if (preservedRefs.Count > 0) { - subpassDescription.pPreserveAttachments = preservedRefs.Pin (); ; + subpassDescription.pPreserveAttachments = preservedRefs; ; } if (resolveRefs.Count > 0) subpassDescription.pResolveAttachments = resolveRefs; diff --git a/vke/src/base/SwapChain.cs b/vke/src/base/SwapChain.cs index c07813d..d87e461 100644 --- a/vke/src/base/SwapChain.cs +++ b/vke/src/base/SwapChain.cs @@ -99,7 +99,7 @@ namespace vke { /// public void Create () { - Dev.WaitIdle (); + Dev.WaitIdle (); VkSurfaceCapabilitiesKHR capabilities = Dev.phy.GetSurfaceCapabilities (presentQueue.Surface); @@ -128,7 +128,7 @@ namespace vke { presentComplete = Dev.CreateSemaphore (); presentComplete.SetDebugMarkerName (Dev, "Semaphore PresentComplete"); Handle = newSwapChain; - + Utils.CheckResult (vkGetSwapchainImagesKHR (Dev.Handle, Handle, out uint imageCount, IntPtr.Zero)); if (imageCount == 0) throw new Exception ("Swapchain image count is 0."); @@ -175,7 +175,7 @@ namespace vke { if (state == ActivableState.Activated) { if (!disposing) System.Diagnostics.Debug.WriteLine ("VKE Swapchain disposed by finalizer"); - + _destroy (); } else if (disposing) -- 2.47.3