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);
+9
View File
@@ -11,6 +11,8 @@ public sealed class LibCameraLogSink : IDisposable
private readonly ILogger _loggerRPI;
private readonly ILogger _loggerDeviceEnumerator;
private readonly ILogger _loggerIPAProxy;
private readonly ILogger _loggerV4L2;
private readonly ILogger _loggerRPISTREAM;
private readonly ILogger _loggerWRAPPER;
private bool _disposedValue;
@@ -21,12 +23,17 @@ public sealed class LibCameraLogSink : IDisposable
_loggerRPI = loggerFactory.CreateLogger("LibCamera-RPI");
_loggerDeviceEnumerator = loggerFactory.CreateLogger("LibCamera-DeviceEnumerator");
_loggerIPAProxy = loggerFactory.CreateLogger("LibCamera-IPAProxy");
_loggerV4L2 = loggerFactory.CreateLogger("LibCamera-V4L2");
_loggerRPISTREAM = loggerFactory.CreateLogger("LibCamera-RPISTREAM");
_loggerWRAPPER = loggerFactory.CreateLogger("LibCamera-WRAPPER");
Log.Initialize();
Log.SetLevel("Camera", Log.LogLevelEnum.DEBUG);
Log.SetLevel("RPI", Log.LogLevelEnum.DEBUG);
Log.SetLevel("DeviceEnumerator", Log.LogLevelEnum.DEBUG);
Log.SetLevel("IPAProxy", Log.LogLevelEnum.DEBUG);
Log.SetLevel("V4L2", Log.LogLevelEnum.DEBUG);
Log.SetLevel("RPISTREAM", Log.LogLevelEnum.DEBUG);
Log.SetLevel("WRAPPER", Log.LogLevelEnum.DEBUG);
Log.LogReceived += OnLogReceived;
}
@@ -46,6 +53,8 @@ public sealed class LibCameraLogSink : IDisposable
"RPI" => _loggerRPI,
"DeviceEnumerator" => _loggerDeviceEnumerator,
"IPAProxy" => _loggerIPAProxy,
"V4L2" => _loggerV4L2,
"RPISTREAM" => _loggerRPISTREAM,
"WRAPPER" => _loggerWRAPPER,
_ => null
};
+5 -3
View File
@@ -7,6 +7,7 @@ public partial class MainWindow : Window
public MainWindow()
{
InitializeComponent();
int i = 0;
PointerPressed += async (_, _) =>
{
@@ -14,12 +15,13 @@ public partial class MainWindow : Window
if (viewModel is null)
return;
var result = await viewModel.CaptureImage();
var result = await viewModel.CaptureImage(i++);
if (result is not null)
{
var (frameBuffer, streamConfiguration) = result.Value;
// cameraView.Update(frameBuffer, streamConfiguration);
(cameraView.Content as CameraViewModel)?.CallUpdate(frameBuffer, streamConfiguration);
if (frameBuffer.Metadata.Status == LibCameraSharp.FrameMetadata.StatusEnum.FrameSuccess)
// cameraView.Update(frameBuffer, streamConfiguration);
(cameraView.Content as CameraViewModel)?.CallUpdate(frameBuffer, streamConfiguration);
}
};
}
+5 -5
View File
@@ -30,7 +30,7 @@ public partial class MainWindowViewModel : ViewModelBase
_logger.LogInformation("Initialized");
}
public async Task<(LibCameraSharp.FrameBuffer, LibCameraSharp.StreamConfiguration)?> CaptureImage()
public async Task<(LibCameraSharp.FrameBuffer, LibCameraSharp.StreamConfiguration)?> CaptureImage(int bufferId)
{
_logger.LogInformation("Capture image");
_lightsService.CpuLoad(0.5, 1, System.Drawing.Color.Aqua);
@@ -38,9 +38,9 @@ public partial class MainWindowViewModel : ViewModelBase
(LibCameraSharp.FrameBuffer, LibCameraSharp.StreamConfiguration)? result = null;
try
{
_illuminatorService.SetIntensity(0.01, 0, 0);
_illuminatorService.TurnOn();
result = await _cameraService.CaptureViewFinderBuffer(CancellationToken.None);
// _illuminatorService.SetIntensity(0.01, 0, 0);
// _illuminatorService.TurnOn();
result = await _cameraService.CaptureViewFinderBuffer(bufferId, CancellationToken.None);
_lightsService.Flash(0.5, 2, System.Drawing.Color.Green);
}
catch (Exception e)
@@ -50,7 +50,7 @@ public partial class MainWindowViewModel : ViewModelBase
}
finally
{
_illuminatorService.TurnOff();
// _illuminatorService.TurnOff();
}
var snowfallTimer = new System.Timers.Timer(3000);
+2
View File
@@ -13,6 +13,8 @@
"LibCamera-RPI": "Information",
"LibCamera-DeviceEnumerator": "Information",
"LibCamera-IPAProxy": "Information",
"LibCamera-V4L2": "Information",
"LibCamera-RPISTREAM": "Information",
"LibCamera-WRAPPER": "Information"
}
},