egl-helpers: add dmabuf import support
Add helper function to import a dma-buf as opengl texture. Also add a helper to release the texture again. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20171010135453.6704-5-kraxel@redhat.com
This commit is contained in:
		
							parent
							
								
									2e1d70b9e0
								
							
						
					
					
						commit
						86c0522c63
					
				@ -33,6 +33,9 @@ extern EGLContext qemu_egl_rn_ctx;
 | 
				
			|||||||
int egl_rendernode_init(const char *rendernode);
 | 
					int egl_rendernode_init(const char *rendernode);
 | 
				
			||||||
int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
 | 
					int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf);
 | 
				
			||||||
 | 
					void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
 | 
					EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,7 @@
 | 
				
			|||||||
#include <dirent.h>
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "qemu/error-report.h"
 | 
					#include "qemu/error-report.h"
 | 
				
			||||||
 | 
					#include "ui/console.h"
 | 
				
			||||||
#include "ui/egl-helpers.h"
 | 
					#include "ui/egl-helpers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EGLDisplay *qemu_egl_display;
 | 
					EGLDisplay *qemu_egl_display;
 | 
				
			||||||
@ -241,6 +242,51 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc)
 | 
				
			|||||||
    return fd;
 | 
					    return fd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void egl_dmabuf_import_texture(QemuDmaBuf *dmabuf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EGLImageKHR image = EGL_NO_IMAGE_KHR;
 | 
				
			||||||
 | 
					    EGLint attrs[] = {
 | 
				
			||||||
 | 
					        EGL_DMA_BUF_PLANE0_FD_EXT,      dmabuf->fd,
 | 
				
			||||||
 | 
					        EGL_DMA_BUF_PLANE0_PITCH_EXT,   dmabuf->stride,
 | 
				
			||||||
 | 
					        EGL_DMA_BUF_PLANE0_OFFSET_EXT,  0,
 | 
				
			||||||
 | 
					        EGL_WIDTH,                      dmabuf->width,
 | 
				
			||||||
 | 
					        EGL_HEIGHT,                     dmabuf->height,
 | 
				
			||||||
 | 
					        EGL_LINUX_DRM_FOURCC_EXT,       dmabuf->fourcc,
 | 
				
			||||||
 | 
					        EGL_NONE, /* end of list */
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (dmabuf->texture != 0) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    image = eglCreateImageKHR(qemu_egl_display,
 | 
				
			||||||
 | 
					                              EGL_NO_CONTEXT,
 | 
				
			||||||
 | 
					                              EGL_LINUX_DMA_BUF_EXT,
 | 
				
			||||||
 | 
					                              NULL, attrs);
 | 
				
			||||||
 | 
					    if (image == EGL_NO_IMAGE_KHR) {
 | 
				
			||||||
 | 
					        error_report("eglCreateImageKHR failed");
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glGenTextures(1, &dmabuf->texture);
 | 
				
			||||||
 | 
					    glBindTexture(GL_TEXTURE_2D, dmabuf->texture);
 | 
				
			||||||
 | 
					    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 | 
				
			||||||
 | 
					    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image);
 | 
				
			||||||
 | 
					    eglDestroyImageKHR(qemu_egl_display, image);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (dmabuf->texture == 0) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glDeleteTextures(1, &dmabuf->texture);
 | 
				
			||||||
 | 
					    dmabuf->texture = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* CONFIG_OPENGL_DMABUF */
 | 
					#endif /* CONFIG_OPENGL_DMABUF */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ---------------------------------------------------------------------- */
 | 
					/* ---------------------------------------------------------------------- */
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user