summary refs log tree commit diff
path: root/devices/src/virtio/gpu/backend.rs
diff options
context:
space:
mode:
authorDavid Riley <davidriley@chromium.org>2018-05-17 17:08:16 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-07-30 23:08:04 -0700
commitba7c6035f8fb4b939b9c86f58c0f3009b04ebb68 (patch)
tree02559d7609752afbaa0231a7d9288312de4d16ab /devices/src/virtio/gpu/backend.rs
parent4cbaeb7eaa2eea6581707b337775e614718cbf55 (diff)
downloadcrosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.tar
crosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.tar.gz
crosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.tar.bz2
crosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.tar.lz
crosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.tar.xz
crosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.tar.zst
crosvm-ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68.zip
gpu: hold image with resource
Ensure eglImage is not destroyed until the referencing resource is dropped.

BUG=None
TEST=build with --features=gpu; null_platform_test

Change-Id: I55c33344f46b08f846e094451516fcd16c9d16ae
Reviewed-on: https://chromium-review.googlesource.com/1073958
Commit-Ready: David Riley <davidriley@chromium.org>
Tested-by: David Riley <davidriley@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'devices/src/virtio/gpu/backend.rs')
-rw-r--r--devices/src/virtio/gpu/backend.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/devices/src/virtio/gpu/backend.rs b/devices/src/virtio/gpu/backend.rs
index 561ce74..34aada8 100644
--- a/devices/src/virtio/gpu/backend.rs
+++ b/devices/src/virtio/gpu/backend.rs
@@ -18,6 +18,7 @@ use sys_util::{GuestAddress, GuestMemory};
 use super::gpu_buffer::{Device, Buffer, Format, Flags};
 use super::gpu_display::*;
 use super::gpu_renderer::{Box3, Renderer, Context as RendererContext,
+                          Image as RendererImage,
                           Resource as GpuRendererResource, ResourceCreateArgs,
                           format_fourcc as renderer_fourcc};
 
@@ -156,16 +157,19 @@ struct BackedBuffer {
     backing: Vec<(GuestAddress, usize)>,
     buffer: Buffer,
     gpu_renderer_resource: Option<GpuRendererResource>,
+    _image: Option<RendererImage>,
 }
 
 impl BackedBuffer {
     fn new_renderer_registered(buffer: Buffer,
-                               gpu_renderer_resource: GpuRendererResource) -> BackedBuffer {
+                               gpu_renderer_resource: GpuRendererResource,
+                               image: RendererImage) -> BackedBuffer {
         BackedBuffer {
             display_import: None,
             backing: Vec::new(),
             buffer,
             gpu_renderer_resource: Some(gpu_renderer_resource),
+            _image: Some(image),
         }
     }
 }
@@ -177,6 +181,7 @@ impl From<Buffer> for BackedBuffer {
             backing: Vec::new(),
             buffer,
             gpu_renderer_resource: None,
+            _image: None,
         }
     }
 }
@@ -748,12 +753,13 @@ impl Backend {
                         };
 
                         let res = self.renderer
-                            .import_resource(create_args, image);
+                            .import_resource(create_args, &image);
                         match res {
                             Ok(res) => {
                                 let mut backed =
                                     BackedBuffer::new_renderer_registered(buffer,
-                                                                          res);
+                                                                          res,
+                                                                          image);
                                 slot.insert(Box::new(backed));
                                 GpuResponse::OkNoData
                             }