xrt: Introduce xrt_sub_image and xrt_layer_projection_view_data

This commit is contained in:
Jakob Bornecrantz 2020-06-09 20:31:36 +01:00
parent 259bd52dbd
commit 45c977d199
4 changed files with 50 additions and 32 deletions
src/xrt
compositor/main
include/xrt
ipc
state_trackers/oxr

View file

@ -356,22 +356,25 @@ compositor_layer_commit(struct xrt_compositor *xc)
case XRT_LAYER_QUAD: { case XRT_LAYER_QUAD: {
struct xrt_layer_quad_data *quad = &layer->data.quad; struct xrt_layer_quad_data *quad = &layer->data.quad;
struct comp_swapchain_image *image; struct comp_swapchain_image *image;
image = &layer->scs[0]->images[quad->image_index]; image = &layer->scs[0]->images[quad->sub.image_index];
comp_renderer_set_quad_layer(c->r, image, &quad->pose, comp_renderer_set_quad_layer(c->r, image, &quad->pose,
&quad->size, data->flip_y, &quad->size, data->flip_y,
i, quad->array_index); i, quad->sub.array_index);
} break; } break;
case XRT_LAYER_STEREO_PROJECTION: { case XRT_LAYER_STEREO_PROJECTION: {
struct xrt_layer_stereo_projection_data *stereo = struct xrt_layer_stereo_projection_data *stereo =
&data->stereo; &data->stereo;
struct comp_swapchain_image *right; struct comp_swapchain_image *right;
struct comp_swapchain_image *left; struct comp_swapchain_image *left;
left = &layer->scs[0]->images[stereo->l.image_index]; left =
right = &layer->scs[1]->images[stereo->r.image_index]; &layer->scs[0]->images[stereo->l.sub.image_index];
right =
&layer->scs[1]->images[stereo->r.sub.image_index];
comp_renderer_set_projection_layer( comp_renderer_set_projection_layer(
c->r, left, right, data->flip_y, i, c->r, left, right, data->flip_y, i,
stereo->l.array_index, stereo->r.array_index); stereo->l.sub.array_index,
stereo->r.sub.array_index);
} break; } break;
} }
} }

View file

@ -106,6 +106,18 @@ enum xrt_layer_eye_visibility
XRT_LAYER_EYE_VISIBILITY_BOTH = 0x3, XRT_LAYER_EYE_VISIBILITY_BOTH = 0x3,
}; };
/*!
* Specifies a sub-image in a layer.
*
* @ingroup xrt_iface
*/
struct xrt_sub_image
{
uint32_t image_index;
uint32_t array_index;
struct xrt_rect rect;
};
/*! /*!
* All the pure data bits of a quad layer, the @ref xrt_swapchains and * All the pure data bits of a quad layer, the @ref xrt_swapchains and
* @ref xrt_device are provided outside of this struct. * @ref xrt_device are provided outside of this struct.
@ -116,14 +128,25 @@ struct xrt_layer_quad_data
{ {
enum xrt_layer_eye_visibility visibility; enum xrt_layer_eye_visibility visibility;
uint32_t image_index; struct xrt_sub_image sub;
uint32_t array_index;
struct xrt_rect rect;
struct xrt_pose pose; struct xrt_pose pose;
struct xrt_vec2 size; struct xrt_vec2 size;
}; };
/*!
* All of the pure data bits for a single view in a projection layer.
*
* @ingroup xrt_iface
*/
struct xrt_layer_projection_view_data
{
struct xrt_sub_image sub;
struct xrt_fov fov;
struct xrt_pose pose;
};
/*! /*!
* All the pure data bits of a stereo projection layer, the @ref xrt_swapchains * All the pure data bits of a stereo projection layer, the @ref xrt_swapchains
* and @ref xrt_device are provided outside of this struct. * and @ref xrt_device are provided outside of this struct.
@ -132,15 +155,7 @@ struct xrt_layer_quad_data
*/ */
struct xrt_layer_stereo_projection_data struct xrt_layer_stereo_projection_data
{ {
struct struct xrt_layer_projection_view_data l, r;
{
uint32_t image_index;
uint32_t array_index;
struct xrt_rect rect;
struct xrt_fov fov;
struct xrt_pose pose;
} l, r;
}; };
/*! /*!

View file

@ -115,22 +115,22 @@ ipc_handle_compositor_layer_sync(volatile struct ipc_client_state *cs,
case XRT_LAYER_STEREO_PROJECTION: case XRT_LAYER_STEREO_PROJECTION:
rl->stereo.l.swapchain_index = sl->swapchain_ids[0]; rl->stereo.l.swapchain_index = sl->swapchain_ids[0];
rl->stereo.l.image_index = rl->stereo.l.image_index =
sl->data.stereo.l.image_index; sl->data.stereo.l.sub.image_index;
rl->stereo.r.swapchain_index = sl->swapchain_ids[1]; rl->stereo.r.swapchain_index = sl->swapchain_ids[1];
rl->stereo.r.image_index = rl->stereo.r.image_index =
sl->data.stereo.r.image_index; sl->data.stereo.r.sub.image_index;
rl->stereo.l.array_index = rl->stereo.l.array_index =
sl->data.stereo.l.array_index; sl->data.stereo.l.sub.array_index;
rl->stereo.r.array_index = rl->stereo.r.array_index =
sl->data.stereo.r.array_index; sl->data.stereo.r.sub.array_index;
break; break;
case XRT_LAYER_QUAD: case XRT_LAYER_QUAD:
rl->quad.swapchain_index = sl->swapchain_ids[0]; rl->quad.swapchain_index = sl->swapchain_ids[0];
rl->quad.image_index = sl->data.quad.image_index; rl->quad.image_index = sl->data.quad.sub.image_index;
rl->quad.pose = sl->data.quad.pose; rl->quad.pose = sl->data.quad.pose;
rl->quad.size = sl->data.quad.size; rl->quad.size = sl->data.quad.size;
rl->quad.array_index = sl->data.quad.array_index; rl->quad.array_index = sl->data.quad.sub.array_index;
break; break;
} }
} }

View file

@ -791,9 +791,9 @@ submit_quad_layer(struct xrt_compositor *xc,
struct xrt_rect *rect = (struct xrt_rect *)&quad->subImage.imageRect; struct xrt_rect *rect = (struct xrt_rect *)&quad->subImage.imageRect;
data.quad.visibility = convert_eye_visibility(quad->eyeVisibility); data.quad.visibility = convert_eye_visibility(quad->eyeVisibility);
data.quad.image_index = sc->released.index; data.quad.sub.image_index = sc->released.index;
data.quad.array_index = quad->subImage.imageArrayIndex; data.quad.sub.array_index = quad->subImage.imageArrayIndex;
data.quad.rect = *rect; data.quad.sub.rect = *rect;
data.quad.pose = pose; data.quad.pose = pose;
data.quad.size = *size; data.quad.size = *size;
@ -841,15 +841,15 @@ submit_projection_layer(struct xrt_compositor *xc,
data.timestamp = timestamp; data.timestamp = timestamp;
data.flags = flags; data.flags = flags;
data.stereo.l.image_index = scs[0]->released.index; data.stereo.l.sub.image_index = scs[0]->released.index;
data.stereo.l.array_index = proj->views[0].subImage.imageArrayIndex; data.stereo.l.sub.array_index = proj->views[0].subImage.imageArrayIndex;
data.stereo.l.rect = *l_rect; data.stereo.l.sub.rect = *l_rect;
data.stereo.l.fov = *l_fov; data.stereo.l.fov = *l_fov;
data.stereo.l.pose = pose[0]; data.stereo.l.pose = pose[0];
data.stereo.r.image_index = scs[1]->released.index; data.stereo.r.sub.image_index = scs[1]->released.index;
data.stereo.r.array_index = proj->views[1].subImage.imageArrayIndex; data.stereo.r.sub.array_index = proj->views[1].subImage.imageArrayIndex;
data.stereo.r.rect = *r_rect; data.stereo.r.sub.rect = *r_rect;
data.stereo.r.fov = *r_fov; data.stereo.r.fov = *r_fov;
data.stereo.r.pose = pose[1]; data.stereo.r.pose = pose[1];