Skip to content

Commit

Permalink
egl: misc framebuffer helper improvements.
Browse files Browse the repository at this point in the history
Rename the functions to to say "setup" instead of "create" because they
support being called multiple times on the same egl framebuffer.

Properly delete unused textures, update function interfaces to support
this.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20170927115031.12063-1-kraxel@redhat.com
  • Loading branch information
kraxel committed Sep 29, 2017
1 parent e2f82e9 commit 74083f9
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 19 deletions.
5 changes: 3 additions & 2 deletions include/ui/egl-helpers.h
Expand Up @@ -18,8 +18,9 @@ typedef struct egl_fb {

void egl_fb_destroy(egl_fb *fb);
void egl_fb_setup_default(egl_fb *fb, int width, int height);
void egl_fb_create_for_tex(egl_fb *fb, int width, int height, GLuint texture);
void egl_fb_create_new_tex(egl_fb *fb, int width, int height);
void egl_fb_setup_for_tex(egl_fb *fb, int width, int height,
GLuint texture, bool delete);
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);

Expand Down
6 changes: 3 additions & 3 deletions ui/egl-headless.c
Expand Up @@ -54,14 +54,14 @@ static void egl_scanout_texture(DisplayChangeListener *dcl,
edpy->y_0_top = backing_y_0_top;

/* source framebuffer */
egl_fb_create_for_tex(&edpy->guest_fb,
backing_width, backing_height, backing_id);
egl_fb_setup_for_tex(&edpy->guest_fb,
backing_width, backing_height, backing_id, false);

/* dest framebuffer */
if (edpy->blit_fb.width != backing_width ||
edpy->blit_fb.height != backing_height) {
egl_fb_destroy(&edpy->blit_fb);
egl_fb_create_new_tex(&edpy->blit_fb, backing_width, backing_height);
egl_fb_setup_new_tex(&edpy->blit_fb, backing_width, backing_height);
}
}

Expand Down
26 changes: 18 additions & 8 deletions ui/egl-helpers.c
Expand Up @@ -26,16 +26,23 @@ EGLConfig qemu_egl_config;

/* ------------------------------------------------------------------ */

static void egl_fb_delete_texture(egl_fb *fb)
{
if (!fb->delete_texture) {
return;
}

glDeleteTextures(1, &fb->texture);
fb->delete_texture = false;
}

void egl_fb_destroy(egl_fb *fb)
{
if (!fb->framebuffer) {
return;
}

if (fb->delete_texture) {
glDeleteTextures(1, &fb->texture);
fb->delete_texture = false;
}
egl_fb_delete_texture(fb);
glDeleteFramebuffers(1, &fb->framebuffer);

fb->width = 0;
Expand All @@ -51,11 +58,15 @@ void egl_fb_setup_default(egl_fb *fb, int width, int height)
fb->framebuffer = 0; /* default framebuffer */
}

void egl_fb_create_for_tex(egl_fb *fb, int width, int height, GLuint texture)
void egl_fb_setup_for_tex(egl_fb *fb, int width, int height,
GLuint texture, bool delete)
{
egl_fb_delete_texture(fb);

fb->width = width;
fb->height = height;
fb->texture = texture;
fb->delete_texture = delete;
if (!fb->framebuffer) {
glGenFramebuffers(1, &fb->framebuffer);
}
Expand All @@ -65,7 +76,7 @@ void egl_fb_create_for_tex(egl_fb *fb, int width, int height, GLuint texture)
GL_TEXTURE_2D, fb->texture, 0);
}

void egl_fb_create_new_tex(egl_fb *fb, int width, int height)
void egl_fb_setup_new_tex(egl_fb *fb, int width, int height)
{
GLuint texture;

Expand All @@ -74,8 +85,7 @@ void egl_fb_create_new_tex(egl_fb *fb, int width, int height)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height,
0, GL_BGRA, GL_UNSIGNED_BYTE, 0);

egl_fb_create_for_tex(fb, width, height, texture);
fb->delete_texture = true;
egl_fb_setup_for_tex(fb, width, height, texture, true);
}

void egl_fb_blit(egl_fb *dst, egl_fb *src, bool flip)
Expand Down
4 changes: 2 additions & 2 deletions ui/gtk-egl.c
Expand Up @@ -190,8 +190,8 @@ void gd_egl_scanout_texture(DisplayChangeListener *dcl,
vc->gfx.esurface, vc->gfx.ectx);

gtk_egl_set_scanout_mode(vc, true);
egl_fb_create_for_tex(&vc->gfx.guest_fb, backing_width, backing_height,
backing_id);
egl_fb_setup_for_tex(&vc->gfx.guest_fb, backing_width, backing_height,
backing_id, false);
}

void gd_egl_scanout_flush(DisplayChangeListener *dcl,
Expand Down
4 changes: 2 additions & 2 deletions ui/gtk-gl-area.c
Expand Up @@ -185,8 +185,8 @@ void gd_gl_area_scanout_texture(DisplayChangeListener *dcl,
}

gtk_gl_area_set_scanout_mode(vc, true);
egl_fb_create_for_tex(&vc->gfx.guest_fb, backing_width, backing_height,
backing_id);
egl_fb_setup_for_tex(&vc->gfx.guest_fb, backing_width, backing_height,
backing_id, false);
}

void gd_gl_area_scanout_flush(DisplayChangeListener *dcl,
Expand Down
4 changes: 2 additions & 2 deletions ui/sdl2-gl.c
Expand Up @@ -207,8 +207,8 @@ void sdl2_gl_scanout_texture(DisplayChangeListener *dcl,
SDL_GL_MakeCurrent(scon->real_window, scon->winctx);

sdl2_set_scanout_mode(scon, true);
egl_fb_create_for_tex(&scon->guest_fb, backing_width, backing_height,
backing_id);
egl_fb_setup_for_tex(&scon->guest_fb, backing_width, backing_height,
backing_id, false);
}

void sdl2_gl_scanout_flush(DisplayChangeListener *dcl,
Expand Down

0 comments on commit 74083f9

Please sign in to comment.