summaryrefslogtreecommitdiffstats
path: root/src/core/hw/gpu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hw/gpu.cpp')
-rw-r--r--src/core/hw/gpu.cpp66
1 files changed, 50 insertions, 16 deletions
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index bd7d92cd1..e6022d69f 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -19,6 +19,7 @@
#include "video_core/command_processor.h"
#include "video_core/video_core.h"
+#include <video_core/color.h>
namespace GPU {
@@ -132,12 +133,31 @@ inline void Write(u32 addr, const T data) {
switch (config.input_format) {
case Regs::PixelFormat::RGBA8:
{
- // TODO: Most likely got the component order messed up.
u8* srcptr = source_pointer + (x * pixel_skip + y * config.input_width) * 4;
- source_color.r = srcptr[0]; // blue
- source_color.g = srcptr[1]; // green
- source_color.b = srcptr[2]; // red
- source_color.a = srcptr[3]; // alpha
+ source_color.r = srcptr[3]; // red
+ source_color.g = srcptr[2]; // green
+ source_color.b = srcptr[1]; // blue
+ source_color.a = srcptr[0]; // alpha
+ break;
+ }
+
+ case Regs::PixelFormat::RGB5A1:
+ {
+ u16 srcval = *(u16*)(source_pointer + x * 4 * pixel_skip + y * config.input_width * 4 * pixel_skip);
+ source_color.r = Color::Convert5To8((srcval >> 11) & 0x1F); // red
+ source_color.g = Color::Convert5To8((srcval >> 6) & 0x1F); // green
+ source_color.b = Color::Convert5To8((srcval >> 1) & 0x1F); // blue
+ source_color.a = Color::Convert1To8(srcval & 0x1); // alpha
+ break;
+ }
+
+ case Regs::PixelFormat::RGBA4:
+ {
+ u16 srcval = *(u16*)(source_pointer + x * 4 * pixel_skip + y * config.input_width * 4 * pixel_skip);
+ source_color.r = Color::Convert4To8((srcval >> 12) & 0xF); // red
+ source_color.g = Color::Convert4To8((srcval >> 8) & 0xF); // green
+ source_color.b = Color::Convert4To8((srcval >> 4) & 0xF); // blue
+ source_color.a = Color::Convert4To8( srcval & 0xF); // alpha
break;
}
@@ -147,24 +167,38 @@ inline void Write(u32 addr, const T data) {
}
switch (config.output_format) {
- /*case Regs::PixelFormat::RGBA8:
+ case Regs::PixelFormat::RGBA8:
{
- // TODO: Untested
- u8* dstptr = (u32*)(dest_pointer + x * 4 + y * config.output_width * 4);
- dstptr[0] = source_color.r;
- dstptr[1] = source_color.g;
- dstptr[2] = source_color.b;
- dstptr[3] = source_color.a;
+ u8* dstptr = dest_pointer + (x * pixel_skip + y * config.output_width) * 4;
+ dstptr[3] = source_color.r;
+ dstptr[2] = source_color.g;
+ dstptr[1] = source_color.b;
+ dstptr[0] = source_color.a;
break;
- }*/
+ }
case Regs::PixelFormat::RGB8:
{
- // TODO: Most likely got the component order messed up.
u8* dstptr = dest_pointer + (x + y * output_width) * 3;
- dstptr[0] = source_color.r; // blue
+ dstptr[2] = source_color.r; // red
dstptr[1] = source_color.g; // green
- dstptr[2] = source_color.b; // red
+ dstptr[0] = source_color.b; // blue
+ break;
+ }
+
+ case Regs::PixelFormat::RGB5A1:
+ {
+ u16* dstptr = (u16*)(dest_pointer + x * 2 + y * config.output_width * 2);
+ *dstptr = ((source_color.r >> 3) << 11) | ((source_color.g >> 3) << 6)
+ | ((source_color.b >> 3) << 1) | ( source_color.a >> 7);
+ break;
+ }
+
+ case Regs::PixelFormat::RGBA4:
+ {
+ u16* dstptr = (u16*)(dest_pointer + x * 2 + y * config.output_width * 2);
+ *dstptr = ((source_color.r >> 4) << 12) | ((source_color.g >> 4) << 8)
+ | ((source_color.b >> 4) << 4) | ( source_color.a >> 4);
break;
}