fix: GSS2.Test Vulakn render image buffer rotation

This commit is contained in:
2026-01-23 07:52:05 +03:00
parent 20d3807b8e
commit 8896629ce2
6 changed files with 40 additions and 15 deletions
+16 -5
View File
@@ -1,3 +1,4 @@
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using Avalonia;
@@ -52,6 +53,7 @@ class VkImage
}
class VkRenderer
{
[DllImport("libc")] private static extern int dup(int fd);
readonly VulkanContext context = new VulkanContext("GSS2.Test", "CameraView");
public IPlatformHandle ExportSemaphore(bool renderFinished)
@@ -62,9 +64,16 @@ class VkRenderer
unsafe public VkImage ImportOrUpdate(int fd, int width, int height, int stride)
{
var fdDup = dup(fd);
try
{
var (importImage, importMemoryReqirements, importMemory) = ImportImage(fd, width, height, stride);
FenceCreateInfo fenceInfo = new FenceCreateInfo
{
SType = StructureType.FenceCreateInfo
};
context.Api.CreateFence(context.Device, &fenceInfo, null, out var fence).ThrowOnError();
var (importImage, importMemoryReqirements, importMemory) = ImportImage(fdDup, width, height, stride);
var (exportImage, exportMemoryReqirements, exportMemory) = CreateExportImage(width, height);
var commandPoolCreateInfo = new CommandPoolCreateInfo
@@ -125,13 +134,13 @@ class VkRenderer
Console.WriteLine("KhrExternalMemoryFd import success");
else
throw new Exception("KhrExternalMemoryFd import error");
var MemoryGetFdInfoKHR = new MemoryGetFdInfoKHR
var memoryGetFdInfoKHR = new MemoryGetFdInfoKHR
{
SType = StructureType.MemoryGetFDInfoKhr,
Memory = exportMemory,
HandleType = ExternalMemoryHandleTypeFlags.OpaqueFDBit
};
khrExternalMemoryFd.GetMemoryF(context.Device, &MemoryGetFdInfoKHR, out var vulkanFd).ThrowOnError();
khrExternalMemoryFd.GetMemoryF(context.Device, &memoryGetFdInfoKHR, out var vulkanFd).ThrowOnError();
Console.WriteLine($"Image export success {vulkanFd}");
var renderFinished = context.RenderFinishedSemaphore;
@@ -144,7 +153,9 @@ class VkRenderer
SignalSemaphoreCount = 1
};
context.Api.QueueSubmit(context.Queue, 1, &submitInfo, default).ThrowOnError();
context.Api.QueueSubmit(context.Queue, 1, &submitInfo, fence).ThrowOnError();
context.Api.WaitForFences(context.Device, 1, &fence, true, ulong.MaxValue).ThrowOnError();
context.Api.ResetFences(context.Device, 1, &fence).ThrowOnError();
return new VkImage()
{
@@ -194,7 +205,7 @@ class VkRenderer
Tiling = ImageTiling.DrmFormatModifierExt,
Usage = ImageUsageFlags.TransferSrcBit | ImageUsageFlags.SampledBit,
SharingMode = SharingMode.Exclusive,
InitialLayout = ImageLayout.Undefined,
InitialLayout = ImageLayout.Undefined
};
context.Api.CreateImage(context.Device, &imageCreateInfo, null, out var image).ThrowOnError();
context.Api.GetImageMemoryRequirements(context.Device, image, out var memoryReqirements);