citra/src/video_core/rasterizer_cache/pixel_format.cpp

156 lines
4.8 KiB
C++

// Copyright 2023 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include "video_core/pica/regs_external.h"
#include "video_core/rasterizer_cache/pixel_format.h"
namespace VideoCore {
std::string_view PixelFormatAsString(PixelFormat format) {
switch (format) {
case PixelFormat::RGBA8:
return "RGBA8";
case PixelFormat::RGB8:
return "RGB8";
case PixelFormat::RGB5A1:
return "RGB5A1";
case PixelFormat::RGB565:
return "RGB565";
case PixelFormat::RGBA4:
return "RGBA4";
case PixelFormat::IA8:
return "IA8";
case PixelFormat::RG8:
return "RG8";
case PixelFormat::I8:
return "I8";
case PixelFormat::A8:
return "A8";
case PixelFormat::IA4:
return "IA4";
case PixelFormat::I4:
return "I4";
case PixelFormat::A4:
return "A4";
case PixelFormat::ETC1:
return "ETC1";
case PixelFormat::ETC1A4:
return "ETC1A4";
case PixelFormat::D16:
return "D16";
case PixelFormat::D24:
return "D24";
case PixelFormat::D24S8:
return "D24S8";
default:
return "NotReal";
}
}
bool CheckFormatsBlittable(PixelFormat source_format, PixelFormat dest_format) {
SurfaceType source_type = GetFormatType(source_format);
SurfaceType dest_type = GetFormatType(dest_format);
if ((source_type == SurfaceType::Color || source_type == SurfaceType::Texture) &&
(dest_type == SurfaceType::Color || dest_type == SurfaceType::Texture)) {
return true;
}
if (source_type == SurfaceType::Depth && dest_type == SurfaceType::Depth) {
return true;
}
if (source_type == SurfaceType::DepthStencil && dest_type == SurfaceType::DepthStencil) {
return true;
}
LOG_WARNING(HW_GPU, "Unblittable format pair detected {} and {}",
PixelFormatAsString(source_format), PixelFormatAsString(dest_format));
return false;
}
PixelFormat PixelFormatFromTextureFormat(Pica::TexturingRegs::TextureFormat format) {
switch (format) {
case Pica::TexturingRegs::TextureFormat::RGBA8:
return PixelFormat::RGBA8;
case Pica::TexturingRegs::TextureFormat::RGB8:
return PixelFormat::RGB8;
case Pica::TexturingRegs::TextureFormat::RGB5A1:
return PixelFormat::RGB5A1;
case Pica::TexturingRegs::TextureFormat::RGB565:
return PixelFormat::RGB565;
case Pica::TexturingRegs::TextureFormat::RGBA4:
return PixelFormat::RGBA4;
case Pica::TexturingRegs::TextureFormat::IA8:
return PixelFormat::IA8;
case Pica::TexturingRegs::TextureFormat::RG8:
return PixelFormat::RG8;
case Pica::TexturingRegs::TextureFormat::I8:
return PixelFormat::I8;
case Pica::TexturingRegs::TextureFormat::A8:
return PixelFormat::A8;
case Pica::TexturingRegs::TextureFormat::IA4:
return PixelFormat::IA4;
case Pica::TexturingRegs::TextureFormat::I4:
return PixelFormat::I4;
case Pica::TexturingRegs::TextureFormat::A4:
return PixelFormat::A4;
case Pica::TexturingRegs::TextureFormat::ETC1:
return PixelFormat::ETC1;
case Pica::TexturingRegs::TextureFormat::ETC1A4:
return PixelFormat::ETC1A4;
default:
return PixelFormat::Invalid;
}
}
PixelFormat PixelFormatFromColorFormat(Pica::FramebufferRegs::ColorFormat format) {
switch (format) {
case Pica::FramebufferRegs::ColorFormat::RGBA8:
return PixelFormat::RGBA8;
case Pica::FramebufferRegs::ColorFormat::RGB8:
return PixelFormat::RGB8;
case Pica::FramebufferRegs::ColorFormat::RGB5A1:
return PixelFormat::RGB5A1;
case Pica::FramebufferRegs::ColorFormat::RGB565:
return PixelFormat::RGB565;
case Pica::FramebufferRegs::ColorFormat::RGBA4:
return PixelFormat::RGBA4;
default:
return PixelFormat::Invalid;
}
}
PixelFormat PixelFormatFromDepthFormat(Pica::FramebufferRegs::DepthFormat format) {
switch (format) {
case Pica::FramebufferRegs::DepthFormat::D16:
return PixelFormat::D16;
case Pica::FramebufferRegs::DepthFormat::D24:
return PixelFormat::D24;
case Pica::FramebufferRegs::DepthFormat::D24S8:
return PixelFormat::D24S8;
default:
return PixelFormat::Invalid;
}
}
PixelFormat PixelFormatFromGPUPixelFormat(Pica::PixelFormat format) {
switch (format) {
case Pica::PixelFormat::RGBA8:
return PixelFormat::RGBA8;
case Pica::PixelFormat::RGB8:
return PixelFormat::RGB8;
case Pica::PixelFormat::RGB565:
return PixelFormat::RGB565;
case Pica::PixelFormat::RGB5A1:
return PixelFormat::RGB5A1;
case Pica::PixelFormat::RGBA4:
return PixelFormat::RGBA4;
default:
return PixelFormat::Invalid;
}
}
} // namespace VideoCore