mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-12-23 08:50:57 +01:00
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
2 changed files with 8 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue