From 8896629ce2ed94fbdb016f0b5b9bb5a7c0408ed2 Mon Sep 17 00:00:00 2001 From: Alek-ban Date: Fri, 23 Jan 2026 07:52:05 +0300 Subject: [PATCH] fix: GSS2.Test Vulakn render image buffer rotation --- GSS2.Core/Hardware/CameraService.cs | 5 +++-- GSS2.Test/CameraView.axaml.cs | 21 ++++++++++++++++----- GSS2.Test/LibCameraLogSink.cs | 9 +++++++++ GSS2.Test/MainWindow.axaml.cs | 8 +++++--- GSS2.Test/MainWindowViewModel.cs | 10 +++++----- GSS2.Test/appsettings.json | 2 ++ 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/GSS2.Core/Hardware/CameraService.cs b/GSS2.Core/Hardware/CameraService.cs index 7780fc9..6660f54 100644 --- a/GSS2.Core/Hardware/CameraService.cs +++ b/GSS2.Core/Hardware/CameraService.cs @@ -658,7 +658,7 @@ public class CameraService : IDisposable return image; } - public async Task<(FrameBuffer, StreamConfiguration)?> CaptureViewFinderBuffer(CancellationToken cancellationToken) + public async Task<(FrameBuffer, StreamConfiguration)?> CaptureViewFinderBuffer(int bufferId, CancellationToken cancellationToken) { if (_camera is null) throw new InvalidOperationException("Camera not initialized"); @@ -674,7 +674,7 @@ public class CameraService : IDisposable .Token; var buffers = _viewFinderFrameBufferAllocator.Buffers(_viewFinderStream); - var buffer = buffers.First(); + var buffer = buffers.Skip(bufferId % buffers.Count()).First(); var request = _camera.CreateRequest(checked((ulong)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds())); var result = request.AddBuffer(_viewFinderStream, buffer); @@ -716,6 +716,7 @@ public class CameraService : IDisposable _camera.RequestCompleted += RequestCompleted; result = _camera.QueueRequest(request); + Console.WriteLine(result); if (result < 0) { _camera.RequestCompleted -= RequestCompleted; diff --git a/GSS2.Test/CameraView.axaml.cs b/GSS2.Test/CameraView.axaml.cs index 506d15a..9856053 100644 --- a/GSS2.Test/CameraView.axaml.cs +++ b/GSS2.Test/CameraView.axaml.cs @@ -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); diff --git a/GSS2.Test/LibCameraLogSink.cs b/GSS2.Test/LibCameraLogSink.cs index 79b4483..fdf759b 100644 --- a/GSS2.Test/LibCameraLogSink.cs +++ b/GSS2.Test/LibCameraLogSink.cs @@ -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 }; diff --git a/GSS2.Test/MainWindow.axaml.cs b/GSS2.Test/MainWindow.axaml.cs index bbdb8cc..4bfccc0 100644 --- a/GSS2.Test/MainWindow.axaml.cs +++ b/GSS2.Test/MainWindow.axaml.cs @@ -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); } }; } diff --git a/GSS2.Test/MainWindowViewModel.cs b/GSS2.Test/MainWindowViewModel.cs index 5f20440..9646e7a 100644 --- a/GSS2.Test/MainWindowViewModel.cs +++ b/GSS2.Test/MainWindowViewModel.cs @@ -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); diff --git a/GSS2.Test/appsettings.json b/GSS2.Test/appsettings.json index fb61e82..7faf7c1 100644 --- a/GSS2.Test/appsettings.json +++ b/GSS2.Test/appsettings.json @@ -13,6 +13,8 @@ "LibCamera-RPI": "Information", "LibCamera-DeviceEnumerator": "Information", "LibCamera-IPAProxy": "Information", + "LibCamera-V4L2": "Information", + "LibCamera-RPISTREAM": "Information", "LibCamera-WRAPPER": "Information" } },