@ -174,8 +174,12 @@ int virgl_renderer_transfer_write_iov(uint32_t handle,
struct iovec * iovec ,
struct iovec * iovec ,
unsigned int iovec_cnt )
unsigned int iovec_cnt )
{
{
struct virgl_resource * res = virgl_resource_lookup ( handle ) ;
struct vrend_transfer_info transfer_info ;
struct vrend_transfer_info transfer_info ;
if ( ! res )
return EINVAL ;
transfer_info . ctx_id = ctx_id ;
transfer_info . ctx_id = ctx_id ;
transfer_info . level = level ;
transfer_info . level = level ;
transfer_info . stride = stride ;
transfer_info . stride = stride ;
@ -187,8 +191,20 @@ int virgl_renderer_transfer_write_iov(uint32_t handle,
transfer_info . context0 = true ;
transfer_info . context0 = true ;
transfer_info . synchronized = false ;
transfer_info . synchronized = false ;
return vrend_renderer_transfer_iov ( handle , & transfer_info ,
if ( ctx_id ) {
struct virgl_context * ctx = virgl_context_lookup ( ctx_id ) ;
if ( ! ctx )
return EINVAL ;
return ctx - > transfer_3d ( ctx , res , & transfer_info ,
VIRGL_TRANSFER_TO_HOST ) ;
VIRGL_TRANSFER_TO_HOST ) ;
} else {
if ( ! res - > pipe_resource )
return EINVAL ;
return vrend_renderer_transfer_pipe ( res - > pipe_resource , & transfer_info ,
VIRGL_TRANSFER_TO_HOST ) ;
}
}
}
int virgl_renderer_transfer_read_iov ( uint32_t handle , uint32_t ctx_id ,
int virgl_renderer_transfer_read_iov ( uint32_t handle , uint32_t ctx_id ,
@ -198,8 +214,12 @@ int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id,
uint64_t offset , struct iovec * iovec ,
uint64_t offset , struct iovec * iovec ,
int iovec_cnt )
int iovec_cnt )
{
{
struct virgl_resource * res = virgl_resource_lookup ( handle ) ;
struct vrend_transfer_info transfer_info ;
struct vrend_transfer_info transfer_info ;
if ( ! res )
return EINVAL ;
transfer_info . ctx_id = ctx_id ;
transfer_info . ctx_id = ctx_id ;
transfer_info . level = level ;
transfer_info . level = level ;
transfer_info . stride = stride ;
transfer_info . stride = stride ;
@ -211,8 +231,20 @@ int virgl_renderer_transfer_read_iov(uint32_t handle, uint32_t ctx_id,
transfer_info . context0 = true ;
transfer_info . context0 = true ;
transfer_info . synchronized = false ;
transfer_info . synchronized = false ;
return vrend_renderer_transfer_iov ( handle , & transfer_info ,
if ( ctx_id ) {
struct virgl_context * ctx = virgl_context_lookup ( ctx_id ) ;
if ( ! ctx )
return EINVAL ;
return ctx - > transfer_3d ( ctx , res , & transfer_info ,
VIRGL_TRANSFER_FROM_HOST ) ;
VIRGL_TRANSFER_FROM_HOST ) ;
} else {
if ( ! res - > pipe_resource )
return EINVAL ;
return vrend_renderer_transfer_pipe ( res - > pipe_resource , & transfer_info ,
VIRGL_TRANSFER_FROM_HOST ) ;
}
}
}
int virgl_renderer_resource_attach_iov ( int res_handle , struct iovec * iov ,
int virgl_renderer_resource_attach_iov ( int res_handle , struct iovec * iov ,