egl-helpers: add egl_texture_blit and egl_texture_blend

egl_texture_blit() blits a texture, simliar to egl_fb_blit() but by
rendering the texture to the screen instead of using a framebuffer blit.

egl_texture_blend() renders a texture with alpha blending, will be used
to render the cursor to the screen.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20171010135453.6704-6-kraxel@redhat.com
This commit is contained in:
Gerd Hoffmann 2017-10-10 15:54:52 +02:00
parent 86c0522c63
commit 0eb50c2737
2 changed files with 31 additions and 0 deletions

View File

@ -24,6 +24,10 @@ void egl_fb_setup_new_tex(egl_fb *fb, int width, int height);
void egl_fb_blit(egl_fb *dst, egl_fb *src, bool flip);
void egl_fb_read(void *dst, egl_fb *src);
void egl_texture_blit(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip);
void egl_texture_blend(QemuGLShader *gls, egl_fb *dst, egl_fb *src, bool flip,
int x, int y);
#ifdef CONFIG_OPENGL_DMABUF
extern int qemu_egl_rn_fd;

View File

@ -111,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