mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-20 17:52:52 +00:00
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:
parent
567b9dfa39
commit
a900594978
@ -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 {
|
||||
|
@ -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);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user