diff --git a/repos/os/include/gpu_session/client.h b/repos/os/include/gpu_session/client.h index f9bf79f13d..f98d6bda2b 100644 --- a/repos/os/include/gpu_session/client.h +++ b/repos/os/include/gpu_session/client.h @@ -56,6 +56,12 @@ class Gpu::Session_client : public Genode::Rpc_client void free_buffer(Gpu::Buffer_id id) override { call(id); } + Gpu::Buffer_capability export_buffer(Buffer_id id) override { + return call(id); } + + void import_buffer(Buffer_capability cap, Buffer_id id) override { + call(cap, id); } + Genode::Dataspace_capability map_buffer(Buffer_id id, bool aperture, Mapping_attributes attrs) override { diff --git a/repos/os/include/gpu_session/gpu_session.h b/repos/os/include/gpu_session/gpu_session.h index 0008ddbef9..bb2547a828 100644 --- a/repos/os/include/gpu_session/gpu_session.h +++ b/repos/os/include/gpu_session/gpu_session.h @@ -23,6 +23,7 @@ namespace Gpu { struct Buffer; using Buffer_id = Genode::Id_space::Id; + using Buffer_capability = Genode::Capability; /* * 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); };