I'll post here what I've been able to figure out in case somebody else wanders in here in vain hope of clarification. Facts I've figured out:
1) OpenCL doesn't appear to be supported in Android. Don't even bother.
2) OpenGL processing performance for demosaic is good, but Vivante's driver/OpenGL implementation has a *staggeringly* slow glReadPixels() implementation that makes it completely worthless for getting data out of the GPU's memory space.
3) There apparently used to be support for a framebuffer backend to allow you to mmap() , but it doesn't appear to be supported in Android anymore (or at all?). I've never seen a version of the Android libraries that contains the -fb version, but it looks like the Linux BSP does.
4) It looks like *maybe* the solution is to render to texture and use Vivante's glTexDirectVIV family of function to get direct pointers to the texture memory. There's documentation for this readelf shows that functions by that name, but since I've never seen any header files that declare it (only online docs and forum posts), I'm having trouble getting it to link, so I can't tell you whether it actually works. It also seems to have some pretty severe format limitations.
So those are the wrong things you should avoid. Not sure what the right is yet, but a few more months of just trying every .so file I can find from every source except NXP may yield results. If it does, I'll surely post the right answer.