|
|
@@ -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
|