Przeglądaj źródła

Use virgl_renderer_borrow_texture_for_scanout

virgl_renderer_borrow_texture_for_scanout is a replacement of
virgl_renderer_resource_get_info and performs configurations such as
swizzle and sRGB decode.

Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Akihiko Odaki 4 lat temu
rodzic
commit
920d2875a0

+ 2 - 2
contrib/vhost-user-gpu/virgl.c

@@ -323,7 +323,7 @@ virgl_cmd_set_scanout(VuGpu *g,
                       struct virtio_gpu_ctrl_command *cmd)
                       struct virtio_gpu_ctrl_command *cmd)
 {
 {
     struct virtio_gpu_set_scanout ss;
     struct virtio_gpu_set_scanout ss;
-    struct virgl_renderer_resource_info info;
+    struct virgl_renderer_texture_info info;
     int ret;
     int ret;
 
 
     VUGPU_FILL_CMD(ss);
     VUGPU_FILL_CMD(ss);
@@ -338,7 +338,7 @@ virgl_cmd_set_scanout(VuGpu *g,
     memset(&info, 0, sizeof(info));
     memset(&info, 0, sizeof(info));
 
 
     if (ss.resource_id && ss.r.width && ss.r.height) {
     if (ss.resource_id && ss.r.width && ss.r.height) {
-        ret = virgl_renderer_resource_get_info(ss.resource_id, &info);
+        ret = virgl_renderer_borrow_texture_for_scanout(ss.resource_id, &info);
         if (ret == -1) {
         if (ret == -1) {
             g_critical("%s: illegal resource specified %d\n",
             g_critical("%s: illegal resource specified %d\n",
                        __func__, ss.resource_id);
                        __func__, ss.resource_id);

+ 31 - 15
hw/display/virtio-gpu-virgl.c

@@ -140,12 +140,39 @@ static void virgl_cmd_resource_flush(VirtIOGPU *g,
     }
     }
 }
 }
 
 
+static GLuint virgl_borrow_texture_for_scanout(uint32_t id, bool *y_0_top,
+                                               uint32_t *width,
+                                               uint32_t *height)
+{
+    struct virgl_renderer_texture_info info;
+    int ret;
+
+    memset(&info, 0, sizeof(info));
+
+    ret = virgl_renderer_borrow_texture_for_scanout(id, &info);
+    if (ret == -1) {
+        return 0;
+    }
+
+    if (y_0_top) {
+        *y_0_top = info.flags & 1 /* FIXME: Y_0_TOP */;
+    }
+
+    if (width) {
+        *width = info.width;
+    }
+
+    if (height) {
+        *height = info.height;
+    }
+
+    return info.tex_id;
+}
+
 static void virgl_cmd_set_scanout(VirtIOGPU *g,
 static void virgl_cmd_set_scanout(VirtIOGPU *g,
                                   struct virtio_gpu_ctrl_command *cmd)
                                   struct virtio_gpu_ctrl_command *cmd)
 {
 {
     struct virtio_gpu_set_scanout ss;
     struct virtio_gpu_set_scanout ss;
-    struct virgl_renderer_resource_info info;
-    int ret;
 
 
     VIRTIO_GPU_FILL_CMD(ss);
     VIRTIO_GPU_FILL_CMD(ss);
     trace_virtio_gpu_cmd_set_scanout(ss.scanout_id, ss.resource_id,
     trace_virtio_gpu_cmd_set_scanout(ss.scanout_id, ss.resource_id,
@@ -159,24 +186,13 @@ static void virgl_cmd_set_scanout(VirtIOGPU *g,
     }
     }
     g->parent_obj.enable = 1;
     g->parent_obj.enable = 1;
 
 
-    memset(&info, 0, sizeof(info));
-
     if (ss.resource_id && ss.r.width && ss.r.height) {
     if (ss.resource_id && ss.r.width && ss.r.height) {
-        ret = virgl_renderer_resource_get_info(ss.resource_id, &info);
-        if (ret == -1) {
-            qemu_log_mask(LOG_GUEST_ERROR,
-                          "%s: illegal resource specified %d\n",
-                          __func__, ss.resource_id);
-            cmd->error = VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID;
-            return;
-        }
         qemu_console_resize(g->parent_obj.scanout[ss.scanout_id].con,
         qemu_console_resize(g->parent_obj.scanout[ss.scanout_id].con,
                             ss.r.width, ss.r.height);
                             ss.r.width, ss.r.height);
         virgl_renderer_force_ctx_0();
         virgl_renderer_force_ctx_0();
         dpy_gl_scanout_texture(
         dpy_gl_scanout_texture(
-            g->parent_obj.scanout[ss.scanout_id].con, info.tex_id,
-            info.flags & 1 /* FIXME: Y_0_TOP */,
-            info.width, info.height,
+            g->parent_obj.scanout[ss.scanout_id].con, ss.resource_id,
+            virgl_borrow_texture_for_scanout,
             ss.r.x, ss.r.y, ss.r.width, ss.r.height);
             ss.r.x, ss.r.y, ss.r.width, ss.r.height);
     } else {
     } else {
         dpy_gfx_replace_surface(
         dpy_gfx_replace_surface(

+ 6 - 6
include/ui/console.h

@@ -221,6 +221,9 @@ struct DisplayChangeListener {
     QLIST_ENTRY(DisplayChangeListener) next;
     QLIST_ENTRY(DisplayChangeListener) next;
 };
 };
 
 
+typedef uint32_t (* DisplayGLTextureBorrower)(uint32_t id, bool *y_0_top,
+                                              uint32_t *width, uint32_t *height);
+
 typedef struct DisplayGLOps {
 typedef struct DisplayGLOps {
     QEMUGLContext (*dpy_gl_ctx_create)(void *dg, QEMUGLParams *params);
     QEMUGLContext (*dpy_gl_ctx_create)(void *dg, QEMUGLParams *params);
     void (*dpy_gl_ctx_destroy)(void *dg, QEMUGLContext ctx);
     void (*dpy_gl_ctx_destroy)(void *dg, QEMUGLContext ctx);
@@ -230,9 +233,7 @@ typedef struct DisplayGLOps {
     void (*dpy_gl_scanout_disable)(void *dg);
     void (*dpy_gl_scanout_disable)(void *dg);
     void (*dpy_gl_scanout_texture)(void *dg,
     void (*dpy_gl_scanout_texture)(void *dg,
                                    uint32_t backing_id,
                                    uint32_t backing_id,
-                                   bool backing_y_0_top,
-                                   uint32_t backing_width,
-                                   uint32_t backing_height,
+                                   DisplayGLTextureBorrower backing_borrow,
                                    uint32_t x, uint32_t y,
                                    uint32_t x, uint32_t y,
                                    uint32_t w, uint32_t h);
                                    uint32_t w, uint32_t h);
 
 
@@ -296,9 +297,8 @@ bool dpy_gfx_check_format(QemuConsole *con,
                           pixman_format_code_t format);
                           pixman_format_code_t format);
 
 
 void dpy_gl_scanout_disable(QemuConsole *con);
 void dpy_gl_scanout_disable(QemuConsole *con);
-void dpy_gl_scanout_texture(QemuConsole *con,
-                            uint32_t backing_id, bool backing_y_0_top,
-                            uint32_t backing_width, uint32_t backing_height,
+void dpy_gl_scanout_texture(QemuConsole *con, uint32_t backing_id,
+                            DisplayGLTextureBorrower backing_borrow,
                             uint32_t x, uint32_t y, uint32_t w, uint32_t h);
                             uint32_t x, uint32_t y, uint32_t w, uint32_t h);
 void dpy_gl_scanout_dmabuf(QemuConsole *con,
 void dpy_gl_scanout_dmabuf(QemuConsole *con,
                            QemuDmaBuf *dmabuf);
                            QemuDmaBuf *dmabuf);

+ 2 - 6
include/ui/gtk.h

@@ -166,9 +166,7 @@ bool gd_egl_scanout_get_enabled(void *dg);
 void gd_egl_scanout_disable(void *dg);
 void gd_egl_scanout_disable(void *dg);
 void gd_egl_scanout_texture(void *dg,
 void gd_egl_scanout_texture(void *dg,
                             uint32_t backing_id,
                             uint32_t backing_id,
-                            bool backing_y_0_top,
-                            uint32_t backing_width,
-                            uint32_t backing_height,
+                            DisplayGLTextureBorrower backing_borrow,
                             uint32_t x, uint32_t y,
                             uint32_t x, uint32_t y,
                             uint32_t w, uint32_t h);
                             uint32_t w, uint32_t h);
 void gd_egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf);
 void gd_egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf);
@@ -196,9 +194,7 @@ bool gd_gl_area_scanout_get_enabled(void *dg);
 void gd_gl_area_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf);
 void gd_gl_area_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf);
 void gd_gl_area_scanout_texture(void *dg,
 void gd_gl_area_scanout_texture(void *dg,
                                 uint32_t backing_id,
                                 uint32_t backing_id,
-                                bool backing_y_0_top,
-                                uint32_t backing_width,
-                                uint32_t backing_height,
+                                DisplayGLTextureBorrower backing_borrow,
                                 uint32_t x, uint32_t y,
                                 uint32_t x, uint32_t y,
                                 uint32_t w, uint32_t h);
                                 uint32_t w, uint32_t h);
 void gd_gl_area_scanout_disable(void *dg);
 void gd_gl_area_scanout_disable(void *dg);

+ 1 - 3
include/ui/sdl2.h

@@ -73,9 +73,7 @@ bool sdl2_gl_scanout_get_enabled(void *dg);
 void sdl2_gl_scanout_disable(void *dg);
 void sdl2_gl_scanout_disable(void *dg);
 void sdl2_gl_scanout_texture(void *dg,
 void sdl2_gl_scanout_texture(void *dg,
                              uint32_t backing_id,
                              uint32_t backing_id,
-                             bool backing_y_0_top,
-                             uint32_t backing_width,
-                             uint32_t backing_height,
+                             DisplayGLTextureBorrower backing_borrow,
                              uint32_t x, uint32_t y,
                              uint32_t x, uint32_t y,
                              uint32_t w, uint32_t h);
                              uint32_t w, uint32_t h);
 void sdl2_gl_scanout_flush(DisplayChangeListener *dcl,
 void sdl2_gl_scanout_flush(DisplayChangeListener *dcl,

+ 11 - 7
ui/cocoa.m

@@ -107,7 +107,7 @@
 
 
 typedef struct {
 typedef struct {
     uint32_t scanout_id;
     uint32_t scanout_id;
-    bool scanout_y0_top;
+    DisplayGLTextureBorrower scanout_borrow;
     bool surface_dirty;
     bool surface_dirty;
 } DisplayGL;
 } DisplayGL;
 
 
@@ -2441,32 +2441,36 @@ static void cocoa_gl_scanout_disable(void *dg)
 
 
 static void cocoa_gl_scanout_texture(void *dg,
 static void cocoa_gl_scanout_texture(void *dg,
                                      uint32_t backing_id,
                                      uint32_t backing_id,
-                                     bool backing_y_0_top,
-                                     uint32_t backing_width,
-                                     uint32_t backing_height,
+                                     DisplayGLTextureBorrower backing_borrow,
                                      uint32_t x, uint32_t y,
                                      uint32_t x, uint32_t y,
                                      uint32_t w, uint32_t h)
                                      uint32_t w, uint32_t h)
 {
 {
     ((DisplayGL *)dg)->scanout_id = backing_id;
     ((DisplayGL *)dg)->scanout_id = backing_id;
-    ((DisplayGL *)dg)->scanout_y0_top = backing_y_0_top;
+    ((DisplayGL *)dg)->scanout_borrow = backing_borrow;
 }
 }
 
 
 static void cocoa_gl_scanout_flush(DisplayChangeListener *dcl,
 static void cocoa_gl_scanout_flush(DisplayChangeListener *dcl,
                                    uint32_t x, uint32_t y, uint32_t w, uint32_t h)
                                    uint32_t x, uint32_t y, uint32_t w, uint32_t h)
 {
 {
     DisplayGL *dg = dgs + qemu_console_get_index(dcl->con);
     DisplayGL *dg = dgs + qemu_console_get_index(dcl->con);
+    bool y0_top;
 
 
     if (!dg->scanout_id) {
     if (!dg->scanout_id) {
         return;
         return;
     }
     }
 
 
+    GLint texture = dg->scanout_borrow(dg->scanout_id, &y0_top, NULL, NULL);
+    if (!texture) {
+        return;
+    }
+
     with_view_ctx(^{
     with_view_ctx(^{
         NSSize size = [cocoaView convertSizeToBacking:[cocoaView frame].size];
         NSSize size = [cocoaView convertSizeToBacking:[cocoaView frame].size];
 
 
         glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
         glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
         glViewport(0, 0, size.width, size.height);
         glViewport(0, 0, size.width, size.height);
-        glBindTexture(GL_TEXTURE_2D, dg->scanout_id);
-        qemu_gl_run_texture_blit(gls, dg->scanout_y0_top);
+        glBindTexture(GL_TEXTURE_2D, texture);
+        qemu_gl_run_texture_blit(gls, y0_top);
 
 
         cocoa_gl_render_cursor();
         cocoa_gl_render_cursor();
 
 

+ 2 - 6
ui/console.c

@@ -1878,16 +1878,12 @@ void dpy_gl_scanout_disable(QemuConsole *con)
 
 
 void dpy_gl_scanout_texture(QemuConsole *con,
 void dpy_gl_scanout_texture(QemuConsole *con,
                             uint32_t backing_id,
                             uint32_t backing_id,
-                            bool backing_y_0_top,
-                            uint32_t backing_width,
-                            uint32_t backing_height,
+                            DisplayGLTextureBorrower backing_borrow,
                             uint32_t x, uint32_t y,
                             uint32_t x, uint32_t y,
                             uint32_t width, uint32_t height)
                             uint32_t width, uint32_t height)
 {
 {
     assert(display_gl_ops);
     assert(display_gl_ops);
-    display_gl_ops->dpy_gl_scanout_texture(con->dg, backing_id,
-                                           backing_y_0_top,
-                                           backing_width, backing_height,
+    display_gl_ops->dpy_gl_scanout_texture(con->dg, backing_id, backing_borrow,
                                            x, y, width, height);
                                            x, y, width, height);
 }
 }
 
 

+ 26 - 11
ui/egl-headless.c

@@ -58,13 +58,11 @@ static void egl_scanout_disable(void *dg)
     egl_fb_destroy(&edpy->blit_fb);
     egl_fb_destroy(&edpy->blit_fb);
 }
 }
 
 
-static void egl_scanout_texture(void *dg,
-                                uint32_t backing_id,
-                                bool backing_y_0_top,
-                                uint32_t backing_width,
-                                uint32_t backing_height,
-                                uint32_t x, uint32_t y,
-                                uint32_t w, uint32_t h)
+static void egl_scanout_imported_texture(void *dg,
+                                         uint32_t backing_texture,
+                                         bool backing_y_0_top,
+                                         uint32_t backing_width,
+                                         uint32_t backing_height)
 {
 {
     egl_dpy *edpy = dg;
     egl_dpy *edpy = dg;
 
 
@@ -72,7 +70,7 @@ static void egl_scanout_texture(void *dg,
 
 
     /* source framebuffer */
     /* source framebuffer */
     egl_fb_setup_for_tex(&edpy->guest_fb,
     egl_fb_setup_for_tex(&edpy->guest_fb,
-                         backing_width, backing_height, backing_id, false);
+                         backing_width, backing_height, backing_texture, false);
 
 
     /* dest framebuffer */
     /* dest framebuffer */
     if (edpy->blit_fb.width  != backing_width ||
     if (edpy->blit_fb.width  != backing_width ||
@@ -82,6 +80,24 @@ static void egl_scanout_texture(void *dg,
     }
     }
 }
 }
 
 
+static void egl_scanout_texture(void *dg,
+                                uint32_t backing_id,
+                                DisplayGLTextureBorrower backing_borrower,
+                                uint32_t x, uint32_t y,
+                                uint32_t w, uint32_t h)
+{
+    bool backing_y_0_top;
+    uint32_t backing_width;
+    uint32_t backing_height;
+
+    GLuint backing_texture = backing_borrower(backing_id, &backing_y_0_top,
+                                              &backing_width, &backing_height);
+    if (backing_texture) {
+        egl_scanout_imported_texture(dg, backing_texture, backing_y_0_top,
+                                     backing_width, backing_height);
+    }
+}
+
 static void egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
 static void egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
 {
 {
     egl_dmabuf_import_texture(dmabuf);
     egl_dmabuf_import_texture(dmabuf);
@@ -89,9 +105,8 @@ static void egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
         return;
         return;
     }
     }
 
 
-    egl_scanout_texture(dg, dmabuf->texture,
-                        false, dmabuf->width, dmabuf->height,
-                        0, 0, dmabuf->width, dmabuf->height);
+    egl_scanout_imported_texture(dg, dmabuf->texture,
+                                 false, dmabuf->width, dmabuf->height);
 }
 }
 
 
 static void egl_cursor_dmabuf(void *dg,
 static void egl_cursor_dmabuf(void *dg,

+ 28 - 10
ui/gtk-egl.c

@@ -187,14 +187,14 @@ void gd_egl_scanout_disable(void *dg)
     gtk_egl_set_scanout_mode(vc, false);
     gtk_egl_set_scanout_mode(vc, false);
 }
 }
 
 
-void gd_egl_scanout_texture(void *dg,
-                            uint32_t backing_id, bool backing_y_0_top,
-                            uint32_t backing_width, uint32_t backing_height,
-                            uint32_t x, uint32_t y,
-                            uint32_t w, uint32_t h)
+static void gd_egl_scanout_borrowed_texture(VirtualConsole *vc,
+                                            uint32_t backing_id,
+                                            bool backing_y_0_top,
+                                            uint32_t backing_width,
+                                            uint32_t backing_height,
+                                            uint32_t x, uint32_t y,
+                                            uint32_t w, uint32_t h)
 {
 {
-    VirtualConsole *vc = dg;
-
     vc->gfx.x = x;
     vc->gfx.x = x;
     vc->gfx.y = y;
     vc->gfx.y = y;
     vc->gfx.w = w;
     vc->gfx.w = w;
@@ -209,6 +209,24 @@ void gd_egl_scanout_texture(void *dg,
                          backing_id, false);
                          backing_id, false);
 }
 }
 
 
+void gd_egl_scanout_texture(void *dg, uint32_t backing_id,
+                            DisplayGLTextureBorrower backing_borrow,
+                            uint32_t x, uint32_t y,
+                            uint32_t w, uint32_t h)
+{
+    bool backing_y_0_top;
+    uint32_t backing_width;
+    uint32_t backing_height;
+
+    GLuint backing_texture = backing_borrow(backing_id, &backing_y_0_top,
+                                            &backing_width, &backing_height);
+    if (backing_texture) {
+        gd_egl_scanout_borrowed_texture(dg, backing_texture, backing_y_0_top,
+                                        backing_width, backing_height,
+                                        x, y, w, h);
+    }
+}
+
 void gd_egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
 void gd_egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
 {
 {
 #ifdef CONFIG_GBM
 #ifdef CONFIG_GBM
@@ -217,9 +235,9 @@ void gd_egl_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
         return;
         return;
     }
     }
 
 
-    gd_egl_scanout_texture(dg, dmabuf->texture,
-                           false, dmabuf->width, dmabuf->height,
-                           0, 0, dmabuf->width, dmabuf->height);
+    gd_egl_scanout_borrowed_texture(dg, dmabuf->texture,
+                                    false, dmabuf->width, dmabuf->height,
+                                    0, 0, dmabuf->width, dmabuf->height);
 #endif
 #endif
 }
 }
 
 

+ 30 - 12
ui/gtk-gl-area.c

@@ -177,16 +177,14 @@ bool gd_gl_area_scanout_get_enabled(void *dg)
     return ((VirtualConsole *)dg)->gfx.scanout_mode;
     return ((VirtualConsole *)dg)->gfx.scanout_mode;
 }
 }
 
 
-void gd_gl_area_scanout_texture(void *dg,
-                                uint32_t backing_id,
-                                bool backing_y_0_top,
-                                uint32_t backing_width,
-                                uint32_t backing_height,
-                                uint32_t x, uint32_t y,
-                                uint32_t w, uint32_t h)
+static void gd_gl_area_scanout_borrowed_texture(VirtualConsole *vc,
+                                                uint32_t backing_id,
+                                                bool backing_y_0_top,
+                                                uint32_t backing_width,
+                                                uint32_t backing_height,
+                                                uint32_t x, uint32_t y,
+                                                uint32_t w, uint32_t h)
 {
 {
-    VirtualConsole *vc = dg;
-
     vc->gfx.x = x;
     vc->gfx.x = x;
     vc->gfx.y = y;
     vc->gfx.y = y;
     vc->gfx.w = w;
     vc->gfx.w = w;
@@ -205,6 +203,26 @@ void gd_gl_area_scanout_texture(void *dg,
                          backing_id, false);
                          backing_id, false);
 }
 }
 
 
+void gd_gl_area_scanout_texture(void *dg,
+                                uint32_t backing_id,
+                                DisplayGLTextureBorrower backing_borrow,
+                                uint32_t x, uint32_t y,
+                                uint32_t w, uint32_t h)
+{
+    bool backing_y_0_top;
+    uint32_t backing_width;
+    uint32_t backing_height;
+
+    GLuint backing_texture = backing_borrow(backing_id, &backing_y_0_top,
+                                            &backing_width, &backing_height);
+    if (backing_texture) {
+        gd_gl_area_scanout_borrowed_texture(dg, backing_texture,
+                                            backing_y_0_top,
+                                            backing_width, backing_height,
+                                            x, y, w, h);
+    }
+}
+
 void gd_gl_area_scanout_disable(void *dg)
 void gd_gl_area_scanout_disable(void *dg)
 {
 {
     gtk_gl_area_set_scanout_mode(dg, false);
     gtk_gl_area_set_scanout_mode(dg, false);
@@ -229,9 +247,9 @@ void gd_gl_area_scanout_dmabuf(void *dg, QemuDmaBuf *dmabuf)
         return;
         return;
     }
     }
 
 
-    gd_gl_area_scanout_texture(dg, dmabuf->texture,
-                               false, dmabuf->width, dmabuf->height,
-                               0, 0, dmabuf->width, dmabuf->height);
+    gd_gl_area_scanout_borrowed_texture(dg, dmabuf->texture,
+                                        false, dmabuf->width, dmabuf->height,
+                                        0, 0, dmabuf->width, dmabuf->height);
 #endif
 #endif
 }
 }
 
 

+ 12 - 4
ui/sdl2-gl.c

@@ -201,15 +201,23 @@ bool sdl2_gl_scanout_get_enabled(void *dg)
 
 
 void sdl2_gl_scanout_texture(void *dg,
 void sdl2_gl_scanout_texture(void *dg,
                              uint32_t backing_id,
                              uint32_t backing_id,
-                             bool backing_y_0_top,
-                             uint32_t backing_width,
-                             uint32_t backing_height,
+                             DisplayGLTextureBorrower backing_borrow,
                              uint32_t x, uint32_t y,
                              uint32_t x, uint32_t y,
                              uint32_t w, uint32_t h)
                              uint32_t w, uint32_t h)
 {
 {
     struct sdl2_console *scon = dg;
     struct sdl2_console *scon = dg;
+    bool backing_y_0_top;
+    uint32_t backing_width;
+    uint32_t backing_height;
 
 
     assert(scon->opengl);
     assert(scon->opengl);
+
+    GLuint backing_texture = backing_borrow(backing_id, &backing_y_0_top,
+                                            &backing_width, &backing_height);
+    if (!backing_texture) {
+        return;
+    }
+
     scon->x = x;
     scon->x = x;
     scon->y = y;
     scon->y = y;
     scon->w = w;
     scon->w = w;
@@ -220,7 +228,7 @@ void sdl2_gl_scanout_texture(void *dg,
 
 
     sdl2_set_scanout_mode(scon, true);
     sdl2_set_scanout_mode(scon, true);
     egl_fb_setup_for_tex(&scon->guest_fb, backing_width, backing_height,
     egl_fb_setup_for_tex(&scon->guest_fb, backing_width, backing_height,
-                         backing_id, false);
+                         backing_texture, false);
 }
 }
 
 
 void sdl2_gl_scanout_flush(DisplayChangeListener *dcl,
 void sdl2_gl_scanout_flush(DisplayChangeListener *dcl,

+ 11 - 5
ui/spice-display.c

@@ -929,18 +929,24 @@ static void qemu_spice_gl_scanout_disable(void *dg)
 }
 }
 
 
 static void qemu_spice_gl_scanout_texture(void *dg,
 static void qemu_spice_gl_scanout_texture(void *dg,
-                                          uint32_t tex_id,
-                                          bool y_0_top,
-                                          uint32_t backing_width,
-                                          uint32_t backing_height,
+                                          uint32_t backing_id,
+                                          DisplayGLTextureBorrower backing_borrow,
                                           uint32_t x, uint32_t y,
                                           uint32_t x, uint32_t y,
                                           uint32_t w, uint32_t h)
                                           uint32_t w, uint32_t h)
 {
 {
     SimpleSpiceDisplay *ssd = dg;
     SimpleSpiceDisplay *ssd = dg;
     EGLint stride = 0, fourcc = 0;
     EGLint stride = 0, fourcc = 0;
     int fd = -1;
     int fd = -1;
+    bool y_0_top;
+    uint32_t backing_width;
+    uint32_t backing_height;
+
+    GLuint tex_id = backing_borrow(backing_id, &y_0_top,
+                                   &backing_width, &backing_height);
+    if (!tex_id) {
+        return;
+    }
 
 
-    assert(tex_id);
     fd = egl_get_fd_for_texture(tex_id, &stride, &fourcc, NULL);
     fd = egl_get_fd_for_texture(tex_id, &stride, &fourcc, NULL);
     if (fd < 0) {
     if (fd < 0) {
         fprintf(stderr, "%s: failed to get fd for texture\n", __func__);
         fprintf(stderr, "%s: failed to get fd for texture\n", __func__);