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
}