55// SPDX-License-Identifier: Apache-2.0 or BSD-3-Clause
66
77use std:: {
8- collections:: BTreeMap ,
8+ collections:: { BTreeMap , HashSet } ,
99 io:: IoSliceMut ,
1010 os:: fd:: { AsFd , FromRawFd , IntoRawFd , RawFd } ,
1111 sync:: { Arc , Mutex } ,
@@ -23,7 +23,7 @@ use vhost::vhost_user::{
2323} ;
2424use vhost_user_backend:: { VringRwLock , VringT } ;
2525use virglrenderer:: {
26- FenceHandler , Iovec , VirglContext , VirglRenderer , VirglRendererFlags , VirglResource ,
26+ FenceHandler , Iovec , VirglRenderer , VirglRendererFlags , VirglResource ,
2727 VIRGL_HANDLE_TYPE_MEM_DMABUF ,
2828} ;
2929use vm_memory:: { GuestAddress , GuestMemory , GuestMemoryMmap , VolatileSlice } ;
@@ -137,7 +137,7 @@ pub struct VirglRendererAdapter {
137137 gpu_backend : GpuBackend ,
138138 fence_state : Arc < Mutex < FenceState > > ,
139139 resources : BTreeMap < u32 , GpuResource > ,
140- contexts : BTreeMap < u32 , VirglContext > ,
140+ context_ids : HashSet < u32 > ,
141141 scanouts : [ Option < VirtioGpuScanout > ; VIRTIO_GPU_MAX_SCANOUTS as usize ] ,
142142}
143143
@@ -166,7 +166,7 @@ impl VirglRendererAdapter {
166166 gpu_backend,
167167 fence_state,
168168 resources : BTreeMap :: new ( ) ,
169- contexts : BTreeMap :: new ( ) ,
169+ context_ids : HashSet :: new ( ) ,
170170 scanouts : Default :: default ( ) ,
171171 }
172172 }
@@ -346,41 +346,45 @@ impl Renderer for VirglRendererAdapter {
346346 context_init : u32 ,
347347 context_name : Option < & str > ,
348348 ) -> VirtioGpuResult {
349- if self . contexts . contains_key ( & ctx_id) {
349+ if self . context_ids . contains ( & ctx_id) {
350350 return Err ( ErrUnspec ) ;
351351 }
352352
353- // Create the VirglContext using virglrenderer
354- let ctx = virglrenderer :: VirglContext :: create_context ( ctx_id, context_init, context_name)
353+ self . renderer
354+ . create_context ( ctx_id, context_init, context_name)
355355 . map_err ( |_| ErrInvalidContextId ) ?;
356356
357- // Insert the newly created context into our local BTreeMap.
358- self . contexts . insert ( ctx_id, ctx) ;
357+ self . context_ids . insert ( ctx_id) ;
359358 Ok ( OkNoData )
360359 }
361360
362361 fn destroy_context ( & mut self , ctx_id : u32 ) -> VirtioGpuResult {
363- self . contexts . remove ( & ctx_id) . ok_or ( ErrInvalidContextId ) ?;
362+ if !self . context_ids . remove ( & ctx_id) {
363+ return Err ( ErrInvalidContextId ) ;
364+ }
365+ self . renderer . destroy_context ( ctx_id) ;
364366 Ok ( OkNoData )
365367 }
366368
367369 fn context_attach_resource ( & mut self , ctx_id : u32 , resource_id : u32 ) -> VirtioGpuResult {
368- let ctx = self . contexts . get_mut ( & ctx_id) . ok_or ( ErrInvalidContextId ) ?;
369- let resource = self
370- . resources
371- . get_mut ( & resource_id)
372- . ok_or ( ErrInvalidResourceId ) ?;
373- ctx. attach ( & mut resource. virgl_resource ) ;
370+ if !self . context_ids . contains ( & ctx_id) {
371+ return Err ( ErrInvalidContextId ) ;
372+ }
373+ if !self . resources . contains_key ( & resource_id) {
374+ return Err ( ErrInvalidResourceId ) ;
375+ }
376+ self . renderer . ctx_attach_resource ( ctx_id, resource_id) ;
374377 Ok ( OkNoData )
375378 }
376379
377380 fn context_detach_resource ( & mut self , ctx_id : u32 , resource_id : u32 ) -> VirtioGpuResult {
378- let ctx = self . contexts . get_mut ( & ctx_id) . ok_or ( ErrInvalidContextId ) ?;
379- let resource = self
380- . resources
381- . get_mut ( & resource_id)
382- . ok_or ( ErrInvalidResourceId ) ?;
383- ctx. detach ( & resource. virgl_resource ) ;
381+ if !self . context_ids . contains ( & ctx_id) {
382+ return Err ( ErrInvalidContextId ) ;
383+ }
384+ if !self . resources . contains_key ( & resource_id) {
385+ return Err ( ErrInvalidResourceId ) ;
386+ }
387+ self . renderer . ctx_detach_resource ( ctx_id, resource_id) ;
384388 Ok ( OkNoData )
385389 }
386390
@@ -390,9 +394,11 @@ impl Renderer for VirglRendererAdapter {
390394 commands : & mut [ u8 ] ,
391395 fence_ids : & [ u64 ] ,
392396 ) -> VirtioGpuResult {
393- let ctx = self . contexts . get_mut ( & ctx_id) . ok_or ( ErrInvalidContextId ) ?;
394-
395- ctx. submit_cmd ( commands, fence_ids)
397+ if !self . context_ids . contains ( & ctx_id) {
398+ return Err ( ErrInvalidContextId ) ;
399+ }
400+ self . renderer
401+ . submit_cmd ( ctx_id, commands, fence_ids)
396402 . map ( |( ) | OkNoData )
397403 . map_err ( |_| ErrUnspec )
398404 }
0 commit comments