mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-04 06:06:17 +00:00
c/compositor: Render multiple layers without IPC.
Hook up layer rendering when XRT_FEATURE_SERVICE is not set.
This commit is contained in:
parent
4ad806df38
commit
1e8106c974
|
@ -286,6 +286,7 @@ compositor_layer_begin(struct xrt_compositor *xc,
|
||||||
uint32_t slot_id = 0;
|
uint32_t slot_id = 0;
|
||||||
|
|
||||||
c->slots[slot_id].env_blend_mode = env_blend_mode;
|
c->slots[slot_id].env_blend_mode = env_blend_mode;
|
||||||
|
c->slots[slot_id].num_layers = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -310,9 +311,9 @@ compositor_layer_stereo_projection(struct xrt_compositor *xc,
|
||||||
{
|
{
|
||||||
struct comp_compositor *c = comp_compositor(xc);
|
struct comp_compositor *c = comp_compositor(xc);
|
||||||
|
|
||||||
// Always zero for now.
|
// Without IPC we only have one slot
|
||||||
uint32_t slot_id = 0;
|
uint32_t slot_id = 0;
|
||||||
uint32_t layer_id = 0;
|
uint32_t layer_id = c->slots[slot_id].num_layers;
|
||||||
|
|
||||||
struct comp_layer *layer = &c->slots[slot_id].layers[layer_id];
|
struct comp_layer *layer = &c->slots[slot_id].layers[layer_id];
|
||||||
layer->stereo.l.sc = comp_swapchain(l_sc);
|
layer->stereo.l.sc = comp_swapchain(l_sc);
|
||||||
|
@ -321,6 +322,12 @@ compositor_layer_stereo_projection(struct xrt_compositor *xc,
|
||||||
layer->stereo.r.sc = comp_swapchain(r_sc);
|
layer->stereo.r.sc = comp_swapchain(r_sc);
|
||||||
layer->stereo.r.image_index = r_image_index;
|
layer->stereo.r.image_index = r_image_index;
|
||||||
layer->stereo.r.array_index = r_array_index;
|
layer->stereo.r.array_index = r_array_index;
|
||||||
|
|
||||||
|
layer->flags = layer_flags;
|
||||||
|
layer->flip_y = flip_y;
|
||||||
|
layer->type = COMP_LAYER_STEREO_PROJECTION;
|
||||||
|
|
||||||
|
c->slots[slot_id].num_layers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -338,7 +345,26 @@ compositor_layer_quad(struct xrt_compositor *xc,
|
||||||
struct xrt_vec2 *size,
|
struct xrt_vec2 *size,
|
||||||
bool flip_y)
|
bool flip_y)
|
||||||
{
|
{
|
||||||
// Noop!
|
struct comp_compositor *c = comp_compositor(xc);
|
||||||
|
|
||||||
|
// Without IPC we only have one slot
|
||||||
|
uint32_t slot_id = 0;
|
||||||
|
uint32_t layer_id = c->slots[slot_id].num_layers;
|
||||||
|
|
||||||
|
struct comp_layer *layer = &c->slots[slot_id].layers[layer_id];
|
||||||
|
layer->quad.sc = comp_swapchain(sc);
|
||||||
|
layer->quad.visibility = visibility;
|
||||||
|
layer->quad.image_index = image_index;
|
||||||
|
layer->quad.rect = *rect;
|
||||||
|
layer->quad.array_index = array_index;
|
||||||
|
layer->quad.pose = *pose;
|
||||||
|
layer->quad.size = *size;
|
||||||
|
|
||||||
|
layer->flags = layer_flags;
|
||||||
|
layer->flip_y = flip_y;
|
||||||
|
layer->type = COMP_LAYER_QUAD;
|
||||||
|
|
||||||
|
c->slots[slot_id].num_layers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -348,23 +374,36 @@ compositor_layer_commit(struct xrt_compositor *xc)
|
||||||
|
|
||||||
COMP_SPEW(c, "LAYER_COMMIT");
|
COMP_SPEW(c, "LAYER_COMMIT");
|
||||||
|
|
||||||
struct comp_swapchain_image *right;
|
|
||||||
struct comp_swapchain_image *left;
|
|
||||||
|
|
||||||
// Always zero for now.
|
// Always zero for now.
|
||||||
uint32_t slot_id = 0;
|
uint32_t slot_id = 0;
|
||||||
uint32_t layer_id = 0;
|
uint32_t num_layers = c->slots[slot_id].num_layers;
|
||||||
|
|
||||||
struct comp_layer *layer = &c->slots[slot_id].layers[layer_id];
|
|
||||||
struct comp_layer_stereo *stereo = &layer->stereo;
|
|
||||||
|
|
||||||
left = &stereo->l.sc->images[stereo->l.image_index];
|
|
||||||
right = &stereo->l.sc->images[stereo->r.image_index];
|
|
||||||
|
|
||||||
comp_renderer_destroy_layers(c->r);
|
comp_renderer_destroy_layers(c->r);
|
||||||
comp_renderer_allocate_layers(c->r, 1);
|
comp_renderer_allocate_layers(c->r, num_layers);
|
||||||
|
|
||||||
comp_renderer_set_projection_layer(c->r, left, right, layer->flip_y, 0);
|
for (uint32_t i = 0; i < num_layers; i++) {
|
||||||
|
struct comp_layer *layer = &c->slots[slot_id].layers[i];
|
||||||
|
switch (layer->type) {
|
||||||
|
case COMP_LAYER_QUAD: {
|
||||||
|
struct comp_layer_quad *quad = &layer->quad;
|
||||||
|
struct comp_swapchain_image *image;
|
||||||
|
image = &quad->sc->images[quad->image_index];
|
||||||
|
comp_renderer_set_quad_layer(c->r, image, &quad->pose,
|
||||||
|
&quad->size, layer->flip_y,
|
||||||
|
i);
|
||||||
|
} break;
|
||||||
|
case COMP_LAYER_STEREO_PROJECTION: {
|
||||||
|
struct comp_layer_stereo *stereo = &layer->stereo;
|
||||||
|
struct comp_swapchain_image *right;
|
||||||
|
struct comp_swapchain_image *left;
|
||||||
|
left = &stereo->l.sc->images[stereo->l.image_index];
|
||||||
|
right = &stereo->l.sc->images[stereo->r.image_index];
|
||||||
|
|
||||||
|
comp_renderer_set_projection_layer(c->r, left, right,
|
||||||
|
layer->flip_y, i);
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
comp_renderer_draw(c->r);
|
comp_renderer_draw(c->r);
|
||||||
|
|
||||||
|
|
|
@ -73,13 +73,19 @@ enum comp_layer_type
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* A stereo projection layer.
|
* A quad layer.
|
||||||
*
|
*
|
||||||
* @ingroup comp_main
|
* @ingroup comp_main
|
||||||
*/
|
*/
|
||||||
struct comp_layer_quad
|
struct comp_layer_quad
|
||||||
{
|
{
|
||||||
struct comp_swapchain *sc;
|
struct comp_swapchain *sc;
|
||||||
|
enum xrt_layer_eye_visibility visibility;
|
||||||
|
uint32_t image_index;
|
||||||
|
struct xrt_rect rect;
|
||||||
|
uint32_t array_index;
|
||||||
|
struct xrt_pose pose;
|
||||||
|
struct xrt_vec2 size;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -106,6 +112,7 @@ struct comp_layer
|
||||||
{
|
{
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
enum xrt_layer_composition_flags flags;
|
enum xrt_layer_composition_flags flags;
|
||||||
|
enum comp_layer_type type;
|
||||||
bool flip_y;
|
bool flip_y;
|
||||||
union {
|
union {
|
||||||
struct comp_layer_quad quad;
|
struct comp_layer_quad quad;
|
||||||
|
@ -123,6 +130,8 @@ struct comp_layer_slot
|
||||||
enum xrt_blend_mode env_blend_mode;
|
enum xrt_blend_mode env_blend_mode;
|
||||||
|
|
||||||
struct comp_layer layers[COMP_MAX_LAYERS];
|
struct comp_layer layers[COMP_MAX_LAYERS];
|
||||||
|
|
||||||
|
uint32_t num_layers;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
Loading…
Reference in a new issue