And How do you measure the time when rendering?
when using glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
you need to copy the data to your buffer whenever there is data change. This should be counted to your rendering time for each frame unless you are using a static image, then you don't need to memcpy for every frame. IF this is the case, there is no point to compare time consumed with glTexDirectVIVMap()
glTexDirectVIVMap() is meant for the texure with data changing for every frame, for example, frame from video decoder, or frame from camera capture. You save the memcpy time by directly mapping the frame to texture.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); alone doesn't handle any data transfer yet, it doesn't make sense just comparing the time consumed between these two apis.
If you include all the data copy in the rendering, if glTexDirectVIVMap() still consumes more time, then there is perfomrance issue with gpu, if this is the case, you can share your application with us to investigation
Regards