diff --git a/src/xrt/auxiliary/util/u_system.c b/src/xrt/auxiliary/util/u_system.c index 1f06d61c8..8f124ab72 100644 --- a/src/xrt/auxiliary/util/u_system.c +++ b/src/xrt/auxiliary/util/u_system.c @@ -16,6 +16,7 @@ #include "util/u_misc.h" #include "util/u_logging.h" +#include /* * @@ -213,3 +214,11 @@ u_system_set_system_compositor(struct u_system *usys, struct xrt_system_composit usys->xsysc = xsysc; } + +void +u_system_fill_properties(struct u_system *usys, const char *name) +{ + usys->base.properties.vendor_id = 42; + // The magical 247 number, is to silence warnings. + snprintf(usys->base.properties.name, XRT_MAX_SYSTEM_NAME_SIZE, "Monado: %.*s", 247, name); +} diff --git a/src/xrt/auxiliary/util/u_system.h b/src/xrt/auxiliary/util/u_system.h index 88baf1dff..ad6f88346 100644 --- a/src/xrt/auxiliary/util/u_system.h +++ b/src/xrt/auxiliary/util/u_system.h @@ -109,6 +109,15 @@ u_system_broadcast_event(struct u_system *usys, const union xrt_session_event *x void u_system_set_system_compositor(struct u_system *usys, struct xrt_system_compositor *xsysc); +/*! + * Fill system properties. + * + * @public @memberof u_system + * @ingroup aux_util + */ +void +u_system_fill_properties(struct u_system *usys, const char *name); + /*! * Destroy an @ref u_system_create allocated @ref u_system - helper function. * diff --git a/src/xrt/include/xrt/xrt_system.h b/src/xrt/include/xrt/xrt_system.h index 0e22d25f7..4a8ac9e93 100644 --- a/src/xrt/include/xrt/xrt_system.h +++ b/src/xrt/include/xrt/xrt_system.h @@ -32,6 +32,19 @@ struct xrt_session_info; * */ +#define XRT_SYSTEM_ID 1 + +#define XRT_MAX_SYSTEM_NAME_SIZE 256 + +/*! + * Properties provided by the system. + */ +struct xrt_system_properties +{ + uint32_t vendor_id; + char name[XRT_MAX_SYSTEM_NAME_SIZE]; +}; + /*! * A system is a collection of devices, policies and optionally a compositor * that is organised into a chosive group that is usable by one user, most of @@ -69,6 +82,8 @@ struct xrt_system * @param xsys Pointer to self */ void (*destroy)(struct xrt_system *xsys); + + struct xrt_system_properties properties; }; /*! diff --git a/src/xrt/ipc/client/ipc_client_system.c b/src/xrt/ipc/client/ipc_client_system.c index 64133eb50..889ab53bc 100644 --- a/src/xrt/ipc/client/ipc_client_system.c +++ b/src/xrt/ipc/client/ipc_client_system.c @@ -13,6 +13,7 @@ #include "ipc_client_generated.h" +#include /*! * IPC client implementation of @ref xrt_system. @@ -134,6 +135,8 @@ struct xrt_system * ipc_client_system_create(struct ipc_connection *ipc_c, struct xrt_system_compositor *xsysc) { struct ipc_client_system *icsys = U_TYPED_CALLOC(struct ipc_client_system); + xrt_result_t xret = ipc_call_system_get_properties(ipc_c, &icsys->base.properties); + assert(xret == XRT_SUCCESS); icsys->base.create_session = ipc_client_system_create_session; icsys->base.destroy = ipc_client_system_destroy; icsys->ipc_c = ipc_c; diff --git a/src/xrt/ipc/server/ipc_server.h b/src/xrt/ipc/server/ipc_server.h index 0a4087000..d225c5071 100644 --- a/src/xrt/ipc/server/ipc_server.h +++ b/src/xrt/ipc/server/ipc_server.h @@ -461,6 +461,9 @@ ipc_server_handle_failure(struct ipc_server *vs); */ void ipc_server_handle_shutdown_signal(struct ipc_server *vs); + +xrt_result_t +ipc_server_get_system_properties(struct ipc_server *vs, struct xrt_system_properties *out_properties); //! @} /* diff --git a/src/xrt/ipc/server/ipc_server_handler.c b/src/xrt/ipc/server/ipc_server_handler.c index 7c842b1ec..870d6911e 100644 --- a/src/xrt/ipc/server/ipc_server_handler.c +++ b/src/xrt/ipc/server/ipc_server_handler.c @@ -1143,6 +1143,14 @@ ipc_handle_system_get_clients(volatile struct ipc_client_state *_ics, struct ipc return XRT_SUCCESS; } +xrt_result_t +ipc_handle_system_get_properties(volatile struct ipc_client_state *_ics, struct xrt_system_properties *out_properties) +{ + struct ipc_server *s = _ics->server; + + return ipc_server_get_system_properties(s, out_properties); +} + xrt_result_t ipc_handle_system_get_client_info(volatile struct ipc_client_state *_ics, uint32_t client_id, diff --git a/src/xrt/ipc/server/ipc_server_process.c b/src/xrt/ipc/server/ipc_server_process.c index 04a9bd3cd..443c144c5 100644 --- a/src/xrt/ipc/server/ipc_server_process.c +++ b/src/xrt/ipc/server/ipc_server_process.c @@ -965,6 +965,13 @@ ipc_server_handle_client_connected(struct ipc_server *vs, xrt_ipc_handle_t ipc_h os_mutex_unlock(&vs->global_state.lock); } +xrt_result_t +ipc_server_get_system_properties(struct ipc_server *vs, struct xrt_system_properties *out_properties) +{ + memcpy(out_properties, &vs->xsys->properties, sizeof(*out_properties)); + return XRT_SUCCESS; +} + #ifndef XRT_OS_ANDROID int ipc_server_main(int argc, char **argv) diff --git a/src/xrt/ipc/shared/proto.json b/src/xrt/ipc/shared/proto.json index f9c8810a2..95292afa8 100644 --- a/src/xrt/ipc/shared/proto.json +++ b/src/xrt/ipc/shared/proto.json @@ -11,6 +11,12 @@ ] }, + "system_get_properties": { + "out": [ + {"name": "properties", "type": "struct xrt_system_properties"} + ] + }, + "system_get_client_info": { "in": [ {"name": "id", "type": "uint32_t"} diff --git a/src/xrt/state_trackers/oxr/oxr_instance.c b/src/xrt/state_trackers/oxr/oxr_instance.c index 8502a922a..c5d23d25f 100644 --- a/src/xrt/state_trackers/oxr/oxr_instance.c +++ b/src/xrt/state_trackers/oxr/oxr_instance.c @@ -350,7 +350,7 @@ oxr_instance_create(struct oxr_logger *log, return ret; } - ret = oxr_system_fill_in(log, inst, 1, &inst->system); + ret = oxr_system_fill_in(log, inst, XRT_SYSTEM_ID, &inst->system); if (ret != XR_SUCCESS) { oxr_instance_destroy(log, &inst->handle); return ret; diff --git a/src/xrt/state_trackers/oxr/oxr_system.c b/src/xrt/state_trackers/oxr/oxr_system.c index e277713ab..ad518186e 100644 --- a/src/xrt/state_trackers/oxr/oxr_system.c +++ b/src/xrt/state_trackers/oxr/oxr_system.c @@ -83,7 +83,7 @@ oxr_system_select(struct oxr_logger *log, XrResult oxr_system_verify_id(struct oxr_logger *log, const struct oxr_instance *inst, XrSystemId systemId) { - if (systemId != 1) { + if (systemId != XRT_SYSTEM_ID) { return oxr_error(log, XR_ERROR_SYSTEM_INVALID, "Invalid system %" PRIu64, systemId); } return XR_SUCCESS; @@ -272,14 +272,12 @@ oxr_system_get_force_feedback_support(struct oxr_logger *log, struct oxr_instanc XrResult oxr_system_get_properties(struct oxr_logger *log, struct oxr_system *sys, XrSystemProperties *properties) { - properties->vendorId = 42; properties->systemId = sys->systemId; + properties->vendorId = sys->xsys->properties.vendor_id; + memcpy(properties->systemName, sys->xsys->properties.name, sizeof(properties->systemName)); struct xrt_device *xdev = GET_XDEV_BY_ROLE(sys, head); - // The magical 247 number, is to silence warnings. - snprintf(properties->systemName, XR_MAX_SYSTEM_NAME_SIZE, "Monado: %.*s", 247, xdev->str); - // Get from compositor. struct xrt_system_compositor_info *info = sys->xsysc ? &sys->xsysc->info : NULL; diff --git a/src/xrt/targets/common/target_instance.c b/src/xrt/targets/common/target_instance.c index a495df885..27afda750 100644 --- a/src/xrt/targets/common/target_instance.c +++ b/src/xrt/targets/common/target_instance.c @@ -86,6 +86,7 @@ t_instance_create_system(struct xrt_instance *xinst, } struct xrt_device *head = xsysd->static_roles.head; + u_system_fill_properties(usys, head->str); bool use_null = debug_get_bool_option_use_null(); diff --git a/src/xrt/targets/common/target_instance_no_comp.c b/src/xrt/targets/common/target_instance_no_comp.c index 650f69dcd..8179861f0 100644 --- a/src/xrt/targets/common/target_instance_no_comp.c +++ b/src/xrt/targets/common/target_instance_no_comp.c @@ -56,6 +56,7 @@ t_instance_create_system(struct xrt_instance *xinst, return xret; } + u_system_fill_properties(usys, xsysd->static_roles.head->str); *out_xsys = &usys->base; *out_xsysd = xsysd; *out_xso = xso; diff --git a/src/xrt/targets/sdl_test/sdl_instance.c b/src/xrt/targets/sdl_test/sdl_instance.c index 34fedd4e4..d8d210ae8 100644 --- a/src/xrt/targets/sdl_test/sdl_instance.c +++ b/src/xrt/targets/sdl_test/sdl_instance.c @@ -82,6 +82,7 @@ sdl_instance_create_system(struct xrt_instance *xinst, struct sdl_program *sp = from_xinst(xinst); + u_system_fill_properties(sp->usys, sp->xsysd_base.static_roles.head->str); *out_xsys = &sp->usys->base; *out_xsysd = &sp->xsysd_base; *out_xso = sp->xso;