From aaf30ca4ee7cb539722a2928a578a579641987a1 Mon Sep 17 00:00:00 2001
From: Tony Wasserka <NeoBrainX@gmail.com>
Date: Fri, 2 Jan 2015 15:26:50 +0100
Subject: [PATCH] Pica/OutputMerger: Implement color format checking.

---
 src/video_core/pica.h         |  2 +-
 src/video_core/rasterizer.cpp | 15 ++++++++++++---
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index cf9dc4853..effa61571 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -421,7 +421,7 @@ struct Regs {
         INSERT_PADDING_WORDS(0x6);
 
         u32 depth_format;
-        u32 color_format;
+        BitField<16, 3, u32> color_format;
 
         INSERT_PADDING_WORDS(0x4);
 
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 168a2ada0..27eeb531d 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -20,10 +20,19 @@ namespace Rasterizer {
 static void DrawPixel(int x, int y, const Math::Vec4<u8>& color) {
     const PAddr addr = registers.framebuffer.GetColorBufferPhysicalAddress();
     u32* color_buffer = reinterpret_cast<u32*>(Memory::GetPointer(PAddrToVAddr(addr)));
-    u32 value = (color.a() << 24) | (color.r() << 16) | (color.g() << 8) | color.b();
 
-    // Assuming RGBA8 format until actual framebuffer format handling is implemented
-    *(color_buffer + x + y * registers.framebuffer.GetWidth()) = value;
+    switch (registers.framebuffer.color_format) {
+    case registers.framebuffer.RGBA8:
+    {
+        u32 value = (color.a() << 24) | (color.r() << 16) | (color.g() << 8) | color.b();
+        *(color_buffer + x + y * registers.framebuffer.GetWidth()) = value;
+        break;
+    }
+
+    default:
+        LOG_CRITICAL(Render_Software, "Unknown framebuffer color format %x", registers.framebuffer.color_format);
+        exit(1);
+    }
 }
 
 static const Math::Vec4<u8> GetPixel(int x, int y) {