/ src / video_core / rasterizer_cache / pixel_format.cpp
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