Recently I've implemented SW->Surface blits. Those code paths are used if an image is not cached (first use or not cacheable), e.g. when blitting a BufferedImage with stolen raster which some programs do quite frequently.
I avoided that stuff for a long time, because I didn't want to touch the whole well tuned image-upload code which is shared with the X11 pipeline.
For now a new VolatileImage is created every time the image is blited, using it later for composition - which is probably not an optimal path - but a lot less code ;)
> sun.java2d.xr.XrSwToPMTransformedBlit::TransformBlit(IntArgb, AnyAlpha, "Integer RGB Pixmap")
> sun.java2d.loops.Blit::Blit(IntArgb, SrcNoEa, IntRgb)
Update: Ok admited, it reuses the VI now for better performance ^^