Find DRM output using the non-desktop property (haagch)
This commit is contained in:
@@ -193,6 +193,22 @@ static int drm_find_psvr_xcb(Instance * instance)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// code for xcb_randr_query_output_property heavily inspired by https://github.com/tcatm/xbacklight/blob/master/xbacklight.c
|
||||||
|
xcb_generic_error_t *error;
|
||||||
|
xcb_intern_atom_cookie_t non_desktop_cookie = xcb_intern_atom (instance->connection, 1, strlen("non-desktop"), "non-desktop");
|
||||||
|
xcb_intern_atom_reply_t *non_desktop_reply = xcb_intern_atom_reply (instance->connection, non_desktop_cookie, &error);
|
||||||
|
if (error != NULL || non_desktop_reply == NULL)
|
||||||
|
{
|
||||||
|
int ec = error ? error->error_code : -1;
|
||||||
|
fprintf (stderr, "Intern non-desktop Atom returned error %d\n", ec);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if (non_desktop_reply->atom == XCB_NONE)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "No outputs have non-desktop property\n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
const xcb_setup_t *setup = xcb_get_setup(instance->connection);
|
const xcb_setup_t *setup = xcb_get_setup(instance->connection);
|
||||||
|
|
||||||
int screen = instance->screen;
|
int screen = instance->screen;
|
||||||
@@ -230,28 +246,49 @@ static int drm_find_psvr_xcb(Instance * instance)
|
|||||||
xcb_randr_output_t *ro = xcb_randr_get_screen_resources_outputs(gsr_r);
|
xcb_randr_output_t *ro = xcb_randr_get_screen_resources_outputs(gsr_r);
|
||||||
int o, c;
|
int o, c;
|
||||||
|
|
||||||
int num_outputs = gsr_r->num_outputs;
|
int num_outputs = gsr_r->num_outputs;
|
||||||
|
|
||||||
xcb_randr_output_t output = 0;
|
xcb_randr_output_t output = 0;
|
||||||
|
|
||||||
char * output_name = NULL;
|
unsigned char * output_name = NULL; // currently only used for debug
|
||||||
|
|
||||||
/* Find a connected but idle output */
|
// find HMD display
|
||||||
for (o = 0; o < num_outputs; o++) {
|
for (o = 0; o < num_outputs; o++)
|
||||||
xcb_randr_get_output_info_cookie_t goi_c = xcb_randr_get_output_info(instance->connection, ro[o], config_timestamp);
|
{
|
||||||
|
xcb_randr_get_output_info_cookie_t goi_c = xcb_randr_get_output_info(instance->connection, ro[o], config_timestamp);
|
||||||
|
|
||||||
xcb_randr_get_output_info_reply_t *goi_r = xcb_randr_get_output_info_reply(instance->connection, goi_c, NULL);
|
xcb_randr_get_output_info_reply_t *goi_r = xcb_randr_get_output_info_reply(instance->connection, goi_c, NULL);
|
||||||
|
|
||||||
output_name = xcb_randr_get_output_info_name(goi_r);
|
output_name = xcb_randr_get_output_info_name(goi_r);
|
||||||
|
|
||||||
/* Find the first connected but unused output */
|
/* Find the first output that has the non-desktop property set */
|
||||||
if (goi_r->connection == XCB_RANDR_CONNECTION_CONNECTED &&
|
xcb_randr_get_output_property_cookie_t prop_cookie;
|
||||||
goi_r->crtc == 0) {
|
prop_cookie = xcb_randr_get_output_property (instance->connection, ro[o], non_desktop_reply->atom, XCB_ATOM_NONE, 0, 4, 0, 0);
|
||||||
output = ro[o];
|
xcb_randr_get_output_property_reply_t *prop_reply = NULL;
|
||||||
break;
|
prop_reply = xcb_randr_get_output_property_reply (instance->connection, prop_cookie, &error);
|
||||||
|
if (error != NULL || prop_reply == NULL)
|
||||||
|
{
|
||||||
|
printf ("Getting non-desktop property reply failed\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prop_reply == NULL || prop_reply->type != XCB_ATOM_INTEGER || prop_reply->num_items != 1 || prop_reply->format != 32)
|
||||||
|
{
|
||||||
|
printf ("Wrong non-desktop reply!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int value = *((int32_t *) xcb_randr_get_output_property_data (prop_reply));
|
||||||
|
//printf ("non-desktop: %d\n", value);
|
||||||
|
if (value > 0)
|
||||||
|
{
|
||||||
|
output_name = xcb_randr_get_output_info_name(goi_r);
|
||||||
|
printf ("Using output %s for drm lease!\n", output_name);
|
||||||
|
output = ro[o];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
free(goi_r);
|
free(goi_r);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!output)
|
if (!output)
|
||||||
|
|||||||
Reference in New Issue
Block a user