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;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<(FrameBuffer, StreamConfiguration)?> CaptureViewFinderBuffer(CancellationToken cancellationToken)
|
public async Task<(FrameBuffer, StreamConfiguration)?> CaptureViewFinderBuffer(int bufferId, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (_camera is null)
|
if (_camera is null)
|
||||||
throw new InvalidOperationException("Camera not initialized");
|
throw new InvalidOperationException("Camera not initialized");
|
||||||
@@ -674,7 +674,7 @@ public class CameraService : IDisposable
|
|||||||
.Token;
|
.Token;
|
||||||
|
|
||||||
var buffers = _viewFinderFrameBufferAllocator.Buffers(_viewFinderStream);
|
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 request = _camera.CreateRequest(checked((ulong)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()));
|
||||||
var result = request.AddBuffer(_viewFinderStream, buffer);
|
var result = request.AddBuffer(_viewFinderStream, buffer);
|
||||||
@@ -716,6 +716,7 @@ public class CameraService : IDisposable
|
|||||||
|
|
||||||
_camera.RequestCompleted += RequestCompleted;
|
_camera.RequestCompleted += RequestCompleted;
|
||||||
result = _camera.QueueRequest(request);
|
result = _camera.QueueRequest(request);
|
||||||
|
Console.WriteLine(result);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
_camera.RequestCompleted -= RequestCompleted;
|
_camera.RequestCompleted -= RequestCompleted;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
using Avalonia;
|
using Avalonia;
|
||||||
@@ -52,6 +53,7 @@ class VkImage
|
|||||||
}
|
}
|
||||||
class VkRenderer
|
class VkRenderer
|
||||||
{
|
{
|
||||||
|
[DllImport("libc")] private static extern int dup(int fd);
|
||||||
readonly VulkanContext context = new VulkanContext("GSS2.Test", "CameraView");
|
readonly VulkanContext context = new VulkanContext("GSS2.Test", "CameraView");
|
||||||
|
|
||||||
public IPlatformHandle ExportSemaphore(bool renderFinished)
|
public IPlatformHandle ExportSemaphore(bool renderFinished)
|
||||||
@@ -62,9 +64,16 @@ class VkRenderer
|
|||||||
|
|
||||||
unsafe public VkImage ImportOrUpdate(int fd, int width, int height, int stride)
|
unsafe public VkImage ImportOrUpdate(int fd, int width, int height, int stride)
|
||||||
{
|
{
|
||||||
|
var fdDup = dup(fd);
|
||||||
try
|
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 (exportImage, exportMemoryReqirements, exportMemory) = CreateExportImage(width, height);
|
||||||
|
|
||||||
var commandPoolCreateInfo = new CommandPoolCreateInfo
|
var commandPoolCreateInfo = new CommandPoolCreateInfo
|
||||||
@@ -125,13 +134,13 @@ class VkRenderer
|
|||||||
Console.WriteLine("KhrExternalMemoryFd import success");
|
Console.WriteLine("KhrExternalMemoryFd import success");
|
||||||
else
|
else
|
||||||
throw new Exception("KhrExternalMemoryFd import error");
|
throw new Exception("KhrExternalMemoryFd import error");
|
||||||
var MemoryGetFdInfoKHR = new MemoryGetFdInfoKHR
|
var memoryGetFdInfoKHR = new MemoryGetFdInfoKHR
|
||||||
{
|
{
|
||||||
SType = StructureType.MemoryGetFDInfoKhr,
|
SType = StructureType.MemoryGetFDInfoKhr,
|
||||||
Memory = exportMemory,
|
Memory = exportMemory,
|
||||||
HandleType = ExternalMemoryHandleTypeFlags.OpaqueFDBit
|
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}");
|
Console.WriteLine($"Image export success {vulkanFd}");
|
||||||
|
|
||||||
var renderFinished = context.RenderFinishedSemaphore;
|
var renderFinished = context.RenderFinishedSemaphore;
|
||||||
@@ -144,7 +153,9 @@ class VkRenderer
|
|||||||
SignalSemaphoreCount = 1
|
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()
|
return new VkImage()
|
||||||
{
|
{
|
||||||
@@ -194,7 +205,7 @@ class VkRenderer
|
|||||||
Tiling = ImageTiling.DrmFormatModifierExt,
|
Tiling = ImageTiling.DrmFormatModifierExt,
|
||||||
Usage = ImageUsageFlags.TransferSrcBit | ImageUsageFlags.SampledBit,
|
Usage = ImageUsageFlags.TransferSrcBit | ImageUsageFlags.SampledBit,
|
||||||
SharingMode = SharingMode.Exclusive,
|
SharingMode = SharingMode.Exclusive,
|
||||||
InitialLayout = ImageLayout.Undefined,
|
InitialLayout = ImageLayout.Undefined
|
||||||
};
|
};
|
||||||
context.Api.CreateImage(context.Device, &imageCreateInfo, null, out var image).ThrowOnError();
|
context.Api.CreateImage(context.Device, &imageCreateInfo, null, out var image).ThrowOnError();
|
||||||
context.Api.GetImageMemoryRequirements(context.Device, image, out var memoryReqirements);
|
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 _loggerRPI;
|
||||||
private readonly ILogger _loggerDeviceEnumerator;
|
private readonly ILogger _loggerDeviceEnumerator;
|
||||||
private readonly ILogger _loggerIPAProxy;
|
private readonly ILogger _loggerIPAProxy;
|
||||||
|
private readonly ILogger _loggerV4L2;
|
||||||
|
private readonly ILogger _loggerRPISTREAM;
|
||||||
private readonly ILogger _loggerWRAPPER;
|
private readonly ILogger _loggerWRAPPER;
|
||||||
private bool _disposedValue;
|
private bool _disposedValue;
|
||||||
|
|
||||||
@@ -21,12 +23,17 @@ public sealed class LibCameraLogSink : IDisposable
|
|||||||
_loggerRPI = loggerFactory.CreateLogger("LibCamera-RPI");
|
_loggerRPI = loggerFactory.CreateLogger("LibCamera-RPI");
|
||||||
_loggerDeviceEnumerator = loggerFactory.CreateLogger("LibCamera-DeviceEnumerator");
|
_loggerDeviceEnumerator = loggerFactory.CreateLogger("LibCamera-DeviceEnumerator");
|
||||||
_loggerIPAProxy = loggerFactory.CreateLogger("LibCamera-IPAProxy");
|
_loggerIPAProxy = loggerFactory.CreateLogger("LibCamera-IPAProxy");
|
||||||
|
_loggerV4L2 = loggerFactory.CreateLogger("LibCamera-V4L2");
|
||||||
|
_loggerRPISTREAM = loggerFactory.CreateLogger("LibCamera-RPISTREAM");
|
||||||
_loggerWRAPPER = loggerFactory.CreateLogger("LibCamera-WRAPPER");
|
_loggerWRAPPER = loggerFactory.CreateLogger("LibCamera-WRAPPER");
|
||||||
|
|
||||||
Log.Initialize();
|
Log.Initialize();
|
||||||
Log.SetLevel("Camera", Log.LogLevelEnum.DEBUG);
|
Log.SetLevel("Camera", Log.LogLevelEnum.DEBUG);
|
||||||
Log.SetLevel("RPI", Log.LogLevelEnum.DEBUG);
|
Log.SetLevel("RPI", Log.LogLevelEnum.DEBUG);
|
||||||
Log.SetLevel("DeviceEnumerator", Log.LogLevelEnum.DEBUG);
|
Log.SetLevel("DeviceEnumerator", Log.LogLevelEnum.DEBUG);
|
||||||
Log.SetLevel("IPAProxy", 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.SetLevel("WRAPPER", Log.LogLevelEnum.DEBUG);
|
||||||
Log.LogReceived += OnLogReceived;
|
Log.LogReceived += OnLogReceived;
|
||||||
}
|
}
|
||||||
@@ -46,6 +53,8 @@ public sealed class LibCameraLogSink : IDisposable
|
|||||||
"RPI" => _loggerRPI,
|
"RPI" => _loggerRPI,
|
||||||
"DeviceEnumerator" => _loggerDeviceEnumerator,
|
"DeviceEnumerator" => _loggerDeviceEnumerator,
|
||||||
"IPAProxy" => _loggerIPAProxy,
|
"IPAProxy" => _loggerIPAProxy,
|
||||||
|
"V4L2" => _loggerV4L2,
|
||||||
|
"RPISTREAM" => _loggerRPISTREAM,
|
||||||
"WRAPPER" => _loggerWRAPPER,
|
"WRAPPER" => _loggerWRAPPER,
|
||||||
_ => null
|
_ => null
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ public partial class MainWindow : Window
|
|||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
PointerPressed += async (_, _) =>
|
PointerPressed += async (_, _) =>
|
||||||
{
|
{
|
||||||
@@ -14,10 +15,11 @@ public partial class MainWindow : Window
|
|||||||
if (viewModel is null)
|
if (viewModel is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var result = await viewModel.CaptureImage();
|
var result = await viewModel.CaptureImage(i++);
|
||||||
if (result is not null)
|
if (result is not null)
|
||||||
{
|
{
|
||||||
var (frameBuffer, streamConfiguration) = result.Value;
|
var (frameBuffer, streamConfiguration) = result.Value;
|
||||||
|
if (frameBuffer.Metadata.Status == LibCameraSharp.FrameMetadata.StatusEnum.FrameSuccess)
|
||||||
// cameraView.Update(frameBuffer, streamConfiguration);
|
// cameraView.Update(frameBuffer, streamConfiguration);
|
||||||
(cameraView.Content as CameraViewModel)?.CallUpdate(frameBuffer, streamConfiguration);
|
(cameraView.Content as CameraViewModel)?.CallUpdate(frameBuffer, streamConfiguration);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public partial class MainWindowViewModel : ViewModelBase
|
|||||||
_logger.LogInformation("Initialized");
|
_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");
|
_logger.LogInformation("Capture image");
|
||||||
_lightsService.CpuLoad(0.5, 1, System.Drawing.Color.Aqua);
|
_lightsService.CpuLoad(0.5, 1, System.Drawing.Color.Aqua);
|
||||||
@@ -38,9 +38,9 @@ public partial class MainWindowViewModel : ViewModelBase
|
|||||||
(LibCameraSharp.FrameBuffer, LibCameraSharp.StreamConfiguration)? result = null;
|
(LibCameraSharp.FrameBuffer, LibCameraSharp.StreamConfiguration)? result = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_illuminatorService.SetIntensity(0.01, 0, 0);
|
// _illuminatorService.SetIntensity(0.01, 0, 0);
|
||||||
_illuminatorService.TurnOn();
|
// _illuminatorService.TurnOn();
|
||||||
result = await _cameraService.CaptureViewFinderBuffer(CancellationToken.None);
|
result = await _cameraService.CaptureViewFinderBuffer(bufferId, CancellationToken.None);
|
||||||
_lightsService.Flash(0.5, 2, System.Drawing.Color.Green);
|
_lightsService.Flash(0.5, 2, System.Drawing.Color.Green);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -50,7 +50,7 @@ public partial class MainWindowViewModel : ViewModelBase
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
_illuminatorService.TurnOff();
|
// _illuminatorService.TurnOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
var snowfallTimer = new System.Timers.Timer(3000);
|
var snowfallTimer = new System.Timers.Timer(3000);
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
"LibCamera-RPI": "Information",
|
"LibCamera-RPI": "Information",
|
||||||
"LibCamera-DeviceEnumerator": "Information",
|
"LibCamera-DeviceEnumerator": "Information",
|
||||||
"LibCamera-IPAProxy": "Information",
|
"LibCamera-IPAProxy": "Information",
|
||||||
|
"LibCamera-V4L2": "Information",
|
||||||
|
"LibCamera-RPISTREAM": "Information",
|
||||||
"LibCamera-WRAPPER": "Information"
|
"LibCamera-WRAPPER": "Information"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user