GlCommandEncoder.copyTextureToTexture and copyTextureToBuffer both bracket their GL calls with GlStateManager.clearGlErrors() and a _getError() check that throws IllegalStateException. writeToTexture and copyBufferToTexture do neither.
https://mcsrc.dev/2/26.3-snapshot-10/com/mojang/renderpearl/backend/opengl/GlCommandEncoder#L291-366
Because neither method calls clearGlErrors() on entry either, a pending error survives until the next method that does clear, where it is discarded. The upload silently does nothing and no diagnostic reaches the user. The Vulkan backend reports the equivalent condition through the validation layers.
Adding the same clearGlErrors() / _getError() bracket used by the two neighbouring methods makes the four copy paths behave consistently.
Can confirm.