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>
This commit is contained in:
David Riley 2018-05-17 17:08:16 -07:00 committed by chrome-bot
parent 4cbaeb7eaa
commit ba7c6035f8
2 changed files with 10 additions and 4 deletions

View file

@ -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
}

View file

@ -466,7 +466,7 @@ impl Renderer {
/// Imports a resource from an EGLImage.
pub fn import_resource(&self,
mut args: virgl_renderer_resource_create_args,
image: Image)
image: &Image)
-> Result<Resource> {
let ret = unsafe { virgl_renderer_resource_import_eglimage(&mut args, image.image) };
ret_to_res(ret)?;