Swap BGR components for 16-bit BGR texture formats (#2567)
This commit is contained in:
parent
6c76bc3bc0
commit
c702943af3
6 changed files with 15 additions and 12 deletions
|
@ -235,14 +235,17 @@ namespace Ryujinx.Graphics.GAL
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks if the texture format is a BGRA format with 8-bit components.
|
/// Checks if the texture format is a BGR format.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="format">Texture format</param>
|
/// <param name="format">Texture format</param>
|
||||||
/// <returns>True if the texture format is a BGRA format with 8-bit components, false otherwise</returns>
|
/// <returns>True if the texture format is a BGR format, false otherwise</returns>
|
||||||
public static bool IsBgra8(this Format format)
|
public static bool IsBgr(this Format format)
|
||||||
{
|
{
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
|
case Format.B5G6R5Unorm:
|
||||||
|
case Format.B5G5R5X1Unorm:
|
||||||
|
case Format.B5G5R5A1Unorm:
|
||||||
case Format.B8G8R8X8Unorm:
|
case Format.B8G8R8X8Unorm:
|
||||||
case Format.B8G8R8A8Unorm:
|
case Format.B8G8R8A8Unorm:
|
||||||
case Format.B8G8R8X8Srgb:
|
case Format.B8G8R8X8Srgb:
|
||||||
|
|
|
@ -168,9 +168,9 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
Add(Format.Astc10x10Srgb, new FormatInfo(4, false, false, All.CompressedSrgb8Alpha8Astc10X10Khr));
|
Add(Format.Astc10x10Srgb, new FormatInfo(4, false, false, All.CompressedSrgb8Alpha8Astc10X10Khr));
|
||||||
Add(Format.Astc12x10Srgb, new FormatInfo(4, false, false, All.CompressedSrgb8Alpha8Astc12X10Khr));
|
Add(Format.Astc12x10Srgb, new FormatInfo(4, false, false, All.CompressedSrgb8Alpha8Astc12X10Khr));
|
||||||
Add(Format.Astc12x12Srgb, new FormatInfo(4, false, false, All.CompressedSrgb8Alpha8Astc12X12Khr));
|
Add(Format.Astc12x12Srgb, new FormatInfo(4, false, false, All.CompressedSrgb8Alpha8Astc12X12Khr));
|
||||||
Add(Format.B5G6R5Unorm, new FormatInfo(3, true, false, All.Rgb565, PixelFormat.Rgb, PixelType.UnsignedShort565));
|
Add(Format.B5G6R5Unorm, new FormatInfo(3, true, false, All.Rgb565, PixelFormat.Rgb, PixelType.UnsignedShort565Reversed));
|
||||||
Add(Format.B5G5R5X1Unorm, new FormatInfo(4, true, false, All.Rgb5, PixelFormat.Bgra, PixelType.UnsignedShort5551));
|
Add(Format.B5G5R5X1Unorm, new FormatInfo(4, true, false, All.Rgb5, PixelFormat.Rgba, PixelType.UnsignedShort1555Reversed));
|
||||||
Add(Format.B5G5R5A1Unorm, new FormatInfo(4, true, false, All.Rgb5A1, PixelFormat.Bgra, PixelType.UnsignedShort5551));
|
Add(Format.B5G5R5A1Unorm, new FormatInfo(4, true, false, All.Rgb5A1, PixelFormat.Rgba, PixelType.UnsignedShort1555Reversed));
|
||||||
Add(Format.A1B5G5R5Unorm, new FormatInfo(4, true, false, All.Rgb5A1, PixelFormat.Bgra, PixelType.UnsignedShort1555Reversed));
|
Add(Format.A1B5G5R5Unorm, new FormatInfo(4, true, false, All.Rgb5A1, PixelFormat.Bgra, PixelType.UnsignedShort1555Reversed));
|
||||||
Add(Format.B8G8R8X8Unorm, new FormatInfo(4, true, false, All.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte));
|
Add(Format.B8G8R8X8Unorm, new FormatInfo(4, true, false, All.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte));
|
||||||
Add(Format.B8G8R8A8Unorm, new FormatInfo(4, true, false, All.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte));
|
Add(Format.B8G8R8A8Unorm, new FormatInfo(4, true, false, All.Rgba8, PixelFormat.Rgba, PixelType.UnsignedByte));
|
||||||
|
|
|
@ -27,7 +27,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
Extents2D dstRegion,
|
Extents2D dstRegion,
|
||||||
bool linearFilter)
|
bool linearFilter)
|
||||||
{
|
{
|
||||||
TextureView srcConverted = src.Format.IsBgra8() != dst.Format.IsBgra8() ? BgraSwap(src) : src;
|
TextureView srcConverted = src.Format.IsBgr() != dst.Format.IsBgr() ? BgraSwap(src) : src;
|
||||||
|
|
||||||
(int oldDrawFramebufferHandle, int oldReadFramebufferHandle) = ((Pipeline)_renderer.Pipeline).GetBoundFramebuffers();
|
(int oldDrawFramebufferHandle, int oldReadFramebufferHandle) = ((Pipeline)_renderer.Pipeline).GetBoundFramebuffers();
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
|
||||||
(int)Info.SwizzleA.Convert()
|
(int)Info.SwizzleA.Convert()
|
||||||
};
|
};
|
||||||
|
|
||||||
if (Info.Format.IsBgra8())
|
if (Info.Format.IsBgr())
|
||||||
{
|
{
|
||||||
// Swap B <-> R for BGRA formats, as OpenGL has no support for them
|
// Swap B <-> R for BGRA formats, as OpenGL has no support for them
|
||||||
// and we need to manually swap the components on read/write on the GPU.
|
// and we need to manually swap the components on read/write on the GPU.
|
||||||
|
|
|
@ -879,7 +879,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
|
|
||||||
_framebuffer.AttachColor(index, color);
|
_framebuffer.AttachColor(index, color);
|
||||||
|
|
||||||
int isBgra = color != null && color.Format.IsBgra8() ? 1 : 0;
|
int isBgra = color != null && color.Format.IsBgr() ? 1 : 0;
|
||||||
|
|
||||||
if (_fpIsBgra[index].X != isBgra)
|
if (_fpIsBgra[index].X != isBgra)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer);
|
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer);
|
||||||
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, readFramebuffer);
|
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, readFramebuffer);
|
||||||
|
|
||||||
TextureView viewConverted = view.Format.IsBgra8() ? _renderer.TextureCopy.BgraSwap(view) : view;
|
TextureView viewConverted = view.Format.IsBgr() ? _renderer.TextureCopy.BgraSwap(view) : view;
|
||||||
|
|
||||||
GL.FramebufferTexture(
|
GL.FramebufferTexture(
|
||||||
FramebufferTarget.ReadFramebuffer,
|
FramebufferTarget.ReadFramebuffer,
|
||||||
|
@ -110,7 +110,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
|
|
||||||
if (ScreenCaptureRequested)
|
if (ScreenCaptureRequested)
|
||||||
{
|
{
|
||||||
CaptureFrame(srcX0, srcY0, srcX1, srcY1, view.Format.IsBgra8(), crop.FlipX, crop.FlipY);
|
CaptureFrame(srcX0, srcY0, srcX1, srcY1, view.Format.IsBgr(), crop.FlipX, crop.FlipY);
|
||||||
|
|
||||||
ScreenCaptureRequested = false;
|
ScreenCaptureRequested = false;
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
byte[] bitmap = new byte[size];
|
byte[] bitmap = new byte[size];
|
||||||
|
|
||||||
GL.ReadPixels(x, y, width, height, isBgra ? PixelFormat.Bgra : PixelFormat.Rgba, PixelType.UnsignedByte, bitmap);
|
GL.ReadPixels(x, y, width, height, isBgra ? PixelFormat.Bgra : PixelFormat.Rgba, PixelType.UnsignedByte, bitmap);
|
||||||
|
|
||||||
_renderer.OnScreenCaptured(new ScreenCaptureImageInfo(width, height, isBgra, bitmap, flipX, flipY));
|
_renderer.OnScreenCaptured(new ScreenCaptureImageInfo(width, height, isBgra, bitmap, flipX, flipY));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue