summaryrefslogtreecommitdiffstats
path: root/src/video_core/compatible_formats.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/compatible_formats.cpp')
-rw-r--r--src/video_core/compatible_formats.cpp49
1 files changed, 42 insertions, 7 deletions
diff --git a/src/video_core/compatible_formats.cpp b/src/video_core/compatible_formats.cpp
index acf2668dc..8317d0636 100644
--- a/src/video_core/compatible_formats.cpp
+++ b/src/video_core/compatible_formats.cpp
@@ -48,6 +48,15 @@ constexpr std::array VIEW_CLASS_32_BITS{
PixelFormat::A2B10G10R10_UINT,
};
+constexpr std::array VIEW_CLASS_32_BITS_NO_BGR{
+ PixelFormat::R16G16_FLOAT, PixelFormat::B10G11R11_FLOAT, PixelFormat::R32_FLOAT,
+ PixelFormat::A2B10G10R10_UNORM, PixelFormat::R16G16_UINT, PixelFormat::R32_UINT,
+ PixelFormat::R16G16_SINT, PixelFormat::R32_SINT, PixelFormat::A8B8G8R8_UNORM,
+ PixelFormat::R16G16_UNORM, PixelFormat::A8B8G8R8_SNORM, PixelFormat::R16G16_SNORM,
+ PixelFormat::A8B8G8R8_SRGB, PixelFormat::E5B9G9R9_FLOAT, PixelFormat::A8B8G8R8_UINT,
+ PixelFormat::A8B8G8R8_SINT, PixelFormat::A2B10G10R10_UINT,
+};
+
// TODO: How should we handle 24 bits?
constexpr std::array VIEW_CLASS_16_BITS{
@@ -205,7 +214,6 @@ constexpr Table MakeViewTable() {
EnableRange(view, VIEW_CLASS_128_BITS);
EnableRange(view, VIEW_CLASS_96_BITS);
EnableRange(view, VIEW_CLASS_64_BITS);
- EnableRange(view, VIEW_CLASS_32_BITS);
EnableRange(view, VIEW_CLASS_16_BITS);
EnableRange(view, VIEW_CLASS_8_BITS);
EnableRange(view, VIEW_CLASS_RGTC1_RED);
@@ -231,20 +239,47 @@ constexpr Table MakeCopyTable() {
EnableRange(copy, COPY_CLASS_64_BITS);
return copy;
}
+
+constexpr Table MakeNativeBgrViewTable() {
+ Table copy = MakeViewTable();
+ EnableRange(copy, VIEW_CLASS_32_BITS);
+ return copy;
+}
+
+constexpr Table MakeNonNativeBgrViewTable() {
+ Table copy = MakeViewTable();
+ EnableRange(copy, VIEW_CLASS_32_BITS_NO_BGR);
+ return copy;
+}
+
+constexpr Table MakeNativeBgrCopyTable() {
+ Table copy = MakeCopyTable();
+ EnableRange(copy, VIEW_CLASS_32_BITS);
+ return copy;
+}
+
+constexpr Table MakeNonNativeBgrCopyTable() {
+ Table copy = MakeCopyTable();
+ EnableRange(copy, VIEW_CLASS_32_BITS);
+ return copy;
+}
} // Anonymous namespace
-bool IsViewCompatible(PixelFormat format_a, PixelFormat format_b, bool broken_views) {
+bool IsViewCompatible(PixelFormat format_a, PixelFormat format_b, bool broken_views,
+ bool native_bgr) {
if (broken_views) {
// If format views are broken, only accept formats that are identical.
return format_a == format_b;
}
- static constexpr Table TABLE = MakeViewTable();
- return IsSupported(TABLE, format_a, format_b);
+ static constexpr Table BGR_TABLE = MakeNativeBgrViewTable();
+ static constexpr Table NO_BGR_TABLE = MakeNonNativeBgrViewTable();
+ return IsSupported(native_bgr ? BGR_TABLE : NO_BGR_TABLE, format_a, format_b);
}
-bool IsCopyCompatible(PixelFormat format_a, PixelFormat format_b) {
- static constexpr Table TABLE = MakeCopyTable();
- return IsSupported(TABLE, format_a, format_b);
+bool IsCopyCompatible(PixelFormat format_a, PixelFormat format_b, bool native_bgr) {
+ static constexpr Table BGR_TABLE = MakeNativeBgrCopyTable();
+ static constexpr Table NO_BGR_TABLE = MakeNonNativeBgrCopyTable();
+ return IsSupported(native_bgr ? BGR_TABLE : NO_BGR_TABLE, format_a, format_b);
}
} // namespace VideoCore::Surface