-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Wrong\missing chinese font in windows since v1.11 #14144
Comments
All backends? I recall this area in Gran Turismo having problems before and requiring vertex cache off or some flushing bug fix... -[Unknown] |
That is Vertex Cache and Lazy texture caching |
Lazy texture caching does break the text in this game, I don't think it's unique to Chinese? It's the same in English, right? |
It is effect all render engine,opengl,dx9,dx11 ,vulkan |
On hand build test |
Of course, This issue happen on Japanese.(It use jpn0.pgf same.) And, Korean (kr0.pgf) too. |
Thanks @nassau-tk information |
It's a known issue with "lazy texture caching" setting. Should be fine if you turn it off, no? |
Maybe Chinese game patches use kernel memory, and we don't rehash those textures? -[Unknown] |
Hm! Yeah, in that case we could make the check more specific, to ask ppge where it put the font texture and only ignore hashing that one... |
That should hopefully fix it. |
v1.11.2-127-g2ac66446a still don't fix |
Hm, thanks for reporting. Really thought that would do it.... I don't see how else 3e3a40d could have broken it, unless the Chinese patches uses exactly that same texture address for some reason... |
Gran Turismo is offical chinese (asia version,have chinese and english) |
Oh, okay. Well, even stranger then. |
Not sure frame dump would useful |
Hm, didn't we fix this, or at least it works if Lazy texture cache is disabled? |
I think maybe yes - there may have been multiple issues here. It seems like there were more issues (which we may have fixed) after v1.11, but I'm not sure if Gran Turismo specifically ever worked with lazy texture caching before. It makes sense for it to break text rendering like that... Maybe we could make lazy texture caching smarter, if it's doing letter by letter. I think these textures are small, maybe lazy or not it should still hash small textures, likely to be cheap and more likely to change... -[Unknown] |
v1.13.1-745-ga42807ea6 still issue with "lazy texture caching" setting |
yeah, well, that's a speed hack so... I'm gonna reorganize the settings soon so it's obvious which ones are "fast but dangerous" and which ones are more about quality and so on. |
Hm, normally -[Unknown] |
@unknownbrackets no help |
Using original code Fix the issue |
Is that true even if you comment out these lines? ppsspp/GPU/Common/TextureCacheCommon.cpp Lines 2170 to 2171 in 14ef126
Or is this what's causing that (try commenting it out)? ppsspp/GPU/Common/TextureCacheCommon.cpp Line 2220 in 14ef126
-[Unknown] |
This one make font worse ppsspp/GPU/Common/TextureCacheCommon.cpp Lines 2170 to 2171 in 14ef126
second change (comment out) ppsspp/GPU/Common/TextureCacheCommon.cpp Line 2220 in 14ef126
font still wrong, but have font flicking in a screen, |
Thanks, interesting. So then it's the current texture, but it's not texture 0. What if you change this: if (type == GPU_INVALIDATE_ALL) {
// This is an active signal from the game that something in the texture cache may have changed.
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else {
// Do a quick check to see if the current texture could potentially be in range.
const u32 currentAddr = gstate.getTextureAddress(0);
// TODO: This can be made tighter.
if (addr_end >= currentAddr && addr < currentAddr + LARGEST_TEXTURE_SIZE) {
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
} To: /*if (type == GPU_INVALIDATE_ALL) {
// This is an active signal from the game that something in the texture cache may have changed.
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else {*/
// Do a quick check to see if the current texture could potentially be in range.
const u32 currentAddr = gstate.getTextureAddress(0);
// TODO: This can be made tighter.
if (addr_end >= currentAddr && addr < currentAddr + LARGEST_TEXTURE_SIZE) {
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else if (type == GPU_INVALIDATE_ALL) {
WARN_LOG(HLE, "Invalidate for %08x size=%08x was outside texture at %08x (level1=%08x)", addr, size, currentAddr, gstate.getTextureAddress(1));
}
//} What is it logging there? Just trying to see why it wouldn't dirty DIRTY_TEXTURE_IMAGE. We used to always dirty DIRTY_TEXTURE_IMAGE on block transfer iirc, but some games do block transfers a lot so we wanted to remove it. -[Unknown] |
PPSSPP do not hit the line of WARN_LOG(HLE, "Invalidate for %08x size=%08x was outside texture at %08x (level1=%08x)", addr, size, currentAddr, gstate.getTextureAddress(1)); |
textureCache_->Invalidate(dstBasePtr + (dstY * dstStride + dstX) * bpp, height * dstStride * bpp, GPU_INVALIDATE_ALL); |
I might be a bit confused. if (type == GPU_INVALIDATE_ALL) {
// This is an active signal from the game that something in the texture cache may have changed.
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else {
// Do a quick check to see if the current texture could potentially be in range.
const u32 currentAddr = gstate.getTextureAddress(0);
// TODO: This can be made tighter.
if (addr_end >= currentAddr && addr < currentAddr + LARGEST_TEXTURE_SIZE) {
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
}
} If I understood correctly, commenting out the first part - I basically proposed changing it to: // For all types, including GPU_INVALIDATE_ALL
const u32 currentAddr = gstate.getTextureAddress(0);
// TODO: This can be made tighter.
if (addr_end >= currentAddr && addr < currentAddr + LARGEST_TEXTURE_SIZE) {
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else {
log goes here
} And it doesn't log? That's weird because if it's not going to the log part, it must be running If you delete that whole section and put -[Unknown] |
I think that if (addr_end >= currentAddr && addr < currentAddr + LARGEST_TEXTURE_SIZE) is true /*if (type == GPU_INVALIDATE_ALL) {
// This is an active signal from the game that something in the texture cache may have changed.
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else {*/
// Do a quick check to see if the current texture could potentially be in range.
const u32 currentAddr = gstate.getTextureAddress(0);
// TODO: This can be made tighter.
if (addr_end >= currentAddr && addr < currentAddr + LARGEST_TEXTURE_SIZE) {
gstate_c.Dirty(DIRTY_TEXTURE_IMAGE);
} else if (type == GPU_INVALIDATE_ALL) {
WARN_LOG(HLE, "Invalidate for %08x size=%08x was outside texture at %08x (level1=%08x)", addr, size, currentAddr, gstate.getTextureAddress(1));
}
//} Yes breaks it.
|
3: void TextureCacheCommon::Invalidate(u32 addr, int size, GPUInvalidationType type) { text bad , in a screen text flicking |
Only happened on my chinese freind.
Last work v1.10
First bad v1.11
I will get more information
The text was updated successfully, but these errors were encountered: