From da6748c4bab5eba201c424c15bd2bd2d40244b65 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 2 Feb 2024 00:32:15 +0900 Subject: [PATCH 1/5] Fix marshalling of MTLResourceOptions on .NET 8 --- src/Veldrid.MetalBindings/MTLResourceOptions.cs | 4 ++-- src/Veldrid.MetalBindings/MTLStorageMode.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Veldrid.MetalBindings/MTLResourceOptions.cs b/src/Veldrid.MetalBindings/MTLResourceOptions.cs index 1d089f4a..7a6104ba 100644 --- a/src/Veldrid.MetalBindings/MTLResourceOptions.cs +++ b/src/Veldrid.MetalBindings/MTLResourceOptions.cs @@ -1,6 +1,6 @@ namespace Veldrid.MetalBindings { - public enum MTLResourceOptions : uint + public enum MTLResourceOptions : ulong { CPUCacheModeDefaultCache = MTLCPUCacheMode.DefaultCache, CPUCacheModeWriteCombined = MTLCPUCacheMode.WriteCombined, @@ -12,4 +12,4 @@ public enum MTLResourceOptions : uint HazardTrackingModeUntracked = (uint)(0x1UL << 8), } -} \ No newline at end of file +} diff --git a/src/Veldrid.MetalBindings/MTLStorageMode.cs b/src/Veldrid.MetalBindings/MTLStorageMode.cs index 23ba7809..3f244206 100644 --- a/src/Veldrid.MetalBindings/MTLStorageMode.cs +++ b/src/Veldrid.MetalBindings/MTLStorageMode.cs @@ -1,10 +1,10 @@ namespace Veldrid.MetalBindings { - public enum MTLStorageMode : uint + public enum MTLStorageMode : ulong { Shared = 0, Managed = 1, Private = 2, Memoryless = 3, } -} \ No newline at end of file +} From 1f8ab3b3f5b503bbadb1f00d8d8fb39c5a1a09d9 Mon Sep 17 00:00:00 2001 From: Helco Date: Wed, 21 Feb 2024 19:23:42 +0100 Subject: [PATCH 2/5] Fix UpdateBuffer not checking zero size --- src/Veldrid/GraphicsDevice.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Veldrid/GraphicsDevice.cs b/src/Veldrid/GraphicsDevice.cs index 9cebc499..3ad66093 100644 --- a/src/Veldrid/GraphicsDevice.cs +++ b/src/Veldrid/GraphicsDevice.cs @@ -718,6 +718,10 @@ public void UpdateBuffer( throw new VeldridException( $"The data size given to UpdateBuffer is too large. The given buffer can only hold {buffer.SizeInBytes} total bytes. The requested update would require {bufferOffsetInBytes + sizeInBytes} bytes."); } + if (sizeInBytes == 0) + { + return; + } UpdateBufferCore(buffer, bufferOffsetInBytes, source, sizeInBytes); } From cd9728615f946b081009f8a750c3f292510f28dd Mon Sep 17 00:00:00 2001 From: Helco Date: Thu, 22 Feb 2024 10:07:58 +0100 Subject: [PATCH 3/5] Add VK_KHR_portability_enumeration extension and flag --- src/Veldrid/Vk/CommonStrings.cs | 1 + src/Veldrid/Vk/VkGraphicsDevice.cs | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/Veldrid/Vk/CommonStrings.cs b/src/Veldrid/Vk/CommonStrings.cs index ba4300d8..7ab7498d 100644 --- a/src/Veldrid/Vk/CommonStrings.cs +++ b/src/Veldrid/Vk/CommonStrings.cs @@ -19,5 +19,6 @@ internal static class CommonStrings public static FixedUtf8String main { get; } = "main"; public static FixedUtf8String VK_KHR_get_physical_device_properties2 { get; } = "VK_KHR_get_physical_device_properties2"; public static FixedUtf8String VK_KHR_portability_subset { get; } = "VK_KHR_portability_subset"; + public static FixedUtf8String VK_KHR_portability_enumeration { get; } = "VK_KHR_portability_enumeration"; } } diff --git a/src/Veldrid/Vk/VkGraphicsDevice.cs b/src/Veldrid/Vk/VkGraphicsDevice.cs index 98844e92..3ab2b23b 100644 --- a/src/Veldrid/Vk/VkGraphicsDevice.cs +++ b/src/Veldrid/Vk/VkGraphicsDevice.cs @@ -13,6 +13,7 @@ namespace Veldrid.Vk { internal unsafe class VkGraphicsDevice : GraphicsDevice { + private const uint VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR = 0x00000001; private static readonly FixedUtf8String s_name = "Veldrid-VkGraphicsDevice"; private static readonly Lazy s_isSupported = new Lazy(CheckIsSupported, isThreadSafe: true); @@ -473,6 +474,12 @@ private void CreateInstance(bool debug, VulkanDeviceOptions options) _surfaceExtensions.Add(CommonStrings.VK_KHR_portability_subset); } + if (availableInstanceExtensions.Contains(CommonStrings.VK_KHR_portability_enumeration)) + { + instanceExtensions.Add(CommonStrings.VK_KHR_portability_enumeration); + instanceCI.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + } + if (availableInstanceExtensions.Contains(CommonStrings.VK_KHR_SURFACE_EXTENSION_NAME)) { _surfaceExtensions.Add(CommonStrings.VK_KHR_SURFACE_EXTENSION_NAME); From c0135afa3df5ec5aeb487fdc9edb638aadddf543 Mon Sep 17 00:00:00 2001 From: opticfluorine Date: Fri, 29 Mar 2024 14:28:09 -0400 Subject: [PATCH 4/5] Add UniformRead to Vulkan memory barriers for uniform buffers --- src/Veldrid/Vk/VkCommandList.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Veldrid/Vk/VkCommandList.cs b/src/Veldrid/Vk/VkCommandList.cs index b286c651..5b049f72 100644 --- a/src/Veldrid/Vk/VkCommandList.cs +++ b/src/Veldrid/Vk/VkCommandList.cs @@ -755,10 +755,14 @@ protected override void CopyBufferCore( vkCmdCopyBuffer(_cb, srcVkBuffer.DeviceBuffer, dstVkBuffer.DeviceBuffer, 1, ref region); + bool needToProtectUniform = destination.Usage.HasFlag(BufferUsage.UniformBuffer); + VkMemoryBarrier barrier; barrier.sType = VkStructureType.MemoryBarrier; barrier.srcAccessMask = VkAccessFlags.TransferWrite; - barrier.dstAccessMask = VkAccessFlags.VertexAttributeRead; + barrier.dstAccessMask = needToProtectUniform + ? VkAccessFlags.VertexAttributeRead | VkAccessFlags.UniformRead + : VkAccessFlags.VertexAttributeRead; barrier.pNext = null; vkCmdPipelineBarrier( _cb, @@ -966,7 +970,7 @@ internal static void CopyTextureCore_VkCommandBuffer( VkImageAspectFlags aspect = (srcVkTexture.Usage & TextureUsage.DepthStencil) != 0 ? VkImageAspectFlags.Depth : VkImageAspectFlags.Color; - + Util.GetMipDimensions(dstVkTexture, dstMipLevel, out uint mipWidth, out uint mipHeight, out uint mipDepth); uint blockSize = FormatHelpers.IsCompressedFormat(srcVkTexture.Format) ? 4u : 1u; uint bufferRowLength = Math.Max(mipWidth, blockSize); From afcd18eb0710cb4dd7b42bbf2e98b0827ada2bcd Mon Sep 17 00:00:00 2001 From: opticfluorine Date: Sat, 30 Mar 2024 00:11:00 -0400 Subject: [PATCH 5/5] Fix Vulkan validation issue with uniform shader memory barriers --- src/Veldrid/Vk/VkCommandList.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Veldrid/Vk/VkCommandList.cs b/src/Veldrid/Vk/VkCommandList.cs index 5b049f72..6234494b 100644 --- a/src/Veldrid/Vk/VkCommandList.cs +++ b/src/Veldrid/Vk/VkCommandList.cs @@ -760,13 +760,15 @@ protected override void CopyBufferCore( VkMemoryBarrier barrier; barrier.sType = VkStructureType.MemoryBarrier; barrier.srcAccessMask = VkAccessFlags.TransferWrite; - barrier.dstAccessMask = needToProtectUniform - ? VkAccessFlags.VertexAttributeRead | VkAccessFlags.UniformRead - : VkAccessFlags.VertexAttributeRead; + barrier.dstAccessMask = needToProtectUniform ? VkAccessFlags.UniformRead : VkAccessFlags.VertexAttributeRead; barrier.pNext = null; vkCmdPipelineBarrier( _cb, - VkPipelineStageFlags.Transfer, VkPipelineStageFlags.VertexInput, + VkPipelineStageFlags.Transfer, needToProtectUniform ? + VkPipelineStageFlags.VertexShader | VkPipelineStageFlags.ComputeShader | + VkPipelineStageFlags.FragmentShader | VkPipelineStageFlags.GeometryShader | + VkPipelineStageFlags.TessellationControlShader | VkPipelineStageFlags.TessellationEvaluationShader + : VkPipelineStageFlags.VertexInput, VkDependencyFlags.None, 1, ref barrier, 0, null,