I'm trying to make use of eglCreateImageKHR on the i.MX6 in Linux (normal framebuffer drivers) but it is not clear what EGLClientBuffer should be. I've tried using both physical and virtual addresses from both IPU allocated memory as well as from framebuffer (/dev/fb) devices. In all cases the call returns EGL_BAD_PARAMETER. I am trying to create an EGLImage for use as a texture in GLES 1.1 (possibly also a VGImage in the future) whose data comes from IPU allocated memory or a framebuffer (which the IPU can access directly).
image = eglCreateImageKHR(egl_display, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, buffer, NULL);
eglGetError() always returns EGL_BAD_PARAMETER
For buffer I've tried using a EGLNativePixmapType returned from fbCreatePixmap, the physical address of the underlying /dev/fb device, the mmap'ed memory of the same /dev/fb device. I've also tried using /dev/mxc_ipu to allocate memory and using either the physical or mmap'ed memory from there as well.
Solved! Go to Solution.
Hi
I'm not an expert in Graphics, but if what you are trying to do is to create a texture from an IPU memory buffer, you can use the glTexDirectVIVMap API to map a virtual memory address buffer (texture_data) to the current bind texture (GL_TEXTURE_2D).
To indicate that physical address is unknown ~0U should be passed as the last argument.
Also you should call this API for each new frame rendered.
==================== Pseudo code =======================
GLuint physical = ~0U;
GLuint texture_id = 0;
void* texture_data = GetBuffer(); // virtual buffer addr
_texture = glGenTextures (1, &texture_id);
glTexParameterf (GL_TEXTURE_2D, <pname>, <pvalue>);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexDirectVIVMap (GL_TEXTURE_2D, width, height, GL_VIV_NV12, (GLvoid**)(&texture_data), &physical);
glTexDirectInvalidateVIV (GL_TEXTURE_2D);
I made an error in this report, I was specifying a context instead of EGL_NO_CONTEXT which was the cause of the EGL_BAD_PARAMETER (why this happens isn't clear). Using EGL_NO_CONTEXT does allow the image to be created but the texture renders all white though inspecting the memory of the image shows that it does indeed have the correct data. I've set the clear colour to be green, disabling the texture does show a green canvas as expected.
Hi
I'm not an expert in Graphics, but if what you are trying to do is to create a texture from an IPU memory buffer, you can use the glTexDirectVIVMap API to map a virtual memory address buffer (texture_data) to the current bind texture (GL_TEXTURE_2D).
To indicate that physical address is unknown ~0U should be passed as the last argument.
Also you should call this API for each new frame rendered.
==================== Pseudo code =======================
GLuint physical = ~0U;
GLuint texture_id = 0;
void* texture_data = GetBuffer(); // virtual buffer addr
_texture = glGenTextures (1, &texture_id);
glTexParameterf (GL_TEXTURE_2D, <pname>, <pvalue>);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexDirectVIVMap (GL_TEXTURE_2D, width, height, GL_VIV_NV12, (GLvoid**)(&texture_data), &physical);
glTexDirectInvalidateVIV (GL_TEXTURE_2D);
If using the IPU we specifically want to use the physical address so we both use IPU_ALLOC and mmap the buffer to get a virtual address. I have been using glTexDirectVIVMap in this way successfully. I haven't had the time to come back and look at the issue with eglCreateImageKHR but I believe it might be able to use a framebuffer pixmap created with the fbCreatePixmap.
juangutierrez Aug 26, 2013 4:48 PM (in response to imxcommunityscout)
Hi
I'm not an expert in Graphics, but if what you are trying to do is to create a texture from an IPU memory buffer, you can use the glTexDirectVIVMap API to map a virtual memory address buffer (texture_data) to the current bind texture (GL_TEXTURE_2D).
To indicate that physical address is unknown ~0U should be passed as the last argument.
Also you should call this API for each new frame rendered.
==================== Pseudo code =======================
GLuint physical = ~0U;
GLuint texture_id = 0;
void* texture_data = GetBuffer(); // virtual buffer addr
_texture = glGenTextures (1, &texture_id);
glTexParameterf (GL_TEXTURE_2D, <pname>, <pvalue>);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexDirectVIVMap (GL_TEXTURE_2D, width, height, GL_VIV_NV12, (GLvoid**)(&texture_data), &physical);
glTexDirectInvalidateVIV (GL_TEXTURE_2D);