|
|
|
@ -7,6 +7,8 @@ using Avalonia.OpenGL; |
|
|
|
using Avalonia.Platform.Interop; |
|
|
|
using static Avalonia.LinuxFramebuffer.NativeUnsafeMethods; |
|
|
|
using static Avalonia.LinuxFramebuffer.Output.LibDrm; |
|
|
|
using static Avalonia.LinuxFramebuffer.Output.LibDrm.GbmColorFormats; |
|
|
|
|
|
|
|
namespace Avalonia.LinuxFramebuffer.Output |
|
|
|
{ |
|
|
|
public unsafe class DrmOutput : IOutputBackend, IGlPlatformSurface, IWindowingPlatformGlFeature |
|
|
|
@ -71,11 +73,26 @@ namespace Avalonia.LinuxFramebuffer.Output |
|
|
|
var w = gbm_bo_get_width(bo); |
|
|
|
var h = gbm_bo_get_height(bo); |
|
|
|
var stride = gbm_bo_get_stride(bo); |
|
|
|
var handle = gbm_bo_get_handle(bo); |
|
|
|
var handle = gbm_bo_get_handle(bo).u32; |
|
|
|
var format = gbm_bo_get_format(bo); |
|
|
|
|
|
|
|
// prepare for the new ioctl call
|
|
|
|
var handles = new uint[] {handle, 0, 0, 0}; |
|
|
|
var pitches = new uint[] {stride, 0, 0, 0}; |
|
|
|
var offsets = new uint[] {}; |
|
|
|
|
|
|
|
var ret = drmModeAddFB2(_card.Fd, w, h, format, handles, pitches, |
|
|
|
offsets, out var fbHandle, 0); |
|
|
|
|
|
|
|
var ret = drmModeAddFB(_card.Fd, w, h, 24, 32, stride, (uint)handle, out var fbHandle); |
|
|
|
if (ret != 0) |
|
|
|
throw new Win32Exception(ret, "drmModeAddFb failed"); |
|
|
|
{ |
|
|
|
// legacy fallback
|
|
|
|
ret = drmModeAddFB(_card.Fd, w, h, 24, 32, stride, (uint)handle, |
|
|
|
out fbHandle); |
|
|
|
|
|
|
|
if (ret != 0) |
|
|
|
throw new Win32Exception(ret, $"drmModeAddFb failed {ret}"); |
|
|
|
} |
|
|
|
|
|
|
|
gbm_bo_set_user_data(bo, new IntPtr((int)fbHandle), FbDestroyDelegate); |
|
|
|
|
|
|
|
|