citro3d icon indicating copy to clipboard operation
citro3d copied to clipboard

Binding programs without drawing anything can result in inconsistent uniform state

Open truecolour opened this issue 8 years ago • 2 comments

  1. Bind a program with a geometry shader.
  2. Set the first uniform in the geometry shader to value A.
  3. Without rendering anything, bind a different program without a geometry shader.
  4. Set the first uniform in the vertex shader to value B.
  5. Render something. The results will use value A.

Adding a C3D_UpdateUniforms(GPU_GEOMETRY_SHADER) between steps 2 and 3 fixes the problem.

If I understand the internals correctly, the problem is that the C3D_{FV,IV,Bool}UnifDirty flags don't get cleared when binding a new program.

truecolour avatar Sep 13 '17 16:09 truecolour

Without rendering anything

That is the problem. Why are you binding a program, then afterwards binding another one without having rendered anything in the first place? Can't you avoid binding the first program since it's not used for rendering?

fincs avatar Sep 13 '17 16:09 fincs

Context: I'm adding particle effects to a game I'm working on. The rendering code configures the shading, etc., binds the program, then loops through all particle sources, sets up buffers and calls DrawArrays. Regular objects get drawn afterwards. If there aren't any particle sources, the graphics get glitchy.

So yes, I can easily avoid binding the program at all. But this is really confusing behaviour. If this is intentional, IMO it should be documented somewhere.

truecolour avatar Sep 13 '17 16:09 truecolour