GPU: Pseudo-implement horizontal scaling.

It's not really known how this actually works. Some testing has shown that this probably performs no filtering, and common usage in games suggests it's not actually resizing the image at all.
However, this patch does seem to fix some homebrew showing quasi-duplicated images while still keeping other applications in a working state.
This commit is contained in:
Tony Wasserka 2014-12-28 23:28:58 +01:00
parent 0f49424022
commit 18a5e888bb
2 changed files with 8 additions and 1 deletions

View file

@ -94,11 +94,15 @@ inline void Write(u32 addr, const T data) {
int r, g, b, a; int r, g, b, a;
} source_color = { 0, 0, 0, 0 }; } source_color = { 0, 0, 0, 0 };
// Cheap emulation of horizontal scaling: Just skip each second pixel of the
// input framebuffer. We keep track of this in the pixel_skip variable.
unsigned pixel_skip = (config.scale_horizontally != 0) ? 2 : 1;
switch (config.input_format) { switch (config.input_format) {
case Regs::PixelFormat::RGBA8: case Regs::PixelFormat::RGBA8:
{ {
// TODO: Most likely got the component order messed up. // TODO: Most likely got the component order messed up.
u8* srcptr = source_pointer + x * 4 + y * config.input_width * 4; u8* srcptr = source_pointer + x * 4 * pixel_skip + y * config.input_width * 4 * pixel_skip;
source_color.r = srcptr[0]; // blue source_color.r = srcptr[0]; // blue
source_color.g = srcptr[1]; // green source_color.g = srcptr[1]; // green
source_color.b = srcptr[2]; // red source_color.b = srcptr[2]; // red

View file

@ -157,6 +157,9 @@ struct Regs {
BitField< 8, 3, PixelFormat> input_format; BitField< 8, 3, PixelFormat> input_format;
BitField<12, 3, PixelFormat> output_format; BitField<12, 3, PixelFormat> output_format;
BitField<16, 1, u32> output_tiled; // stores output in a tiled format BitField<16, 1, u32> output_tiled; // stores output in a tiled format
// TODO: Not really sure if this actually scales, or even resizes at all.
BitField<24, 1, u32> scale_horizontally;
}; };
INSERT_PADDING_WORDS(0x1); INSERT_PADDING_WORDS(0x1);