mirror of https://gitee.com/openkylin/qemu.git
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_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
|
||||
|
||||
EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <dirent.h>
|
||||
|
||||
#include "qemu/error-report.h"
|
||||
#include "ui/console.h"
|
||||
#include "ui/egl-helpers.h"
|
||||
|
||||
EGLDisplay *qemu_egl_display;
|
||||
|
@ -241,6 +242,51 @@ int egl_get_fd_for_texture(uint32_t tex_id, EGLint *stride, EGLint *fourcc)
|
|||
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 */
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
|
Loading…
Reference in New Issue