pixel_format.cpp
1 // Copyright 2023 Citra Emulator Project 2 // Licensed under GPLv2 or any later version 3 // Refer to the license.txt file included. 4 5 #include "video_core/pica/regs_external.h" 6 #include "video_core/rasterizer_cache/pixel_format.h" 7 8 namespace VideoCore { 9 10 std::string_view PixelFormatAsString(PixelFormat format) { 11 switch (format) { 12 case PixelFormat::RGBA8: 13 return "RGBA8"; 14 case PixelFormat::RGB8: 15 return "RGB8"; 16 case PixelFormat::RGB5A1: 17 return "RGB5A1"; 18 case PixelFormat::RGB565: 19 return "RGB565"; 20 case PixelFormat::RGBA4: 21 return "RGBA4"; 22 case PixelFormat::IA8: 23 return "IA8"; 24 case PixelFormat::RG8: 25 return "RG8"; 26 case PixelFormat::I8: 27 return "I8"; 28 case PixelFormat::A8: 29 return "A8"; 30 case PixelFormat::IA4: 31 return "IA4"; 32 case PixelFormat::I4: 33 return "I4"; 34 case PixelFormat::A4: 35 return "A4"; 36 case PixelFormat::ETC1: 37 return "ETC1"; 38 case PixelFormat::ETC1A4: 39 return "ETC1A4"; 40 case PixelFormat::D16: 41 return "D16"; 42 case PixelFormat::D24: 43 return "D24"; 44 case PixelFormat::D24S8: 45 return "D24S8"; 46 default: 47 return "NotReal"; 48 } 49 } 50 51 bool CheckFormatsBlittable(PixelFormat source_format, PixelFormat dest_format) { 52 SurfaceType source_type = GetFormatType(source_format); 53 SurfaceType dest_type = GetFormatType(dest_format); 54 55 if ((source_type == SurfaceType::Color || source_type == SurfaceType::Texture) && 56 (dest_type == SurfaceType::Color || dest_type == SurfaceType::Texture)) { 57 return true; 58 } 59 60 if (source_type == SurfaceType::Depth && dest_type == SurfaceType::Depth) { 61 return true; 62 } 63 64 if (source_type == SurfaceType::DepthStencil && dest_type == SurfaceType::DepthStencil) { 65 return true; 66 } 67 68 LOG_WARNING(HW_GPU, "Unblittable format pair detected {} and {}", 69 PixelFormatAsString(source_format), PixelFormatAsString(dest_format)); 70 return false; 71 } 72 73 PixelFormat PixelFormatFromTextureFormat(Pica::TexturingRegs::TextureFormat format) { 74 switch (format) { 75 case Pica::TexturingRegs::TextureFormat::RGBA8: 76 return PixelFormat::RGBA8; 77 case Pica::TexturingRegs::TextureFormat::RGB8: 78 return PixelFormat::RGB8; 79 case Pica::TexturingRegs::TextureFormat::RGB5A1: 80 return PixelFormat::RGB5A1; 81 case Pica::TexturingRegs::TextureFormat::RGB565: 82 return PixelFormat::RGB565; 83 case Pica::TexturingRegs::TextureFormat::RGBA4: 84 return PixelFormat::RGBA4; 85 case Pica::TexturingRegs::TextureFormat::IA8: 86 return PixelFormat::IA8; 87 case Pica::TexturingRegs::TextureFormat::RG8: 88 return PixelFormat::RG8; 89 case Pica::TexturingRegs::TextureFormat::I8: 90 return PixelFormat::I8; 91 case Pica::TexturingRegs::TextureFormat::A8: 92 return PixelFormat::A8; 93 case Pica::TexturingRegs::TextureFormat::IA4: 94 return PixelFormat::IA4; 95 case Pica::TexturingRegs::TextureFormat::I4: 96 return PixelFormat::I4; 97 case Pica::TexturingRegs::TextureFormat::A4: 98 return PixelFormat::A4; 99 case Pica::TexturingRegs::TextureFormat::ETC1: 100 return PixelFormat::ETC1; 101 case Pica::TexturingRegs::TextureFormat::ETC1A4: 102 return PixelFormat::ETC1A4; 103 default: 104 return PixelFormat::Invalid; 105 } 106 } 107 108 PixelFormat PixelFormatFromColorFormat(Pica::FramebufferRegs::ColorFormat format) { 109 switch (format) { 110 case Pica::FramebufferRegs::ColorFormat::RGBA8: 111 return PixelFormat::RGBA8; 112 case Pica::FramebufferRegs::ColorFormat::RGB8: 113 return PixelFormat::RGB8; 114 case Pica::FramebufferRegs::ColorFormat::RGB5A1: 115 return PixelFormat::RGB5A1; 116 case Pica::FramebufferRegs::ColorFormat::RGB565: 117 return PixelFormat::RGB565; 118 case Pica::FramebufferRegs::ColorFormat::RGBA4: 119 return PixelFormat::RGBA4; 120 default: 121 return PixelFormat::Invalid; 122 } 123 } 124 125 PixelFormat PixelFormatFromDepthFormat(Pica::FramebufferRegs::DepthFormat format) { 126 switch (format) { 127 case Pica::FramebufferRegs::DepthFormat::D16: 128 return PixelFormat::D16; 129 case Pica::FramebufferRegs::DepthFormat::D24: 130 return PixelFormat::D24; 131 case Pica::FramebufferRegs::DepthFormat::D24S8: 132 return PixelFormat::D24S8; 133 default: 134 return PixelFormat::Invalid; 135 } 136 } 137 138 PixelFormat PixelFormatFromGPUPixelFormat(Pica::PixelFormat format) { 139 switch (format) { 140 case Pica::PixelFormat::RGBA8: 141 return PixelFormat::RGBA8; 142 case Pica::PixelFormat::RGB8: 143 return PixelFormat::RGB8; 144 case Pica::PixelFormat::RGB565: 145 return PixelFormat::RGB565; 146 case Pica::PixelFormat::RGB5A1: 147 return PixelFormat::RGB5A1; 148 case Pica::PixelFormat::RGBA4: 149 return PixelFormat::RGBA4; 150 default: 151 return PixelFormat::Invalid; 152 } 153 } 154 155 } // namespace VideoCore