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:
parent
0f49424022
commit
18a5e888bb
|
@ -94,11 +94,15 @@ inline void Write(u32 addr, const T data) {
|
|||
int r, g, b, a;
|
||||
} 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) {
|
||||
case Regs::PixelFormat::RGBA8:
|
||||
{
|
||||
// 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.g = srcptr[1]; // green
|
||||
source_color.b = srcptr[2]; // red
|
||||
|
|
|
@ -157,6 +157,9 @@ struct Regs {
|
|||
BitField< 8, 3, PixelFormat> input_format;
|
||||
BitField<12, 3, PixelFormat> output_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);
|
||||
|
|
Reference in New Issue