gpu_session: add import/export of buffers

Add 'export_buffer'/'import_buffer' calls in order to support buffer
sharing between GPU sessions.

Reduce CAP costs for Gpu::Connection from 256 to 32.

issue #4380
This commit is contained in:
Sebastian Sumpf 2022-01-07 17:24:49 +01:00 committed by Norman Feske
parent 567b9dfa39
commit a900594978
2 changed files with 34 additions and 2 deletions

View File

@ -56,6 +56,12 @@ class Gpu::Session_client : public Genode::Rpc_client<Session>
void free_buffer(Gpu::Buffer_id id) override {
call<Rpc_free_buffer>(id); }
Gpu::Buffer_capability export_buffer(Buffer_id id) override {
return call<Rpc_export_buffer>(id); }
void import_buffer(Buffer_capability cap, Buffer_id id) override {
call<Rpc_import_buffer>(cap, id); }
Genode::Dataspace_capability map_buffer(Buffer_id id,
bool aperture,
Mapping_attributes attrs) override {

View File

@ -23,6 +23,7 @@ namespace Gpu {
struct Buffer;
using Buffer_id = Genode::Id_space<Buffer>::Id;
using Buffer_capability = Genode::Capability<Buffer>;
/*
* Attributes for mapping a buffer
@ -72,7 +73,7 @@ struct Gpu::Session : public Genode::Session
struct Conflicting_id : Genode::Exception { };
struct Mapping_buffer_failed : Genode::Exception { };
enum { REQUIRED_QUOTA = 1024 * 1024, CAP_QUOTA = 256, };
enum { REQUIRED_QUOTA = 1024 * 1024, CAP_QUOTA = 32, };
static const char *service_name() { return "Gpu"; }
@ -136,6 +137,26 @@ struct Gpu::Session : public Genode::Session
*/
virtual void free_buffer(Buffer_id id) = 0;
/**
* Export buffer dataspace from GPU session
*
* \param id buffer id of associated buffer
*/
virtual Buffer_capability export_buffer(Buffer_id id) = 0;
/**
* Import buffer dataspace to GPU session
*
* \param cap capability of buffer as retrieved bu 'export_buffer'
* \param id buffer id to be associated to this buffer in the session
*
* \throw Conflicting_id
* \throw Out_of_caps
* \throw Out_of_ram
* \throw Invalid_state (cap is no longer valid)
*/
virtual void import_buffer(Buffer_capability cap, Buffer_id id) = 0;
/**
* Map buffer
*
@ -202,6 +223,10 @@ struct Gpu::Session : public Genode::Session
GENODE_TYPE_LIST(Out_of_caps, Out_of_ram),
Gpu::Buffer_id, Genode::size_t);
GENODE_RPC(Rpc_free_buffer, void, free_buffer, Gpu::Buffer_id);
GENODE_RPC(Rpc_export_buffer, Gpu::Buffer_capability, export_buffer, Gpu::Buffer_id);
GENODE_RPC_THROW(Rpc_import_buffer, void, import_buffer,
GENODE_TYPE_LIST(Out_of_caps, Out_of_ram, Conflicting_id, Invalid_state),
Gpu::Buffer_capability, Gpu::Buffer_id);
GENODE_RPC_THROW(Rpc_map_buffer, Genode::Dataspace_capability, map_buffer,
GENODE_TYPE_LIST(Mapping_buffer_failed, Out_of_caps, Out_of_ram),
Gpu::Buffer_id, bool, Gpu::Mapping_attributes);
@ -217,7 +242,8 @@ struct Gpu::Session : public Genode::Session
GENODE_RPC_INTERFACE(Rpc_info_dataspace, Rpc_exec_buffer,
Rpc_complete, Rpc_completion_sigh, Rpc_alloc_buffer,
Rpc_free_buffer, Rpc_map_buffer, Rpc_unmap_buffer,
Rpc_free_buffer, Rpc_export_buffer, Rpc_import_buffer,
Rpc_map_buffer, Rpc_unmap_buffer,
Rpc_map_buffer_ppgtt, Rpc_unmap_buffer_ppgtt,
Rpc_set_tiling);
};