diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2017-10-19 12:09:53 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2017-10-19 12:09:53 +0100 |
commit | ba6f0fc25e3c14fbb36f4b5a616a89cd3f1de6d0 (patch) | |
tree | 2bbf92549c6a4d29ad93374c1bd57e169ec8d9b0 /ui/egl-helpers.c | |
parent | 73b733e6907e1193e562f498272108c95c00868c (diff) | |
parent | a35179170034b60bcfb997e06bc63258caaf5049 (diff) |
Merge remote-tracking branch 'remotes/kraxel/tags/opengl-20171017-pull-request' into staging
ui: opengl updates for dma-buf support.
# gpg: Signature made Tue 17 Oct 2017 12:13:36 BST
# gpg: using RSA key 0x4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg: aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
# Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138
* remotes/kraxel/tags/opengl-20171017-pull-request:
egl-headless: add dmabuf support
egl-helpers: add egl_texture_blit and egl_texture_blend
egl-helpers: add dmabuf import support
opengl: add flipping vertex shader
opengl: move shader init from console-gl.c to shader.c
console: add support for dmabufs
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'ui/egl-helpers.c')
-rw-r--r-- | ui/egl-helpers.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/ui/egl-helpers.c b/ui/egl-helpers.c index cde9965dea..5fa60ef4e8 100644 --- a/ui/egl-helpers.c +++ b/ui/egl-helpers.c @@ -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; @@ -110,6 +111,33 @@ void egl_fb_read(void *dst, egl_fb *src) GL_BGRA, GL_UNSIGNED_BYTE, dst); } +void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip) +{ + glBindFramebuffer(GL_FRAMEBUFFER_EXT, dst->framebuffer); + glViewport(0, 0, dst->width, dst->height); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, src->texture); + qemu_gl_run_texture_blit(gls, flip); +} + +void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip, + int x, int y) +{ + glBindFramebuffer(GL_FRAMEBUFFER_EXT, dst->framebuffer); + if (flip) { + glViewport(x, y, src->width, src->height); + } else { + glViewport(x, dst->height - src->height - y, + src->width, src->height); + } + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, src->texture); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + qemu_gl_run_texture_blit(gls, flip); + glDisable(GL_BLEND); +} + /* ---------------------------------------------------------------------- */ #ifdef CONFIG_OPENGL_DMABUF @@ -241,6 +269,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 */ /* ---------------------------------------------------------------------- */ |