[GH-ISSUE #3908] Evangelion Jo : Missing menu text #1595

Open
opened 2026-03-18 01:23:39 +03:00 by kerem · 50 comments
Owner

Originally created by @dbz400 on GitHub (Sep 24, 2013).
Original GitHub issue: https://github.com/hrydgard/ppsspp/issues/3908

Just for record. Looks like it is sceFont issue .

screen00027

HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65326, 09ffe710, 0, 0, 254, 30)
HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65332, 09ffe710, 0, 0, 254, 30)
HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65321, 09ffe710, 0, 0, 254, 30)
HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65326, 09ffe710, 0, 0, 254, 30)
HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65333, 09ffe710, 0, 0, 254, 30)
HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65317, 09ffe710, 0, 0, 254, 30)

Originally created by @dbz400 on GitHub (Sep 24, 2013). Original GitHub issue: https://github.com/hrydgard/ppsspp/issues/3908 Just for record. Looks like it is sceFont issue . ![screen00027](https://f.cloud.github.com/assets/3000282/1199536/68e64054-2512-11e3-9432-64ef1455f1d8.jpg) HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65326, 09ffe710, 0, 0, 254, 30) HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65332, 09ffe710, 0, 0, 254, 30) HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65321, 09ffe710, 0, 0, 254, 30) HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65326, 09ffe710, 0, 0, 254, 30) HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65333, 09ffe710, 0, 0, 254, 30) HLE\sceFont.cpp:877 sceFontGetCharGlyphImage_Clip(09f094dc, 65317, 09ffe710, 0, 0, 254, 30)
Author
Owner

@dbz400 commented on GitHub (Sep 24, 2013):

This is from real PSP .Looks like JPCSP also cannot render this text completely.

1

<!-- gh-comment-id:25002898 --> @dbz400 commented on GitHub (Sep 24, 2013): This is from real PSP .Looks like JPCSP also cannot render this text completely. ![1](https://f.cloud.github.com/assets/3000282/1200040/59bd2a74-251d-11e3-9a6d-7308e0d7b2c4.jpg)
Author
Owner

@unknownbrackets commented on GitHub (Nov 27, 2013):

Has this improved at all? There were some improvements to sceFont.

I wonder if it's similar to the Fieldrunners issue.

-[Unknown]

<!-- gh-comment-id:29367990 --> @unknownbrackets commented on GitHub (Nov 27, 2013): Has this improved at all? There were some improvements to sceFont. I wonder if it's similar to the Fieldrunners issue. -[Unknown]
Author
Owner

@dbz400 commented on GitHub (Nov 27, 2013):

Not yet improved unfornaturely.

<!-- gh-comment-id:29369006 --> @dbz400 commented on GitHub (Nov 27, 2013): Not yet improved unfornaturely.
Author
Owner

@dbz400 commented on GitHub (Dec 15, 2013):

1

<!-- gh-comment-id:30600935 --> @dbz400 commented on GitHub (Dec 15, 2013): ![1](https://f.cloud.github.com/assets/3000282/1750098/608f87a6-656a-11e3-9a79-806146a66ed8.jpg)
Author
Owner

@dbz400 commented on GitHub (Dec 15, 2013):

Softgpu bit better but still some garbages

screen00150

<!-- gh-comment-id:30601055 --> @dbz400 commented on GitHub (Dec 15, 2013): Softgpu bit better but still some garbages ![screen00150](https://f.cloud.github.com/assets/3000282/1750109/bff7dab2-656b-11e3-884f-dca5db37cc13.jpg)
Author
Owner

@hrydgard commented on GitHub (Dec 15, 2013):

The fact that you're getting some white garbage there probably means that sceFont is actually drawing text somewhere but we're not texture mapping it correctly. Maybe it's a vertical texture with a very small stride that we're mishandling somehow? Don't really have any better ideas...

<!-- gh-comment-id:30601293 --> @hrydgard commented on GitHub (Dec 15, 2013): The fact that you're getting some white garbage there probably means that sceFont is actually drawing text somewhere but we're not texture mapping it correctly. Maybe it's a vertical texture with a very small stride that we're mishandling somehow? Don't really have any better ideas...
Author
Owner

@unknownbrackets commented on GitHub (Jan 19, 2014):

How does the softgpu look these days?

-[Unknown]

<!-- gh-comment-id:32703999 --> @unknownbrackets commented on GitHub (Jan 19, 2014): How does the softgpu look these days? -[Unknown]
Author
Owner

@dbz400 commented on GitHub (Jan 19, 2014):

I tested using 0.9.6-474 , it renders all correct in softgpu

screen00138

<!-- gh-comment-id:32704347 --> @dbz400 commented on GitHub (Jan 19, 2014): I tested using 0.9.6-474 , it renders all correct in softgpu ![screen00138](https://f.cloud.github.com/assets/3000282/1949163/a0f40bbc-80ec-11e3-9a66-5a81bd504944.jpg)
Author
Owner

@dbz400 commented on GitHub (Jan 19, 2014):

Please ignore my previous post .Softgpu renders those text all correct now.

<!-- gh-comment-id:32704428 --> @dbz400 commented on GitHub (Jan 19, 2014): Please ignore my previous post .Softgpu renders those text all correct now.
Author
Owner

@unknownbrackets commented on GitHub (Jan 19, 2014):

Interesting. So I guess it's rendering the text from a temporary buffer or something?

-[Unknown]

<!-- gh-comment-id:32713246 --> @unknownbrackets commented on GitHub (Jan 19, 2014): Interesting. So I guess it's rendering the text from a temporary buffer or something? -[Unknown]
Author
Owner

@hrydgard commented on GitHub (Jan 19, 2014):

Okay, if it's correct in softgpu it's definitely not an sceFont bug at least...

<!-- gh-comment-id:32715709 --> @hrydgard commented on GitHub (Jan 19, 2014): Okay, if it's correct in softgpu it's definitely not an sceFont bug at least...
Author
Owner

@unknownbrackets commented on GitHub (Jun 9, 2014):

Does this look any better in the latest git build with simulate block transfers?

-[Unknown]

<!-- gh-comment-id:45455275 --> @unknownbrackets commented on GitHub (Jun 9, 2014): Does this look any better in the latest git build with simulate block transfers? -[Unknown]
Author
Owner

@dbz400 commented on GitHub (Jun 9, 2014):

It is the same as previously.

<!-- gh-comment-id:45455828 --> @dbz400 commented on GitHub (Jun 9, 2014): It is the same as previously.
Author
Owner

@unknownbrackets commented on GitHub (Jun 9, 2014):

Does it ever render the text into a temporary buffer? Maybe it's offset beyond max subarea...

Which FBOs are in the log under "Creating FBO"?

-[Unknown]

<!-- gh-comment-id:45456098 --> @unknownbrackets commented on GitHub (Jun 9, 2014): Does it ever render the text into a temporary buffer? Maybe it's offset beyond max subarea... Which FBOs are in the log under "Creating FBO"? -[Unknown]
Author
Owner

@ppmeis commented on GitHub (Jul 15, 2014):

Tested with latest build. Fonts are still missing:
image

If I load a savestate with softgpu fonts are gone too, but If I load the game in softgpu from the beginning, fonts appears but in wrong way (same word in all parts):
image

Other than that game looks fine ingame:
image
image
image

<!-- gh-comment-id:49019185 --> @ppmeis commented on GitHub (Jul 15, 2014): Tested with latest build. Fonts are still missing: ![image](https://cloud.githubusercontent.com/assets/4381277/3583933/5f078250-0c11-11e4-8c78-ab7163c4919d.png) If I load a savestate with softgpu fonts are gone too, but If I load the game in softgpu from the beginning, fonts appears but in wrong way (same word in all parts): ![image](https://cloud.githubusercontent.com/assets/4381277/3583964/b80c340e-0c11-11e4-850b-d89d77a8d8b3.png) Other than that game looks fine ingame: ![image](https://cloud.githubusercontent.com/assets/4381277/3583998/24942b40-0c12-11e4-977e-22eea91b970a.png) ![image](https://cloud.githubusercontent.com/assets/4381277/3584024/9e4ccd02-0c12-11e4-8b5e-4a38c03c76b1.png) ![image](https://cloud.githubusercontent.com/assets/4381277/3584030/afeb9886-0c12-11e4-8f66-c93191800422.png)
Author
Owner

@ppmeis commented on GitHub (Jul 15, 2014):

I notice in Frame Buffer to CPU/GPU looks like softgpu:
image

<!-- gh-comment-id:49019597 --> @ppmeis commented on GitHub (Jul 15, 2014): I notice in Frame Buffer to CPU/GPU looks like softgpu: ![image](https://cloud.githubusercontent.com/assets/4381277/3584089/8d419fdc-0c13-11e4-8163-85c21f1238a7.png)
Author
Owner

@unknownbrackets commented on GitHub (Jul 15, 2014):

Interesting. So that means we are probably missing some sort of render-to-texture effect here.

-[Unknown]

<!-- gh-comment-id:49036766 --> @unknownbrackets commented on GitHub (Jul 15, 2014): Interesting. So that means we are probably missing some sort of render-to-texture effect here. -[Unknown]
Author
Owner

@daniel229 commented on GitHub (Jan 28, 2016):

Still missing text
1

39:29:591 user_main    I[SCEGE]: Common\FramebufferCommon.cpp:412 Creating FBO for 001fe7c0 : 156 x 12 x 0
39:29:593 user_main    I[SCEGE]: Common\FramebufferCommon.cpp:412 Creating FBO for 001fcf00 : 156 x 12 x 0
39:29:594 user_main    I[SCEGE]: Common\FramebufferCommon.cpp:412 Creating FBO for 001fb640 : 156 x 12 x 0
39:29:607 idle0        I[SCEGE]: GLES\Framebuffer.cpp:1896 Decimating FBO for 001fe7c0 (156 x 12 x 0), age 6
39:29:608 idle0        I[SCEGE]: GLES\Framebuffer.cpp:1896 Decimating FBO for 001fcf00 (156 x 12 x 0), age 6
39:29:609 idle0        I[SCEGE]: GLES\Framebuffer.cpp:1896 Decimating FBO for 001fb640 (156 x 12 x 0), age 6

if I comment out these,it shows up,still not correct.

        /*if (vfb != displayFramebuf_ && vfb != prevDisplayFramebuf_ && vfb != prevPrevDisplayFramebuf_) {
            if (age > FBO_OLD_AGE) {
                INFO_LOG(SCEGE, "Decimating FBO for %08x (%i x %i x %i), age %i", vfb->fb_address, vfb->width, vfb->height, vfb->format, age);
                DestroyFramebuf(vfb);
                vfbs_.erase(vfbs_.begin() + i--);
            }
        }*/

2

GE debugger
3
https://gist.github.com/daniel229/58998ba723dc08834dac

<!-- gh-comment-id:175927568 --> @daniel229 commented on GitHub (Jan 28, 2016): Still missing text ![1](https://cloud.githubusercontent.com/assets/3481559/12633317/9e6513ea-c5ab-11e5-877f-83c87ef22f67.png) ``` 39:29:591 user_main I[SCEGE]: Common\FramebufferCommon.cpp:412 Creating FBO for 001fe7c0 : 156 x 12 x 0 39:29:593 user_main I[SCEGE]: Common\FramebufferCommon.cpp:412 Creating FBO for 001fcf00 : 156 x 12 x 0 39:29:594 user_main I[SCEGE]: Common\FramebufferCommon.cpp:412 Creating FBO for 001fb640 : 156 x 12 x 0 39:29:607 idle0 I[SCEGE]: GLES\Framebuffer.cpp:1896 Decimating FBO for 001fe7c0 (156 x 12 x 0), age 6 39:29:608 idle0 I[SCEGE]: GLES\Framebuffer.cpp:1896 Decimating FBO for 001fcf00 (156 x 12 x 0), age 6 39:29:609 idle0 I[SCEGE]: GLES\Framebuffer.cpp:1896 Decimating FBO for 001fb640 (156 x 12 x 0), age 6 ``` if I comment out these,it shows up,still not correct. ``` /*if (vfb != displayFramebuf_ && vfb != prevDisplayFramebuf_ && vfb != prevPrevDisplayFramebuf_) { if (age > FBO_OLD_AGE) { INFO_LOG(SCEGE, "Decimating FBO for %08x (%i x %i x %i), age %i", vfb->fb_address, vfb->width, vfb->height, vfb->format, age); DestroyFramebuf(vfb); vfbs_.erase(vfbs_.begin() + i--); } }*/ ``` ![2](https://cloud.githubusercontent.com/assets/3481559/12633318/a2534008-c5ab-11e5-8037-821130eb77af.png) GE debugger ![3](https://cloud.githubusercontent.com/assets/3481559/12633352/f76fc124-c5ab-11e5-9cf3-874e536e0084.png) https://gist.github.com/daniel229/58998ba723dc08834dac
Author
Owner

@daniel229 commented on GitHub (Jan 28, 2016):

Break on 0x041FE7C0,got this function.
https://cloud.githubusercontent.com/assets/3481559/12633684/920ae3b0-c5ae-11e5-8080-fa87a225b250.png

<!-- gh-comment-id:175932357 --> @daniel229 commented on GitHub (Jan 28, 2016): Break on 0x041FE7C0,got this function. https://cloud.githubusercontent.com/assets/3481559/12633684/920ae3b0-c5ae-11e5-8080-fa87a225b250.png
Author
Owner

@unknownbrackets commented on GitHub (Jan 28, 2016):

Interesting, this uses memcpy and memset. Do the changes in #8359 help?

-[Unknown]

<!-- gh-comment-id:175964703 --> @unknownbrackets commented on GitHub (Jan 28, 2016): Interesting, this uses memcpy and memset. Do the changes in #8359 help? -[Unknown]
Author
Owner

@daniel229 commented on GitHub (Jan 28, 2016):

No,it deosn't.

<!-- gh-comment-id:175990040 --> @daniel229 commented on GitHub (Jan 28, 2016): No,it deosn't.
Author
Owner

@daniel229 commented on GitHub (Jan 28, 2016):

Loading savestate from softgpu,look good.
5

<!-- gh-comment-id:176035934 --> @daniel229 commented on GitHub (Jan 28, 2016): Loading savestate from softgpu,look good. ![5](https://cloud.githubusercontent.com/assets/3481559/12638077/3c5856d8-c5d5-11e5-800b-d51f98618d19.png)
Author
Owner

@sum2012 commented on GitHub (Apr 10, 2016):

v1.2.2-288-g9a11cfb still missing text

<!-- gh-comment-id:208069733 --> @sum2012 commented on GitHub (Apr 10, 2016): v1.2.2-288-g9a11cfb still missing text
Author
Owner

@sum2012 commented on GitHub (Apr 10, 2016):

v1.2.2-288-g9a11cfb log:
https://gist.github.com/sum2012/42bfe40c7e65645bdf715521fd751d04

Maybe we need imp SysMemUserForUser_D8DE5C1E() ?

<!-- gh-comment-id:208070581 --> @sum2012 commented on GitHub (Apr 10, 2016): v1.2.2-288-g9a11cfb log: https://gist.github.com/sum2012/42bfe40c7e65645bdf715521fd751d04 Maybe we need imp SysMemUserForUser_D8DE5C1E() ?
Author
Owner

@unknownbrackets commented on GitHub (Apr 10, 2016):

Perhaps. It seems that our implementation was from Jpcsp, and they both just return 0. It still doesn't work in Jpcsp, right?

Given it's in sysmem, maybe SysMemUserForUser_D8DE5C1E is an allocation function. Can you change:

ERROR_LOG(SCEKERNEL,"UNIMPL SysMemUserForUser_D8DE5C1E()");

To:

ERROR_LOG(SCEKERNEL,"UNIMPL SysMemUserForUser_D8DE5C1E(%08x, %08x, %08x, %08x, %08x, %08x)", PARAM(0), PARAM(1), PARAM(2), PARAM(3), PARAM(4), PARAM(5));

Wondering what params it uses.

According to Google, some people claim this function is sceKernelSafetyCheck0. If so, maybe it's unlikely it would impact functionality... not sure what it does or is meant to do.

Is it possible to log that func via JpcspTrace?

-[Unknown]

<!-- gh-comment-id:208073134 --> @unknownbrackets commented on GitHub (Apr 10, 2016): Perhaps. It seems that our implementation was from Jpcsp, and they both just return 0. It still doesn't work in Jpcsp, right? Given it's in sysmem, maybe SysMemUserForUser_D8DE5C1E is an allocation function. Can you change: ``` c++ ERROR_LOG(SCEKERNEL,"UNIMPL SysMemUserForUser_D8DE5C1E()"); ``` To: ``` c++ ERROR_LOG(SCEKERNEL,"UNIMPL SysMemUserForUser_D8DE5C1E(%08x, %08x, %08x, %08x, %08x, %08x)", PARAM(0), PARAM(1), PARAM(2), PARAM(3), PARAM(4), PARAM(5)); ``` Wondering what params it uses. According to Google, some people claim this function is `sceKernelSafetyCheck0`. If so, maybe it's unlikely it would impact functionality... not sure what it does or is meant to do. Is it possible to log that func via JpcspTrace? -[Unknown]
Author
Owner

@sum2012 commented on GitHub (Apr 10, 2016):

Modify ppsspp log:
https://gist.github.com/sum2012/01991fc9a5a79d6e654af86f58034401

edit: update JPCSPTrace log:
https://gist.github.com/sum2012/207d04e4271a7a2bfff74801d9852445

JPCSP render wrong font
1

<!-- gh-comment-id:208078473 --> @sum2012 commented on GitHub (Apr 10, 2016): Modify ppsspp log: https://gist.github.com/sum2012/01991fc9a5a79d6e654af86f58034401 edit: update JPCSPTrace log: https://gist.github.com/sum2012/207d04e4271a7a2bfff74801d9852445 JPCSP render wrong font ![1](https://cloud.githubusercontent.com/assets/2177532/14413230/336347d0-ffa6-11e5-833f-1d07e32e35d7.jpg)
Author
Owner

@unknownbrackets commented on GitHub (Apr 10, 2016):

Oh, sorry, just read the history again - this is definitely render-to-texture related somehow, and probably also impacted by expiring FBOs too early. Hmm.

-[Unknown]

<!-- gh-comment-id:208080992 --> @unknownbrackets commented on GitHub (Apr 10, 2016): Oh, sorry, just read the history again - this is definitely render-to-texture related somehow, and probably also impacted by expiring FBOs too early. Hmm. -[Unknown]
Author
Owner

@unknownbrackets commented on GitHub (May 14, 2017):

Apparently the JPCSP issue is a flushing issue (which we probably also would share, if we were even rendering properly.)

It renders the labels to a temporary texture, and sets a stall address. It then updates the source texture it's using to render the labels, and switches to the next render target for the next label.

The problem is, when drawing is deferred until state change, the game changing texture RAM doesn't cause flushing. So it draws the next text (with confused UVs) to the target. That's why "OPTION" and "OPTION" twice above, and "CONTINUE" looks funky (since it wants to write "NEW GAME".)

-[Unknown]

<!-- gh-comment-id:301348146 --> @unknownbrackets commented on GitHub (May 14, 2017): Apparently the JPCSP issue is a flushing issue (which we probably also would share, if we were even rendering properly.) It renders the labels to a temporary texture, and sets a stall address. It then updates the source texture it's using to render the labels, and switches to the next render target for the next label. The problem is, when drawing is deferred until state change, the game changing texture RAM doesn't cause flushing. So it draws the next text (with confused UVs) to the target. That's why "OPTION" and "OPTION" twice above, and "CONTINUE" looks funky (since it wants to write "NEW GAME".) -[Unknown]
Author
Owner

@hrydgard commented on GitHub (May 15, 2017):

Ugh, that's such a terrible misuse of hardware :) Ruins parallelism between the CPU and GPU.

So to fix this, we simply need to flush our collected vertices on every stall. Pretty sure that will slow down some games (especially games with large textures, causing more hashing work), though the really high-demanding games usually are smarter than stalling that often so hopefully wouldn't be affected too badly.

Maybe a compat bool....

<!-- gh-comment-id:301390567 --> @hrydgard commented on GitHub (May 15, 2017): Ugh, that's such a terrible misuse of hardware :) Ruins parallelism between the CPU and GPU. So to fix this, we simply need to flush our collected vertices on every stall. Pretty sure that will slow down some games (especially games with large textures, causing more hashing work), though the really high-demanding games usually are smarter than stalling that often so hopefully wouldn't be affected too badly. Maybe a compat bool....
Author
Owner

@LunaMoo commented on GitHub (May 15, 2017):

Tested that a bit and unfortunately flushing in UpdateStall didn't helped much since nothing shows unless Read framebuffers to memory is used or another frame download hack get's added(with different address per each menu option and some menus have lots more options, largest menu I saw had like 10 positions with fb_address starting from 0x001F3A80, up to 0x001FE7C0).

Using just a new frame download hack it would look alike jpcsp:
evangelionjo0
with addition of flush on UpdateStall, while better, it's still messed up:
evangelionjo1

The messup is also slightly different for different menu's like here seen right after loading game:
evangelionjo2
which should look like:
evangelionjo3

Last field as can be seen always ends up outdated ~ taken from previous menu / or empty in case it's first menu. Leaving and re-entering makes that field show correctly since previous menu is then same as current.

Evil game.:]

<!-- gh-comment-id:301546581 --> @LunaMoo commented on GitHub (May 15, 2017): Tested that a bit and unfortunately flushing in UpdateStall didn't helped much since nothing shows unless Read framebuffers to memory is used or another frame download hack get's added(with different address per each menu option and some menus have lots more options, largest menu I saw had like 10 positions with fb_address starting from 0x001F3A80, up to 0x001FE7C0). Using just a new frame download hack it would look alike jpcsp: ![evangelionjo0](https://cloud.githubusercontent.com/assets/5485237/26070482/252142c8-39a5-11e7-93ec-1ec8b2c0eda8.jpg) with addition of flush on UpdateStall, while better, it's still messed up: ![evangelionjo1](https://cloud.githubusercontent.com/assets/5485237/26070296/67abc04c-39a4-11e7-9332-097464c3e79f.jpg) The messup is also slightly different for different menu's like here seen right after loading game: ![evangelionjo2](https://cloud.githubusercontent.com/assets/5485237/26070302/6f1132d6-39a4-11e7-9bab-8d9747d6a8ef.jpg) which should look like: ![evangelionjo3](https://cloud.githubusercontent.com/assets/5485237/26070307/74969d7c-39a4-11e7-8d59-73e84557df3c.jpg) Last field as can be seen always ends up outdated ~ taken from previous menu / or empty in case it's first menu. Leaving and re-entering makes that field show correctly since previous menu is then same as current. Evil game.:]
Author
Owner

@unknownbrackets commented on GitHub (May 17, 2017):

Hm. I don't think UpdateStall is the right place.

Basically the "stall" process works like this (on a real PSP):

  1. Game writes code to render some, and enqueues a list starting at A with a stall at B.
  2. The GPU starts running - meanwhile, the CPU keeps going.
  3. Game writes more code after the stall position B until C, and maybe even updates texture data if it thinks the draw "probably finished by now".
  4. Game issues UpdateStall for C - if the GPU reached B, this unpauses it. Either way, the new stall is C.

So flushing at UpdateStall is too late - that's when the game has already written the new data. Flushing needs to be done when PPSSPP hits the stall and pauses.

Note: PPSSPP (without multithreading) pauses the CPU until rendering is done (i.e. it's never possible to catch it before it hits B.) With multithreading, it does more like the above - but the timing is not consistent, and doesn't at all match a real PSP.

-[Unknown]

<!-- gh-comment-id:301972689 --> @unknownbrackets commented on GitHub (May 17, 2017): Hm. I don't think UpdateStall is the right place. Basically the "stall" process works like this (on a real PSP): 1. Game writes code to render some, and enqueues a list starting at A with a stall at B. 2. The GPU starts running - meanwhile, the CPU keeps going. 3. Game writes more code after the stall position B until C, and maybe even updates texture data if it thinks the draw "probably finished by now". 4. Game issues UpdateStall for C - if the GPU reached B, this unpauses it. Either way, the new stall is C. So flushing at UpdateStall is too late - that's when the game has already written the new data. Flushing needs to be done when PPSSPP hits the stall and pauses. Note: PPSSPP (without multithreading) pauses the CPU until rendering is done (i.e. it's never possible to catch it before it hits B.) With multithreading, it does more like the above - but the timing is not consistent, and doesn't at all match a real PSP. -[Unknown]
Author
Owner

@LunaMoo commented on GitHub (May 17, 2017):

Thanks for that explanation - I set it to flush earlier in InterpretList in place it sets GPUSTATE_STALL now and combined with force download hack most of the menu works completely fine:
evangelionjo4
However the last entry still has same problem, shows only outdated texture from previous menu:]. Might be a different problem?

Edit: Seems that force download hack I made based on the previous one is not enough, or missing some address, since it does show with read to memory. ~ going to investigate further.
Edit2: Must be the address as removing the fb_address check from the hack makes it work, however I had the addresses for all those textures, hmm maybe it's missing for those "temporary textures".

Was able to make the last entry work adding 0x0 address to force download hack:

vfb->fb_address == 0x00000000 || (vfb->fb_address >= 0x001F3A80 && vfb->fb_address <= 0x001FE7C0)

the range includes 10 different entries, so if any menu has more(I couldn't find such) it might still be missing, but those are always same in all menus, so it seems safe. With added fb_address 0 however, it's used for everything and will have same problems as read to memory, in fact it caused artifacts and crashed in-game while I was testing it, so that's just bad:|. Heh, gotta find a different way.

Edit3:
Increasing FBO_OLD_AGE helps as well for the last entry, but I had to change it to around 20 from initial 5 and doing so breaks the whole list again if I cycle through whole menu going up or down since then it apparently needs to decimate quicker than when entering or leaving/re-entering menu, unless it then needs to redownload again and not doing it?:] Don't have any more ideas for now.

<!-- gh-comment-id:301998210 --> @LunaMoo commented on GitHub (May 17, 2017): Thanks for that explanation - I set it to flush earlier in InterpretList in place it sets GPUSTATE_STALL now and combined with force download hack most of the menu works completely fine: ![evangelionjo4](https://cloud.githubusercontent.com/assets/5485237/26141164/c6b67c8a-3ada-11e7-8253-fc8c8be34f41.jpg) However the last entry still has same problem, shows only outdated texture from previous menu:]. Might be a different problem? Edit: Seems that force download hack I made based on the previous one is not enough, or missing some address, since it does show with read to memory. ~ going to investigate further. Edit2: Must be the address as removing the fb_address check from the hack makes it work, however I had the addresses for all those textures, hmm maybe it's missing for those "temporary textures". Was able to make the last entry work adding 0x0 address to force download hack: ``` vfb->fb_address == 0x00000000 || (vfb->fb_address >= 0x001F3A80 && vfb->fb_address <= 0x001FE7C0) ``` the range includes 10 different entries, so if any menu has more(I couldn't find such) it might still be missing, but those are always same in all menus, so it seems safe. With added fb_address 0 however, it's used for everything and will have same problems as read to memory, in fact it caused artifacts and crashed in-game while I was testing it, so that's just bad:|. Heh, gotta find a different way. Edit3: Increasing FBO_OLD_AGE helps as well for the last entry, but I had to change it to around 20 from initial 5 and doing so breaks the whole list again if I cycle through whole menu going up or down since then it apparently needs to decimate quicker than when entering or leaving/re-entering menu, unless it then needs to redownload again and not doing it?:] Don't have any more ideas for now.
Author
Owner

@unknownbrackets commented on GitHub (Aug 25, 2018):

Do either #11322 or #11323 help? It seems like they may from some data I saw, but not sure if it still requires an increased old age.

If it does, a few ideas:

  • Is there a way to detect that this game is using a safe size?
  • Perhaps we extend the life of small FBOs (a log tells me they are 12 pixels tall), since they are less likely to overlap with later RAM usage? But this is still risky...
  • Are there any CPU instructions messing with this VRAM?

-[Unknown]

<!-- gh-comment-id:415983520 --> @unknownbrackets commented on GitHub (Aug 25, 2018): Do either #11322 or #11323 help? It seems like they may from some data I saw, but not sure if it still requires an increased old age. If it does, a few ideas: * Is there a way to detect that this game is using a safe size? * Perhaps we extend the life of small FBOs (a log tells me they are 12 pixels tall), since they are less likely to overlap with later RAM usage? But this is still risky... * Are there any CPU instructions messing with this VRAM? -[Unknown]
Author
Owner

@sum2012 commented on GitHub (Sep 2, 2018):

v1.6.3-404-ga004196d4 still show no font
https://gist.github.com/sum2012/1af1d0d4d1137a5e589eaba945737e71

<!-- gh-comment-id:417898299 --> @sum2012 commented on GitHub (Sep 2, 2018): v1.6.3-404-ga004196d4 still show no font https://gist.github.com/sum2012/1af1d0d4d1137a5e589eaba945737e71
Author
Owner

@benderscruffy01 commented on GitHub (Mar 29, 2019):

v1.8.0-42-g62928e13d
still the same problem
DUMP.ZIP

<!-- gh-comment-id:477899239 --> @benderscruffy01 commented on GitHub (Mar 29, 2019): v1.8.0-42-g62928e13d still the same problem [DUMP.ZIP](https://github.com/hrydgard/ppsspp/files/3021545/DUMP.ZIP)
Author
Owner

@unknownbrackets commented on GitHub (Jul 7, 2019):

I wonder is this has the same issue as #10967 seems to, as noted above (in the JPCSP bug discussion.)

-[Unknown]

<!-- gh-comment-id:509029091 --> @unknownbrackets commented on GitHub (Jul 7, 2019): I wonder is this has the same issue as #10967 seems to, as noted above (in the JPCSP bug discussion.) -[Unknown]
Author
Owner

@ghost commented on GitHub (Jun 4, 2020):

Using ppsspp latest git build.
Both HW and SW rendering suffer the issue.
Screenshot_20200604-171055
Screenshot_20200604-171106

<!-- gh-comment-id:638724433 --> @ghost commented on GitHub (Jun 4, 2020): Using ppsspp latest git build. Both HW and SW rendering suffer the issue. ![Screenshot_20200604-171055](https://user-images.githubusercontent.com/37603562/83738152-8119c680-a686-11ea-9ead-84a704e31a07.png) ![Screenshot_20200604-171106](https://user-images.githubusercontent.com/37603562/83738163-837c2080-a686-11ea-8655-232d08b24e06.png)
Author
Owner

@nassau-tk commented on GitHub (Dec 9, 2020):

v1.10.3-1308 "Buffere Rendering & Simulate Blocktransfer ON"
OPTION's "O" appeared.
image

v1.10.3-1308 "NonBuffere Rendering & Simulate Blocktransfer ON"
"O" is missing...
image

ULJS00201_0001.zip

<!-- gh-comment-id:741772020 --> @nassau-tk commented on GitHub (Dec 9, 2020): v1.10.3-1308 "Buffere Rendering & Simulate Blocktransfer ON" OPTION's "O" appeared. ![image](https://user-images.githubusercontent.com/48179091/101635198-f8cd1180-3a6c-11eb-9862-dc65c73e8e30.png) v1.10.3-1308 "NonBuffere Rendering & Simulate Blocktransfer ON" "O" is missing... ![image](https://user-images.githubusercontent.com/48179091/101635379-3cc01680-3a6d-11eb-8d1a-3fc2e7d95c6a.png) [ULJS00201_0001.zip](https://github.com/hrydgard/ppsspp/files/5666175/ULJS00201_0001.zip)
Author
Owner

@sum2012 commented on GitHub (Dec 20, 2020):

The font "O" is fix by github.com/hrydgard/ppsspp@f1a3ba7f56
hehe ,this is scefont issue !?
But I use real psp of jpn.pgf ,"O" disappear

<!-- gh-comment-id:748574615 --> @sum2012 commented on GitHub (Dec 20, 2020): The font "O" is fix by https://github.com/hrydgard/ppsspp/commit/f1a3ba7f5669204a964e4a49c0354d8ab64e6dbc hehe ,this is scefont issue !? But I use real psp of jpn.pgf ,"O" disappear
Author
Owner

@nassau-tk commented on GitHub (Dec 20, 2020):

@sum2012
Hahaha~!!😝

Yes,That's right.
PSP Original PGF font is missing any character kind of this loop menu.
But,Kind of other menu (fixed position) is maybe no problem both.
And,I don't have clearly conviction that this game uses PGF font.
If "l" or "g" appear on the menu then I can check about "Is it PGF or not?".

[ Loop menu ]
image
image

Notice : These appeared first character is not correctly.

[ Fix position menu ]
image

<!-- gh-comment-id:748586078 --> @nassau-tk commented on GitHub (Dec 20, 2020): @sum2012 Hahaha~!!:stuck_out_tongue_closed_eyes: Yes,That's right. PSP Original PGF font is missing any character kind of this loop menu. But,Kind of other menu (fixed position) is maybe no problem both. And,I don't have clearly conviction that this game uses PGF font. If "l" or "g" appear on the menu then I can check about "Is it PGF or not?". [ Loop menu ] ![image](https://user-images.githubusercontent.com/48179091/102709337-0bf1a400-42ed-11eb-81d0-cd8a503e123f.png) ![image](https://user-images.githubusercontent.com/48179091/102709511-a3a3c200-42ee-11eb-94bb-7d2db4ebeb05.png) Notice : These appeared first character is not correctly. [ Fix position menu ] ![image](https://user-images.githubusercontent.com/48179091/102709423-dac5a380-42ed-11eb-8c03-a07dee134c1d.png)
Author
Owner

@sum2012 commented on GitHub (Feb 14, 2021):

Small finding.If I disable black list "sceFont_Library" and "SceFont_Library",
32:28:756 user_main I[LOADER]: HLE\sceKernelModule.cpp:1332 Module sceFont_Library: 09ef7de0 09eef594 09eef5c0
32:28:756 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,0cae832b) unresolved in 'sceFont_Library', storing for later resolving
32:28:756 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,1d8a762e) unresolved in 'sceFont_Library', storing for later resolving
32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,28a8e98a) unresolved in 'sceFont_Library', storing for later resolving
32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,92e41280) unresolved in 'sceFont_Library', storing for later resolving
32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,d4475aa8) unresolved in 'sceFont_Library', storing for later resolving
32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,fa8a5739) unresolved in 'sceFont_Library', storing for later resolving
32:28:769 user_main I[LOADER]: HLE\sceKernelModule.cpp:1441 Exporting ent 0 named sceFont_Library, 0 funcs, 2 vars, resident 09eef644
32:28:769 user_main I[LOADER]: HLE\sceKernelModule.cpp:1441 Exporting ent 1 named sceLibFont, 28 funcs, 0 vars, resident 09eef660
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/02d7f94b, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/099ef33c, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/0da7535e, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/27f6e642, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/2f67356a, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/3aea8cb6, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/3c4b7e82, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/472694cd, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/48293280, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/48b06520, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/5333322d, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/568be516, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/574b6fbc, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/57fcb733, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/5c3e4a9e, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/5dcf6858, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/67f17ed7, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/681e61a7, already implemented in HLE.
32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/74b21701, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/980f4895, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/a834319d, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/aa3de7b5, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/bb8e7fe6, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/bc75d85b, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/ca1e6945, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/dcc80c2f, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/ee232411, already implemented in HLE.
32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/f8f0752e, already implemented in HLE.
32:28:770 user_main I[SCEMODULE]: HLE\sceKernelModule.cpp:2040 296=sceKernelLoadModule(name=disc0:/PSP_GAME/USRDIR/FONT/LIBFONT.PRX,flag=00000000,(...))

Which mean that it use custom scefont library

<!-- gh-comment-id:778758645 --> @sum2012 commented on GitHub (Feb 14, 2021): Small finding.If I disable black list "sceFont_Library" and "SceFont_Library", 32:28:756 user_main I[LOADER]: HLE\sceKernelModule.cpp:1332 Module sceFont_Library: 09ef7de0 09eef594 09eef5c0 32:28:756 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,0cae832b) unresolved in 'sceFont_Library', storing for later resolving 32:28:756 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,1d8a762e) unresolved in 'sceFont_Library', storing for later resolving 32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,28a8e98a) unresolved in 'sceFont_Library', storing for later resolving 32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,92e41280) unresolved in 'sceFont_Library', storing for later resolving 32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,d4475aa8) unresolved in 'sceFont_Library', storing for later resolving 32:28:757 user_main I[LOADER]: HLE\sceKernelModule.cpp:784 Function (sceReg,fa8a5739) unresolved in 'sceFont_Library', storing for later resolving 32:28:769 user_main I[LOADER]: HLE\sceKernelModule.cpp:1441 Exporting ent 0 named sceFont_Library, 0 funcs, 2 vars, resident 09eef644 32:28:769 user_main I[LOADER]: HLE\sceKernelModule.cpp:1441 Exporting ent 1 named sceLibFont, 28 funcs, 0 vars, resident 09eef660 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/02d7f94b, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/099ef33c, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/0da7535e, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/27f6e642, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/2f67356a, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/3aea8cb6, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/3c4b7e82, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/472694cd, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/48293280, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/48b06520, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/5333322d, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/568be516, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/574b6fbc, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/57fcb733, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/5c3e4a9e, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/5dcf6858, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/67f17ed7, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/681e61a7, already implemented in HLE. 32:28:769 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/74b21701, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/980f4895, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/a834319d, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/aa3de7b5, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/bb8e7fe6, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/bc75d85b, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/ca1e6945, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/dcc80c2f, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/ee232411, already implemented in HLE. 32:28:770 user_main W[LOADER]: HLE\sceKernelModule.cpp:795 Ignoring func export sceLibFont/f8f0752e, already implemented in HLE. 32:28:770 user_main I[SCEMODULE]: HLE\sceKernelModule.cpp:2040 296=sceKernelLoadModule(name=disc0:/PSP_GAME/USRDIR/FONT/LIBFONT.PRX,flag=00000000,(...)) Which mean that it use custom scefont library
Author
Owner

@unknownbrackets commented on GitHub (Aug 21, 2022):

The dump works okay on hardware too, which only confirms the previous findings. It also makes me think that the stall updating issue may be resolved now.

It sounds like there's just one issue remaining. My assumption is the game does this:

  1. Creates three temporary render surfaces.
  2. Draws "NEW GAME", "CONTINUE", and "OPTION" to these temporary surfaces using rendering.
  3. Waits a while, animating in the menu or something.
  4. Finally uses those pre-rendered surfaces as textures to draw the button text on the actual buttons.

In the software renderer, temporary surfaces are stored in RAM (just like on the PSP.) This means they're permanent (as long as the game is running), they're always updated by CPU activity, and they are never accidentally overwritten by unrelated rendering.

The hardware renderer, however, creates actual temporary surfaces on your GPU. They don't exist in RAM, and moreover... it's hard to tell what's safe to update in RAM. Some types of updates from the CPU don't update them, so if one isn't used for a while we start thinking it must be old and wrong (if we didn't do this, characters would be walking around with "NEW GAME" instead of faces, because we didn't notice it loading the face with the CPU.)

So - presumably - if we made temporary surfaces immortal (hello NEW GAME faces), it would "fix" this bug. That would support my assumptions above, but wouldn't truly be a way to fix this issue.

Another thing we tried to do was determine a "safe size" to update in RAM. For complex reasons, we don't even know what part of RAM was actually updated by drawing in the hardware renderers. If we blindly update RAM after rendering, it makes games crash because we delete important data. So we watch for signals for what RAM should be updated. It seems like this game isn't doing any of the things we normally watch for to figure that out.

The most helpful frame dump now would be a frame dump for when it actually draws the temporary surfaces. It's definitely before you see the "NEW GAME" on screen, but you would see if while stepping through the GE debugger. However, this would be hard to capture because by the time you see it in the GE debugger, you're already one frame too late to create a frame dump of it. It's only drawing those temporary surfaces once (if my assumptions are correct.)

Another, simpler thing that could be happening is that we could be misdetecting the texturing as coming from an offset into the wrong surface. Or it could be rendering these all together to a single temporary surface, but then texturing from offsets, and we could be missing that.

Just wanted to collect all the information about the issue here.

-[Unknown]

<!-- gh-comment-id:1221466313 --> @unknownbrackets commented on GitHub (Aug 21, 2022): The dump works okay on hardware too, which only confirms the previous findings. It also makes me think that the stall updating issue may be resolved now. It sounds like there's just one issue remaining. My assumption is the game does this: 1. Creates three temporary render surfaces. 2. Draws "NEW GAME", "CONTINUE", and "OPTION" to these temporary surfaces using rendering. 3. Waits a while, animating in the menu or something. 4. Finally uses those pre-rendered surfaces as textures to draw the button text on the actual buttons. In the software renderer, temporary surfaces are stored in RAM (just like on the PSP.) This means they're permanent (as long as the game is running), they're always updated by CPU activity, and they are never accidentally overwritten by unrelated rendering. The hardware renderer, however, creates actual temporary surfaces on your GPU. They don't exist in RAM, and moreover... it's hard to tell what's safe to update in RAM. Some types of updates from the CPU don't update them, so if one isn't used for a while we start thinking it must be old and wrong (if we didn't do this, characters would be walking around with "NEW GAME" instead of faces, because we didn't notice it loading the face with the CPU.) So - presumably - if we made temporary surfaces immortal (hello NEW GAME faces), it would "fix" this bug. That would support my assumptions above, but wouldn't truly be a way to fix this issue. Another thing we tried to do was determine a "safe size" to update in RAM. For complex reasons, we don't even know what part of RAM was actually updated by drawing in the hardware renderers. If we blindly update RAM after rendering, it makes games crash because we delete important data. So we watch for signals for what RAM should be updated. It seems like this game isn't doing any of the things we normally watch for to figure that out. The most helpful frame dump now would be a frame dump for when it actually draws the temporary surfaces. It's definitely before you see the "NEW GAME" on screen, but you would see if while stepping through the GE debugger. However, this would be hard to capture because by the time you see it in the GE debugger, you're already one frame too late to create a frame dump of it. It's only drawing those temporary surfaces once (if my assumptions are correct.) Another, simpler thing that could be happening is that we could be misdetecting the texturing as coming from an offset into the wrong surface. Or it could be rendering these all together to a single temporary surface, but then texturing from offsets, and we could be missing that. Just wanted to collect all the information about the issue here. -[Unknown]
Author
Owner

@IrfanH495 commented on GitHub (Feb 25, 2023):

I tried to bring up the missing text using textures but the result is that in any menu
1 New game
2 continue
Screenshot_20230225-083552_PPSSPP
Screenshot_20230225-083654_PPSSPP
Screenshot_20230225-083712_PPSSPP
Screenshot_20230225-083719_PPSSPP
Screenshot_20230225-083732_PPSSPP
did i make a mistake while making it texture

<!-- gh-comment-id:1444887427 --> @IrfanH495 commented on GitHub (Feb 25, 2023): I tried to bring up the missing text using textures but the result is that in any menu 1 New game 2 continue ![Screenshot_20230225-083552_PPSSPP](https://user-images.githubusercontent.com/78854859/221328970-ddaf9182-c0d3-4393-8d41-a8b2bd2646da.png) ![Screenshot_20230225-083654_PPSSPP](https://user-images.githubusercontent.com/78854859/221328973-0e55b7f8-f49a-4761-9486-e1204bf082d0.png) ![Screenshot_20230225-083712_PPSSPP](https://user-images.githubusercontent.com/78854859/221328974-1e9ab2d0-b27d-4562-b5a0-e9ac49beb49d.png) ![Screenshot_20230225-083719_PPSSPP](https://user-images.githubusercontent.com/78854859/221328976-5b5e5956-dd7b-481b-9935-373d4f29f605.png) ![Screenshot_20230225-083732_PPSSPP](https://user-images.githubusercontent.com/78854859/221328977-0bb37d49-358e-46d0-a49a-492d30a6937b.png) did i make a mistake while making it texture
Author
Owner

@nassau-tk commented on GitHub (Feb 25, 2023):

Probably, It will relate PGF issue too.
Because, Shape of "I" was make by me.

<!-- gh-comment-id:1445003520 --> @nassau-tk commented on GitHub (Feb 25, 2023): Probably, It will relate PGF issue too. Because, Shape of "I" was make by me.
Author
Owner

@IrfanH495 commented on GitHub (Feb 26, 2023):

2xpsp
vulkan
frame skipping 1

https://user-images.githubusercontent.com/78854859/221393888-87fc619d-6408-401d-a69a-1b68cd96c00d.mp4

the text appears but I can't save it as a texture.png

<!-- gh-comment-id:1445272318 --> @IrfanH495 commented on GitHub (Feb 26, 2023): 2xpsp vulkan frame skipping 1 https://user-images.githubusercontent.com/78854859/221393888-87fc619d-6408-401d-a69a-1b68cd96c00d.mp4 the text appears but I can't save it as a texture.png
Author
Owner

@unknownbrackets commented on GitHub (Feb 26, 2023):

Unfortunately, this game is doing something very "anti-frameskip", in that it's drawing some graphics only once and reusing them. Frameskip skips entire frames for speed, and if it skips one of these "key" frames where one-time drawing occurs, there will be problems.

Unfortunately, the game doesn't tell us whether the drawing is one time or not so we can't tell until after we've already skipped it...

As far as saving as a PNG, does it help to change the texture hash method in textures.ini?

-[Unknown]

<!-- gh-comment-id:1445272696 --> @unknownbrackets commented on GitHub (Feb 26, 2023): Unfortunately, this game is doing something very "anti-frameskip", in that it's drawing some graphics only once and reusing them. Frameskip skips entire frames for speed, and if it skips one of these "key" frames where one-time drawing occurs, there will be problems. Unfortunately, the game doesn't tell us whether the drawing is one time or not so we can't tell until after we've already skipped it... As far as saving as a PNG, does it help to change the texture hash method in textures.ini? -[Unknown]
Author
Owner

@IrfanH495 commented on GitHub (Feb 26, 2023):

I've tried it but still the texture doesn't appear
I've also tried installing textures taken from software rendering, but they don't appear.
texture from software rendering
continue texture software rendering
texture vulkan
continue
maybe I'm just too stupid,
I don't know how to make textures other than following the method on YouTube.

<!-- gh-comment-id:1445294754 --> @IrfanH495 commented on GitHub (Feb 26, 2023): I've tried it but still the texture doesn't appear I've also tried installing textures taken from software rendering, but they don't appear. texture from software rendering ![continue texture software rendering](https://user-images.githubusercontent.com/78854859/221399423-2966568a-61bf-4c94-9487-b57a28127df7.png) texture vulkan ![continue](https://user-images.githubusercontent.com/78854859/221399485-390d8db7-3790-48b9-a695-4d48ab0f906c.png) maybe I'm just too stupid, I don't know how to make textures other than following the method on YouTube.
Author
Owner

@unknownbrackets commented on GitHub (Feb 26, 2023):

Well, it's probably not a texture like that.

The game is drawing CONTINUE to a framebuffer and using that as a texture. You can't replace dynamically rendered framebuffers in texture packs. Instead, you'd need to replace whatever texture it initially uses when drawing CONTINUE. I assume that's something more like a grid of letters.

-[Unknown]

<!-- gh-comment-id:1445447889 --> @unknownbrackets commented on GitHub (Feb 26, 2023): Well, it's probably not a texture like that. The game is drawing CONTINUE to a framebuffer and using that as a texture. You can't replace dynamically rendered framebuffers in texture packs. Instead, you'd need to replace whatever texture it initially uses when drawing CONTINUE. I assume that's something more like a grid of letters. -[Unknown]
Author
Owner

@sum2012 commented on GitHub (Nov 3, 2025):

I ask AI, it answered "The issue was in the PSP font rendering system (Core/Font/PGF.cpp) where:

EVA fonts use very low alpha values (1-15 range) that become invisible during rendering
The original pixel enhancement logic didn't provide sufficient visibility boost for these fonts
Font pixels with very low alpha values were being written but remained practically invisible" but it doesn't give perfect solve ( I tested 16 times)
code change: github.com/hrydgard/ppsspp@fe104ded3f
Image

<!-- gh-comment-id:3481371456 --> @sum2012 commented on GitHub (Nov 3, 2025): I ask AI, it answered "The issue was in the PSP font rendering system (Core/Font/PGF.cpp) where: EVA fonts use very low alpha values (1-15 range) that become invisible during rendering The original pixel enhancement logic didn't provide sufficient visibility boost for these fonts Font pixels with very low alpha values were being written but remained practically invisible" but it doesn't give perfect solve ( I tested 16 times) code change: https://github.com/hrydgard/ppsspp/commit/fe104ded3f95f41eea284f90f4493c65b65b65c1 <img width="718" height="443" alt="Image" src="https://github.com/user-attachments/assets/d67b79c5-2133-4e10-a831-1b84eee5e9fa" />
Author
Owner

@sum2012 commented on GitHub (Nov 3, 2025):

Second try best, will test further before pull request
github.com/hrydgard/ppsspp@7b7567da67

<!-- gh-comment-id:3482870106 --> @sum2012 commented on GitHub (Nov 3, 2025): Second try best, will test further before pull request https://github.com/hrydgard/ppsspp/commit/7b7567da6733ea681f864d710e016eba7d40c63a
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/ppsspp#1595
No description provided.