Using GraphicBuffers to fast read from a texture

匿名 (未验证) 提交于 2019-12-03 08:57:35

问题:

I am working on some code that runs some GPGPU code on Android using shaders. Usually a Framebuffer is used so the result of the computation is stored in a texture. Also the input data is usually a texture. To improve performance it would be great to get rid of glTexImage2D and glReadPixels to upload and download images to and from the GPU memory space. All the code related to OpenGL is native.

On Android GraphicBuffer can be used on Android for this propose because in mobile devices gpu memory is just host RAM memory. This structure allows to use memcpy to transfer data with the GPU. This should be faster than using OpenGL functions.

I have been using this very cited articles [1][2][3] to successfully upload textures to the Android's GPU memory space using GraphicBuffer.

Later I tried to use the same method to move the texture data back into CPU space but I'm still having some problems with it. According to answer [7] it should not be possible. But further reading of some other answers in StackOverflow seem to tell otherwise. Some cases of a successful replacement of glReadPixels by a memcpy from a GraphicBuffer are reported in [4][5][6]. Most seem to say that placing glFinish just before locking and reading the GraphicBuffer makes its content updated as expected by the time it is read.

In my experience it did not work out of the box but there really seem to be a timing problem. Just calling glFinish does not seem to be enough but if I wait a few milliseconds before reading the buffer (i.e. placing a sleep) then the content seem to be correct. This is really not a solution as it ends up being slower than the original glReadPixels solution (and anyway it wouldn't be a very reliable solution), but shows that the content IS actually updated at some point.

My questions would be:

  • Is it really true that GraphicBuffer can not be read directly as said in [7], or has something changed since then?

  • Is it just a coincidence that it seem to work for other people?

  • Is there a better way to enforce the memory to be updated (e.g. a stronger glFinish call)?

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!