mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-02-24 09:56:58 +00:00
[KMS] Improved GBM surface format selection
This commit is contained in:
parent
6454822116
commit
f9d20b5e3e
|
@ -65,28 +65,25 @@ namespace OpenTK.Platform.Linux
|
||||||
}
|
}
|
||||||
Debug.Print("[KMS] Selected EGL mode {0}", mode);
|
Debug.Print("[KMS] Selected EGL mode {0}", mode);
|
||||||
|
|
||||||
unsafe
|
SurfaceFormat format = GetSurfaceFormat(display, mode);
|
||||||
|
SurfaceFlags usage = SurfaceFlags.Rendering | SurfaceFlags.Scanout;
|
||||||
|
if (!Gbm.IsFormatSupported(gbm, format, usage))
|
||||||
{
|
{
|
||||||
SurfaceFormat format = GetSurfaceFormat(mode);
|
//format = SurfaceFormat.xrgba;
|
||||||
SurfaceFlags usage = SurfaceFlags.Rendering | SurfaceFlags.Scanout;
|
|
||||||
if (!Gbm.IsFormatSupported(gbm, format, usage))
|
|
||||||
{
|
|
||||||
format = SurfaceFormat.XBGR8888;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Print("[KMS] Creating GBM surface on {0:x} with {1}x{2} {3} {4}",
|
|
||||||
gbm, width, height, format, usage);
|
|
||||||
IntPtr gbm_surface = Gbm.CreateSurface(gbm,
|
|
||||||
width, height, format, usage);
|
|
||||||
if (gbm_surface == IntPtr.Zero)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException("[KMS] Failed to create GBM surface for rendering");
|
|
||||||
}
|
|
||||||
|
|
||||||
window.Handle = gbm_surface;
|
|
||||||
Debug.Print("[KMS] Created GBM surface {0:x}", window.Handle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug.Print("[KMS] Creating GBM surface on {0:x} with {1}x{2} {3} [{4}]",
|
||||||
|
gbm, width, height, format, usage);
|
||||||
|
IntPtr gbm_surface = Gbm.CreateSurface(gbm,
|
||||||
|
width, height, format, usage);
|
||||||
|
if (gbm_surface == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
throw new NotSupportedException("[KMS] Failed to create GBM surface for rendering");
|
||||||
|
}
|
||||||
|
|
||||||
|
window.Handle = gbm_surface;
|
||||||
|
Debug.Print("[KMS] Created GBM surface {0:x}", window.Handle);
|
||||||
|
|
||||||
window.CreateWindowSurface(mode.Index.Value);
|
window.CreateWindowSurface(mode.Index.Value);
|
||||||
Debug.Print("[KMS] Created EGL surface {0:x}", window.Surface);
|
Debug.Print("[KMS] Created EGL surface {0:x}", window.Surface);
|
||||||
|
|
||||||
|
@ -94,8 +91,21 @@ namespace OpenTK.Platform.Linux
|
||||||
exists = true;
|
exists = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceFormat GetSurfaceFormat(GraphicsMode mode)
|
SurfaceFormat GetSurfaceFormat(IntPtr display, GraphicsMode mode)
|
||||||
{
|
{
|
||||||
|
// Use EGL 1.4 EGL_NATIVE_VISUAL_ID to retrieve
|
||||||
|
// the corresponding surface format. If that fails
|
||||||
|
// fall back to a manual algorithm.
|
||||||
|
int format;
|
||||||
|
Egl.GetConfigAttrib(display, mode.Index.Value,
|
||||||
|
Egl.NATIVE_VISUAL_ID, out format);
|
||||||
|
if ((SurfaceFormat)format != 0)
|
||||||
|
return (SurfaceFormat)format;
|
||||||
|
|
||||||
|
Debug.Print("[KMS] Failed to retrieve EGL visual from GBM surface. Error: {0}",
|
||||||
|
Egl.GetError());
|
||||||
|
Debug.Print("[KMS] Falling back to hardcoded formats.");
|
||||||
|
|
||||||
int r = mode.ColorFormat.Red;
|
int r = mode.ColorFormat.Red;
|
||||||
int g = mode.ColorFormat.Green;
|
int g = mode.ColorFormat.Green;
|
||||||
int b = mode.ColorFormat.Blue;
|
int b = mode.ColorFormat.Blue;
|
||||||
|
|
Loading…
Reference in a new issue