mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-02-03 12:28:07 +00:00
d/ohmd: Refactor quirking code
This commit is contained in:
parent
79d7555449
commit
8675142e32
|
@ -167,6 +167,7 @@ struct display_info
|
||||||
float h_meters;
|
float h_meters;
|
||||||
int w_pixels;
|
int w_pixels;
|
||||||
int h_pixels;
|
int h_pixels;
|
||||||
|
float nominal_frame_interval_ns;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct device_info
|
struct device_info
|
||||||
|
@ -189,10 +190,20 @@ struct device_info
|
||||||
float lens_center_x_meters;
|
float lens_center_x_meters;
|
||||||
float lens_center_y_meters;
|
float lens_center_y_meters;
|
||||||
} views[2];
|
} views[2];
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
bool rotate_right;
|
||||||
|
bool rotate_inwards;
|
||||||
|
bool video_see_through;
|
||||||
|
bool video_distortion_none;
|
||||||
|
bool video_distortion_vive;
|
||||||
|
bool left_center_pano_scale;
|
||||||
|
} quirks;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct device_info
|
static struct device_info
|
||||||
get_info(struct oh_device *ohd)
|
get_info(struct oh_device *ohd, const char *prod)
|
||||||
{
|
{
|
||||||
struct device_info info = {0};
|
struct device_info info = {0};
|
||||||
|
|
||||||
|
@ -208,6 +219,38 @@ get_info(struct oh_device *ohd)
|
||||||
ohmd_device_getf(ohd->dev, OHMD_UNIVERSAL_DISTORTION_K, &info.pano_distortion_k[0]);
|
ohmd_device_getf(ohd->dev, OHMD_UNIVERSAL_DISTORTION_K, &info.pano_distortion_k[0]);
|
||||||
ohmd_device_getf(ohd->dev, OHMD_UNIVERSAL_ABERRATION_K, &info.pano_aberration_k[0]);
|
ohmd_device_getf(ohd->dev, OHMD_UNIVERSAL_ABERRATION_K, &info.pano_aberration_k[0]);
|
||||||
|
|
||||||
|
// Default to 90FPS
|
||||||
|
info.display.nominal_frame_interval_ns =
|
||||||
|
time_s_to_ns(1.0f / 90.0f);
|
||||||
|
|
||||||
|
// Find any needed quirks.
|
||||||
|
if (strcmp(prod, "3Glasses-D3V2") == 0) {
|
||||||
|
info.quirks.rotate_right = true;
|
||||||
|
info.quirks.left_center_pano_scale = true;
|
||||||
|
|
||||||
|
// 70.43 FPS
|
||||||
|
info.display.nominal_frame_interval_ns =
|
||||||
|
time_s_to_ns(1.0f / 70.43f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(prod, "HTC Vive") == 0) {
|
||||||
|
info.quirks.video_distortion_vive = true;
|
||||||
|
info.quirks.video_see_through = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(prod, "LGR100") == 0) {
|
||||||
|
info.quirks.rotate_inwards = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(prod, "External Device") == 0) {
|
||||||
|
info.quirks.video_distortion_none = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(prod, "PSVR") == 0) {
|
||||||
|
info.quirks.video_distortion_none = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Assumptions made here:
|
* Assumptions made here:
|
||||||
*
|
*
|
||||||
|
@ -282,7 +325,7 @@ oh_device_create(ohmd_context *ctx,
|
||||||
|
|
||||||
snprintf(ohd->base.name, XRT_DEVICE_NAME_LEN, "%s", prod);
|
snprintf(ohd->base.name, XRT_DEVICE_NAME_LEN, "%s", prod);
|
||||||
|
|
||||||
const struct device_info info = get_info(ohd);
|
const struct device_info info = get_info(ohd, prod);
|
||||||
|
|
||||||
{
|
{
|
||||||
/* right eye */
|
/* right eye */
|
||||||
|
@ -318,6 +361,7 @@ oh_device_create(ohmd_context *ctx,
|
||||||
ohd->base.distortion.preferred = XRT_DISTORTION_MODEL_PANOTOOLS;
|
ohd->base.distortion.preferred = XRT_DISTORTION_MODEL_PANOTOOLS;
|
||||||
ohd->base.screens[0].w_pixels = info.display.w_pixels;
|
ohd->base.screens[0].w_pixels = info.display.w_pixels;
|
||||||
ohd->base.screens[0].h_pixels = info.display.h_pixels;
|
ohd->base.screens[0].h_pixels = info.display.h_pixels;
|
||||||
|
ohd->base.screens[0].nominal_frame_interval_ns = info.display.nominal_frame_interval_ns;
|
||||||
ohd->base.distortion.pano.distortion_k[0] = info.pano_distortion_k[0];
|
ohd->base.distortion.pano.distortion_k[0] = info.pano_distortion_k[0];
|
||||||
ohd->base.distortion.pano.distortion_k[1] = info.pano_distortion_k[1];
|
ohd->base.distortion.pano.distortion_k[1] = info.pano_distortion_k[1];
|
||||||
ohd->base.distortion.pano.distortion_k[2] = info.pano_distortion_k[2];
|
ohd->base.distortion.pano.distortion_k[2] = info.pano_distortion_k[2];
|
||||||
|
@ -354,52 +398,14 @@ oh_device_create(ohmd_context *ctx,
|
||||||
ohd->base.views[1].rot = u_device_rotation_ident;
|
ohd->base.views[1].rot = u_device_rotation_ident;
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
// Default to 90FPS
|
|
||||||
ohd->base.screens[0].nominal_frame_interval_ns =
|
|
||||||
time_s_to_ns(1.0f / 90.0f);
|
|
||||||
|
|
||||||
// Find any needed quirks.
|
|
||||||
bool quirk_rotate_right = false;
|
|
||||||
bool quirk_rotate_inwards = false;
|
|
||||||
bool quirk_video_see_through = false;
|
|
||||||
bool quirk_video_distortion_none = false;
|
|
||||||
bool quirk_video_distortion_vive = false;
|
|
||||||
bool quirk_left_center_pano_scale = false;
|
|
||||||
|
|
||||||
// Needs to be rotated.
|
|
||||||
if (strcmp(prod, "3Glasses-D3V2") == 0) {
|
|
||||||
quirk_rotate_right = true;
|
|
||||||
quirk_left_center_pano_scale = true;
|
|
||||||
// 70.43 FPS
|
|
||||||
ohd->base.screens[0].nominal_frame_interval_ns =
|
|
||||||
time_s_to_ns(1.0f / 70.43f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(prod, "HTC Vive") == 0) {
|
|
||||||
quirk_video_distortion_vive = true;
|
|
||||||
quirk_video_see_through = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(prod, "LGR100") == 0) {
|
|
||||||
quirk_rotate_inwards = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(prod, "External Device") == 0) {
|
|
||||||
quirk_video_distortion_none = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(prod, "PSVR") == 0) {
|
|
||||||
quirk_video_distortion_none = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Which blend modes does the device support.
|
// Which blend modes does the device support.
|
||||||
ohd->base.blend_mode = XRT_BLEND_MODE_OPAQUE;
|
ohd->base.blend_mode = XRT_BLEND_MODE_OPAQUE;
|
||||||
if (quirk_video_see_through) {
|
if (info.quirks.video_see_through) {
|
||||||
ohd->base.blend_mode = (enum xrt_blend_mode)(
|
ohd->base.blend_mode = (enum xrt_blend_mode)(
|
||||||
ohd->base.blend_mode | XRT_BLEND_MODE_ALPHA_BLEND);
|
ohd->base.blend_mode | XRT_BLEND_MODE_ALPHA_BLEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quirk_video_distortion_vive) {
|
if (info.quirks.video_distortion_vive) {
|
||||||
ohd->base.distortion.models = (enum xrt_distortion_model)(
|
ohd->base.distortion.models = (enum xrt_distortion_model)(
|
||||||
ohd->base.distortion.models | XRT_DISTORTION_MODEL_VIVE);
|
ohd->base.distortion.models | XRT_DISTORTION_MODEL_VIVE);
|
||||||
ohd->base.distortion.preferred = XRT_DISTORTION_MODEL_VIVE;
|
ohd->base.distortion.preferred = XRT_DISTORTION_MODEL_VIVE;
|
||||||
|
@ -449,17 +455,17 @@ oh_device_create(ohmd_context *ctx,
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quirk_video_distortion_none) {
|
if (info.quirks.video_distortion_none) {
|
||||||
ohd->base.distortion.models = XRT_DISTORTION_MODEL_NONE;
|
ohd->base.distortion.models = XRT_DISTORTION_MODEL_NONE;
|
||||||
ohd->base.distortion.preferred = XRT_DISTORTION_MODEL_NONE;
|
ohd->base.distortion.preferred = XRT_DISTORTION_MODEL_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quirk_left_center_pano_scale) {
|
if (info.quirks.left_center_pano_scale) {
|
||||||
ohd->base.distortion.pano.warp_scale =
|
ohd->base.distortion.pano.warp_scale =
|
||||||
info.views[0].lens_center_x_meters;
|
info.views[0].lens_center_x_meters;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quirk_rotate_right) {
|
if (info.quirks.rotate_right) {
|
||||||
int w = info.display.w_pixels;
|
int w = info.display.w_pixels;
|
||||||
int h = info.display.h_pixels;
|
int h = info.display.h_pixels;
|
||||||
|
|
||||||
|
@ -479,7 +485,7 @@ oh_device_create(ohmd_context *ctx,
|
||||||
ohd->base.views[1].rot = u_device_rotation_right;
|
ohd->base.views[1].rot = u_device_rotation_right;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quirk_rotate_inwards) {
|
if (info.quirks.rotate_inwards) {
|
||||||
int w2 = info.display.w_pixels / 2;
|
int w2 = info.display.w_pixels / 2;
|
||||||
int h = info.display.h_pixels;
|
int h = info.display.h_pixels;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue