libretro / parallel-n64

Optimized/rewritten Nintendo 64 emulator made specifically for Libretro. Originally based on Mupen64 Plus.
328 stars 128 forks source link

Numerous games display two screens (one on top of the other) #458

Open KristopherTadlock opened 7 years ago

KristopherTadlock commented 7 years ago

Banjo Kazooie Banjo Tooie Turok 2 And many others have this issue.

Using vulkan driver, with parrallel graphics plugin, HLE RSP plugin. I have tried every combination of graphics and HLE/cxd4 and I haven't found anything that fixes the issue. I have also tried lowering the graphics accuracy and disabling sychronous RDP, using pure intpreter/cached interpreter/dynamic recompiler for the CPU core, and disabling and enabling buffer swap.

This issue is not present when parallel 64 is run with the openGL driver (although there are other, different rendering errors depending on the game).

Retroarch 1.6.4 Windows 10 64 (with anniversary updated applied) GTX 1080 24GB memory intel i7700k CPU conker s bad fur day usa -170810-223158 indiana jones and the infernal machine usa -170810-223400 resident evil 2 usa rev a -170810-223510 star wars - rogue squadron usa -170810-223618 turok 2 - seeds of evil usa -170810-223653 banjo-kazooie-170810-223039 banjo-tooie usa -170810-223124

ParaLLEl N64.zip

KristopherTadlock commented 7 years ago

To clarify, Angrylion with cxd4 works perfectly in almost all cases, except for the poor performance ofc. No other combination of plugins do work with this core in vulkan.

hizzlekizzle commented 7 years ago

I believe that's what happens when games use interlaced mode. That should be a relatively easy fix, though, whenever someone starts working on it.

inactive123 commented 7 years ago

The VI handling is very prematurely implemented right now - TinyTiger didn't really know how to properly convert this from software to hardware.

See this -

https://github.com/libretro/parallel-n64/blob/master/mupen64plus-video-paraLLEl/vi.cpp#L85

We could really use the help of guys like @LegendOfDragoon here.

inactive123 commented 7 years ago

Also, the glitch you see here in the distance on the ground -

image

this is mipmapping not being properly implemented in Parallel right now. You can see this in various other games right now. Mipmapping and VI handling are the two biggest omissions right now and I think if we had them fixed, the renderer could be close to perfect. Unfortunately TinyTiger is no longer active, so we will have to find some other willing and able devs in order to rectify this.

inactive123 commented 7 years ago

I think we might be wanting to incentivize fixing this and some of the other remaining issues with Parallel RDP by turning it into a bounty.

LegendOfDragoon commented 7 years ago

Perhaps I can take a look, once I'm able to compile this emulator.

inactive123 commented 7 years ago

OK, I'm starting to make progress now in fixing some of these things. I have a solution ready already for Banjo Kazooie, Banjo Tooie, Resident Evil 2 and Turok 2 at least.

Unfortunately, this will require some per-game hacks.

' // Unfortunately, the N64 RDP doesn't need to know the framebuffer // height since it's implied by the scissor box. // It only renders scanlines. // We will need to estimate the real height and potentially flush out // everything if we guess wrong. // Just employ some crappy heuristic to make this sort of work. ' To the people in this thread, can you go through more games to see which ones are afflicted by this bug? That way, I can go over each game and get the values just right.

KristopherTadlock commented 7 years ago

I downloaded the newest updated released on 8/25 and there are some improvements.

Turok 2 is fantastic. I have tried every plugin I can find, and this is the only one that renders dynamic lighting and the blood effects correctly. The pause menu has a transparent layer of black pixels on the bottom that shouldn't be there, and there is occasionally some stuff there that looks like it would be fixed with overscan, but it is almost 100% flawless.

Turok Rage Wars is also fixed. The game setup menus have something going on at the edges, but in game looks pretty much perfect.

Turok 3 also works now. It also has some garbage pixels on the left side, which are present in gameplay.

Rampage 2 is basically perfect now.

Rampage 1 has some minor 2d alignment issues in the background when scrolling but is otherwise perfect.

Banjo Kazooie and Banjo Tooie are better now, but they both have mipmapping issues.

Indiana Jones is fixed, but has texture mapping issues.

Rayman 2 is pretty close to perfect now.

South Park is pretty much perfect.

Mishcief makers has some minor issues but is better.

Mortal Kombat 4 is perfect.

Excite bike 64 is perfect.

There were some games overlooked though, and some of them aren't quite right yet.

Star wars rogue squadron looks better in the menus, but when you start the first mission the sky and the ground are rendered incorrectly. Flying to high causes the x wing fighter to be obscured, and the opening cutscene is off.

Rainbow Six has the same interlacing problem, but I don't think it was mentioned before.

Conker's Bad Furday was fixed for me. This game does have some pretty severe texture mapping that make it unplayable.

Redident Evil 2 is in more or less the same state as before. The game windows is letterboxed and moved to the top of the screen. There are lots of garbage pixels below it, the opening cutscene wouldn't play, and their are some mipmapping issues as well.

inactive123 commented 7 years ago

Regarding Resident Evil 2 - the way I fixed these issues you mentioned in those other games is still pretty much a very dirty, nasty hack. The entire problem is that low-level RDP has no need of knowing the 'height' of the image - it just has to care about knowing how many scanlines are to be rendered, so the only information you have is the width. With hardware graphics APIs like Vulkan/GL, you don't deal in scanlines, but in framebuffer images, and you need a width/height. Deriving the correct height from the known width here is the problem.

If I wanted to fix Resident Evil 2 with the method I used for those other games, I'd really have to make a big mess out of things, since the game does some unique things as far as resolution is concerned. When using an Expansion Pak, the resolution could be different at each scene depending on how many enemies are onscreen and also the prerendered background in question.

So we really need some better heuristics for VI handling; the problem is, the method Gonetz described where you just ensure you have a big enough backbuffer image; that doesn't seem to me quite practical for Parallel N64 since compute is quite expensive already even for 320x240 images, so we require a way to do it without incurring a big performance hit.

inactive123 commented 7 years ago

Regarding Rogue Squadron - I see a pattern with that game and the following other games -

NASCAR 2000 - Road Rash 64 - maybe they used some kind of framebuffer fogging method which isn't being correctly handled in Parallel RDP right now, which results in half of the screen being cut off/obscured? Maybe incomplete alpha depth compare.

inactive123 commented 7 years ago

The strip of garbage at the left that you see in games like Turok 2 / Banjo is probably garbage that is normally not visible onscreen due to overscan; but I am almost certain it's down to incorrect VI output handling. Maybe the scissor normally would strip that away, which would come back to incorrect VI output handling right now. You don't see it with Angrylion, the reference software renderer that was used in the making of this renderer. So it should still be eventually fixed.