@Override
    public void postRender() {

        if (environment != null) {
            if (environment.isInVR()) {
                VRAPI api = environment.getVRHardware();
                // using the compositor...
                int errl = 0, errr = 0;
                if (environment.isInstanceRendering()) {
                    if (leftTextureType.handle() == -1 || leftTextureType.handle() != getFullTexId()) {
                        leftTextureType.set(getFullTexId(), leftTextureType.eType(), leftTextureType.eColorSpace());
                    } else {
                        if (api instanceof LWJGLOpenVR) {
                            int submitFlag = VR.EVRSubmitFlags_Submit_Default;
                            errr = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Right, rightTextureType, rightTextureBounds, submitFlag);
                            errl = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Left, leftTextureType, leftTextureBounds, submitFlag);
                        }
                    }
                } else if (leftTextureType.handle() == -1 || rightTextureType.handle() == -1
                        || leftTextureType.handle() != getLeftTexId() || rightTextureType.handle() != getRightTexId()) {
                    leftTextureType.set(getLeftTexId(), leftTextureType.eType(), leftTextureType.eColorSpace());
                    rightTextureType.set(getRightTexId(), leftTextureType.eType(), leftTextureType.eColorSpace());
                } else {
                    if (api instanceof LWJGLOpenVR) {
                        int submitFlag = VR.EVRSubmitFlags_Submit_Default;
                        errr = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Right, rightTextureType, null, submitFlag);
                        errl = VRCompositor.VRCompositor_Submit(VR.EVREye_Eye_Left, leftTextureType, null, submitFlag);
                    } else {

                    }
                }

                if (errl != 0) {
                    logger.severe("Submit to left compositor error: " + " (" + Integer.toString(errl) + ")");
                    logger.severe("  Texture handle: " + leftTextureType.handle());

                    logger.severe("  Left eye texture " + leftEyeTexture.getName() + " (" + leftEyeTexture.getImage().getId() + ")");
                    logger.severe("                 Type: " + leftEyeTexture.getType());
                    logger.severe("                 Size: " + leftEyeTexture.getImage().getWidth() + "x" + leftEyeTexture.getImage().getHeight());
                    logger.severe("          Image depth: " + leftEyeTexture.getImage().getDepth());
                    logger.severe("         Image format: " + leftEyeTexture.getImage().getFormat());
                    logger.severe("    Image color space: " + leftEyeTexture.getImage().getColorSpace());

                }

                if (errr != 0) {
                    logger.severe("Submit to right compositor error: " + " (" + Integer.toString(errl) + ")");
//                    logger.severe("  Texture color space: "+OpenVRUtil.getEColorSpaceString(rightTextureType.eColorSpace));
//                    logger.severe("  Texture type: "+OpenVRUtil.getETextureTypeString(rightTextureType.eType));
                    logger.severe("  Texture handle: " + rightTextureType.handle());

                    logger.severe("  Right eye texture " + rightEyeTexture.getName() + " (" + rightEyeTexture.getImage().getId() + ")");
                    logger.severe("                 Type: " + rightEyeTexture.getType());
                    logger.severe("                 Size: " + rightEyeTexture.getImage().getWidth() + "x" + rightEyeTexture.getImage().getHeight());
                    logger.severe("          Image depth: " + rightEyeTexture.getImage().getDepth());
                    logger.severe("         Image format: " + rightEyeTexture.getImage().getFormat());
                    logger.severe("    Image color space: " + rightEyeTexture.getImage().getColorSpace());
                }
            }
        } else {
            throw new IllegalStateException("This VR view manager is not attached to any VR environment.");
        }

        VRCompositor.VRCompositor_PostPresentHandoff();

    }
updatePose can be called here because appstates are always called before the main renderer. This way we get the latest pose close to when it's supposed to render
jme3-vr/src/main/java/com/jme3/input/vr/lwjgl_openvr/LWJGLOpenVRViewManager.java