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>
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 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 @@
     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 @@
             backing: Vec::new(),
             buffer,
             gpu_renderer_resource: None,
+            _image: None,
         }
     }
 }
@@ -748,12 +753,13 @@
                         };
 
                         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
                             }