Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,828 changes: 1,306 additions & 522 deletions VulkanGen/Evergine.Bindings.Vulkan/Generated/Commands.cs

Large diffs are not rendered by default.

160 changes: 159 additions & 1 deletion VulkanGen/Evergine.Bindings.Vulkan/Generated/Enums.cs

Large diffs are not rendered by default.

20 changes: 19 additions & 1 deletion VulkanGen/Evergine.Bindings.Vulkan/NativeLibrary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public class NativeLibrary : IDisposable
private readonly string libraryName;
private readonly IntPtr libraryHandle;
internal VkInstance instance;
internal VkDevice device;

public IntPtr NativeHandle => libraryHandle;

Expand Down Expand Up @@ -50,7 +51,6 @@ public unsafe void LoadFunction<T>(string name, out T field)
{
funcPtr = VulkanNative.vkGetInstanceProcAddr(instance, (byte*)Marshal.StringToHGlobalAnsi(name));
}

if (funcPtr != IntPtr.Zero)
{
field = Marshal.GetDelegateForFunctionPointer<T>(funcPtr);
Expand All @@ -62,6 +62,24 @@ public unsafe void LoadFunction<T>(string name, out T field)
}
}

public unsafe void LoadDeviceFunction<T>(string name, out T field)
{
SysNativeLibrary.TryGetExport(libraryHandle, name, out IntPtr funcPtr);
if (funcPtr == IntPtr.Zero)
{
funcPtr = VulkanNative.vkGetDeviceProcAddr(device, (byte*)Marshal.StringToHGlobalAnsi(name));
}
if (funcPtr != IntPtr.Zero)
{
field = Marshal.GetDelegateForFunctionPointer<T>(funcPtr);
}
else
{
field = default(T);
Debug.WriteLine($" ===> Error loading device function {name}");
}
}

public void Dispose()
{
FreeLibrary(libraryHandle);
Expand Down
34 changes: 29 additions & 5 deletions VulkanGen/VulkanGen/CommandDefinition.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace VulkanGen
Expand Down Expand Up @@ -76,6 +72,34 @@ public string GetParametersSignature(VulkanSpecification spec, bool useTypes = t

return signature.ToString();
}

public bool IsDeviceLevel()
{
/*
* A command’s dispatchability — and how it should be loaded — is determined by its first dispatchable parameter, such as VkInstance, VkDevice, or VkCommandBuffer.
*
* | First parameter | Load with | Example function |
* | ------------------ | ----------------------- | ------------------------------------- |
* | `VkInstance` | `vkGetInstanceProcAddr` | `vkCreateDevice`, `vkDestroyInstance` |
* | `VkPhysicalDevice` | `vkGetInstanceProcAddr` | `vkGetPhysicalDeviceProperties` |
* | `VkDevice` | `vkGetDeviceProcAddr` | `vkCreateBuffer`, `vkQueueSubmit` |
* | `VkCommandBuffer` | `vkGetDeviceProcAddr` | `vkCmdDraw`, `vkCmdBindPipeline` |
* | `VkQueue` | `vkGetDeviceProcAddr` | `vkQueuePresentKHR` |
*/
if (Parameters.Count == 0)
return false;

var firstParameter = Parameters[0];
switch (firstParameter.Type)
{
case "VkDevice":
case "VkCommandBuffer":
case "VkQueue":
return true;
default:
return false;
}
}
}

public class Proto
Expand Down
2 changes: 1 addition & 1 deletion VulkanGen/VulkanGen/ExtensionDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public static ExtensionDefinition FromXML(XElement elem)
extension.SortOrder = int.Parse(sortString);
}

var requires = elem.Element("require");
var requires = elem.Elements("require");
if (requires != null)
{
var enums = requires.Elements("enum");
Expand Down
32 changes: 27 additions & 5 deletions VulkanGen/VulkanGen/Program.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Collections.Immutable;
using System.Collections.Immutable;
using System.IO;
using System.Linq;

Expand Down Expand Up @@ -176,7 +175,7 @@ static void Main(string[] args)
{
// Avoid duplicate members from Vulkan Safety Critical
if (Helpers.IsVKSC(member.Api))
{
{
continue;
}

Expand Down Expand Up @@ -304,7 +303,30 @@ static void Main(string[] args)

foreach (var command in vulkanVersion.Commands)
{
file.WriteLine($"\t\t\tNativeLib.LoadFunction(\"{command.Prototype.Name}\", out {command.Prototype.Name}_ptr);");
if (command.IsDeviceLevel())
{
file.WriteLine($"\t\t\tNativeLib.LoadDeviceFunction(\"{command.Prototype.Name}\", out {command.Prototype.Name}_ptr);");
}
else
{
file.WriteLine($"\t\t\tNativeLib.LoadFunction(\"{command.Prototype.Name}\", out {command.Prototype.Name}_ptr);");
}
}

file.WriteLine("\t\t}");

file.WriteLine();
file.WriteLine($"\t\tpublic static void LoadDeviceFunctionPointers(VkDevice device = default)");
file.WriteLine("\t\t{");
file.WriteLine("\t\t\tif (device != default)");
file.WriteLine("\t\t\t{");
file.WriteLine("\t\t\t\tNativeLib.device = device;");
file.WriteLine("\t\t\t}");
file.WriteLine();

foreach (var command in vulkanVersion.Commands.Where(x => x.IsDeviceLevel()))
{
file.WriteLine($"\t\t\tNativeLib.LoadDeviceFunction(\"{command.Prototype.Name}\", out {command.Prototype.Name}_ptr);");
}

file.WriteLine("\t\t}");
Expand All @@ -313,4 +335,4 @@ static void Main(string[] args)
}
}
}
}
}
2 changes: 1 addition & 1 deletion VulkanGen/VulkanGen/VulkanVersion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public static VulkanVersion FromSpec(VulkanSpecification spec, string versionNam

var commandDefinition = spec.Commands.Find(c => c.Prototype.Name == name);

if(!version.Commands.Exists(c => c?.Prototype.Name == name))
if (!version.Commands.Exists(c => c?.Prototype.Name == name))
version.Commands.Add(commandDefinition);
}
}
Expand Down