hrydgard / ppsspp

A PSP emulator for Android, Windows, Mac and Linux, written in C++. Want to contribute? Join us on Discord at https://discord.gg/5NJB6dD or just send pull requests / issues. For discussion use the forums at forums.ppsspp.org.
https://www.ppsspp.org
Other
11.18k stars 2.17k forks source link

Ikuze! Gen-san water is not transparent #6225

Closed daniel229 closed 10 years ago

daniel229 commented 10 years ago

with block transfer,it shows up the water,but can't see the thing in the water.without block transfer, background is black. 08

log I[SCEGE]: GLES\Framebuffer.cpp:901 Creating FBO for 0008c000 : 64 x 64 x 3 W[SCEGE]: GLES\Framebuffer.cpp:937 FBO reusing depthbuffer, 0008c000/00088000 and 00000000/00088000 W[SCEGE]: GLES\Framebuffer.cpp:931 FBO using existing buffer as depthbuffer, 0008c000/00088000 and 00088000/00088000 W[G3D]: GLES\Framebuffer.cpp:2065 Block transfer download 04088000 -> 08bed000 W[G3D]: GLES\Framebuffer.cpp:2053 Inter-buffer block transfer 04044000 -> 04088000 W[G3D]: GLES\TextureCache.cpp:231 Render to texture with different formats 1 != 3

it works with the framebuffer-clut https://github.com/hrydgard/ppsspp/pull/5767,the early commit. 07

unknownbrackets commented 10 years ago

Do you remember when/which commit? Was it when it wasn't setting the currentRenderVfb_ back (or maybe that was the other pull, I forget...)?

What does the GE debugger show? Does it draw the scene underwater to a different framebuffer and copy it, or does it draw the sea on top (I'm guessing the latter, and probably not blended properly, possibly like that Yakuza game seems to possibly be having problems with...)?

-[Unknown]

daniel229 commented 10 years ago

I don't remember witch commit,but I tested several commits the day near the day that i post the correct picture,still broken,it might the master change cause the problem,or just a accident.

It draws the scene underwater. 01

and then draw the rock and the boy in another framebuffer 03

copy 03

draw in another framebuffer agains 04

gong to copy that thing 05

the water finally 06

unknownbrackets commented 10 years ago

Before the final copy, it looks pretty good. I don't understand why that block transfer right above doesn't affect the texture...

-[Unknown]

daniel229 commented 10 years ago

It's black agains with or with out Simulate block Transfer in v0.9.8-1087-gfe58f8d 02

unknownbrackets commented 10 years ago

Oh, so maybe it was a block transfer with a wrong stride. What if you change this to a NOTICE_LOG:

DEBUG_LOG(G3D, "Block transfer: %08x/%x -> %08x/%x, %ix%ix%i (%i,%i)->(%i,%i)", srcBasePtr, srcStride, dstBasePtr, dstStride, width, height, bpp, srcX, srcY, dstX, dstY);

What does it log?

-[Unknown]

daniel229 commented 10 years ago

something like these 18:10:981 user_main W[SCEGE]: GLES\Framebuffer.cpp:968 FBO reusing depthbuffer, 0008c000/00088000 and 00000000/00088000 18:10:981 user_main W[SCEGE]: GLES\Framebuffer.cpp:962 FBO using existing buffer as depthbuffer, 0008c000/00088000 and 00088000/00088000 18:10:982 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:10:982 user_main W[G3D]: GLES\Framebuffer.cpp:2208 Block transfer download 04088000 -> 08bef600 18:10:984 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:10:987 user_main W[G3D]: GLES\TextureCache.cpp:237 Render to texture with different formats 1 != 3 18:10:989 user_main I[G3D]: GLES\ShaderManager.cpp:146 Linked shader: vs 62 fs 103 18:10:990 user_main I[G3D]: GLES\ShaderManager.cpp:146 Linked shader: vs 52 fs 105 18:10:990 user_main I[KERNEL]: HLE\sceKernelThread.cpp:2442 sceKernelTerminateDeleteThread(430) 18:10:996 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:10:996 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:011 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:012 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:027 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:11:028 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:044 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:044 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:061 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:11:061 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:077 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:077 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:094 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:11:094 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:111 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:111 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:127 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:11:128 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:144 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:145 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:161 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:11:161 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:177 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:177 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:195 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0) 18:11:195 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04000000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:211 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bef600/40, 64x38x4 (0,0)->(0,0) 18:11:212 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04044000/200 -> 04088000/200, 480x272x2 (0,0)->(0,0) 18:11:227 user_main N[G3D]: GLES\GLES_GPU.cpp:1916 Block transfer: 04088000/40 -> 08bed000/40, 64x38x4 (0,0)->(0,0)

daniel229 commented 10 years ago

The proble since v0.9.8-1084-gbe02ea7

unknownbrackets commented 10 years ago

That block transfer with stride 64 just doesn't make sense. It copies 9.5 rows of pixels?

-[Unknown]

hrydgard commented 10 years ago

Presumably the game uses 04088000 and 04000000 temporarily as a 64x64 texture as well as framebuffers, perhaps before rendering the actual scene, like for blurring a shadow? There's probably more going on than just block transfers.

daniel229 commented 10 years ago

Fixed in https://github.com/hrydgard/ppsspp/pull/6300 01