forked from amkovkov/GranuSightSoftware2
fix: GSS2.Test Vulakn render image buffer rotation
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
"LibCamera-RPI": "Information",
|
||||
"LibCamera-DeviceEnumerator": "Information",
|
||||
"LibCamera-IPAProxy": "Information",
|
||||
"LibCamera-V4L2": "Information",
|
||||
"LibCamera-RPISTREAM": "Information",
|
||||
"LibCamera-WRAPPER": "Information"
|
||||
}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user