aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
authorGravatar archshift <admin@archshift.com>2015-02-26 19:11:39 -0800
committerGravatar archshift <admin@archshift.com>2015-02-27 19:15:08 -0800
commit7f9ee69a2bc769042433dba3970137b7be9afa03 (patch)
tree096b6debc487a7a87037808130484fe763bb4f6e /src/video_core/rasterizer.cpp
parentc9ef377afaa038797de6c08da9f204acf67ed1fc (diff)
Added RGBA5551 compatibility in the rasterizer
This allows Virtual Console games to display properly.
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r--src/video_core/rasterizer.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index a7bb0612..8c370781 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -51,6 +51,16 @@ static void DrawPixel(int x, int y, const Math::Vec4<u8>& color) {
break;
}
+ case registers.framebuffer.RGBA5551:
+ {
+ u16_le* pixel = (u16_le*)(color_buffer + dst_offset);
+ *pixel = (Color::Convert8To5(color.r()) << 11) |
+ (Color::Convert8To5(color.g()) << 6) |
+ (Color::Convert8To5(color.b()) << 1) |
+ Color::Convert8To1(color.a());
+ break;
+ }
+
default:
LOG_CRITICAL(Render_Software, "Unknown framebuffer color format %x", registers.framebuffer.color_format.Value());
UNIMPLEMENTED();
@@ -66,11 +76,11 @@ static const Math::Vec4<u8> GetPixel(int x, int y) {
const u32 coarse_y = y & ~7;
u32 bytes_per_pixel = GPU::Regs::BytesPerPixel(GPU::Regs::PixelFormat(registers.framebuffer.color_format.Value()));
u32 src_offset = VideoCore::GetMortonOffset(x, y, bytes_per_pixel) + coarse_y * registers.framebuffer.width * bytes_per_pixel;
+ Math::Vec4<u8> ret;
switch (registers.framebuffer.color_format) {
case registers.framebuffer.RGBA8:
{
- Math::Vec4<u8> ret;
u8* pixel = color_buffer + src_offset;
ret.r() = pixel[3];
ret.g() = pixel[2];
@@ -81,7 +91,6 @@ static const Math::Vec4<u8> GetPixel(int x, int y) {
case registers.framebuffer.RGBA4:
{
- Math::Vec4<u8> ret;
u8* pixel = color_buffer + src_offset;
ret.r() = Color::Convert4To8(pixel[1] >> 4);
ret.g() = Color::Convert4To8(pixel[1] & 0x0F);
@@ -90,6 +99,16 @@ static const Math::Vec4<u8> GetPixel(int x, int y) {
return ret;
}
+ case registers.framebuffer.RGBA5551:
+ {
+ u16_le pixel = *(u16_le*)(color_buffer + src_offset);
+ ret.r() = Color::Convert5To8((pixel >> 11) & 0x1F);
+ ret.g() = Color::Convert5To8((pixel >> 6) & 0x1F);
+ ret.b() = Color::Convert5To8((pixel >> 1) & 0x1F);
+ ret.a() = Color::Convert1To8(pixel & 0x1);
+ return ret;
+ }
+
default:
LOG_CRITICAL(Render_Software, "Unknown framebuffer color format %x", registers.framebuffer.color_format.Value());
UNIMPLEMENTED();