Commit 74083f9c authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

egl: misc framebuffer helper improvements.



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: default avatarGerd Hoffmann <kraxel@redhat.com>
Message-id: 20170927115031.12063-1-kraxel@redhat.com
parent e2f82e92
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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);

+3 −3
Original line number Diff line number Diff line
@@ -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);
    }
}

+18 −8
Original line number Diff line number Diff line
@@ -26,16 +26,23 @@ EGLConfig qemu_egl_config;

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

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

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

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

    egl_fb_delete_texture(fb);
    glDeleteFramebuffers(1, &fb->framebuffer);

    fb->width = 0;
@@ -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);
    }
@@ -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;

@@ -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)
+2 −2
Original line number Diff line number Diff line
@@ -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,
+2 −2
Original line number Diff line number Diff line
@@ -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,
Loading