The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

c/compositor: Render multiple layers without IPC.

Hook up layer rendering when XRT_FEATURE_SERVICE is not set.

authored by

Lubosz Sarnecki and committed by
Jakob Bornecrantz
1e8106c9 4ad806df

+64 -16
+54 -15
src/xrt/compositor/main/comp_compositor.c
··· 286 286 uint32_t slot_id = 0; 287 287 288 288 c->slots[slot_id].env_blend_mode = env_blend_mode; 289 + c->slots[slot_id].num_layers = 0; 289 290 } 290 291 291 292 static void ··· 310 311 { 311 312 struct comp_compositor *c = comp_compositor(xc); 312 313 313 - // Always zero for now. 314 + // Without IPC we only have one slot 314 315 uint32_t slot_id = 0; 315 - uint32_t layer_id = 0; 316 + uint32_t layer_id = c->slots[slot_id].num_layers; 316 317 317 318 struct comp_layer *layer = &c->slots[slot_id].layers[layer_id]; 318 319 layer->stereo.l.sc = comp_swapchain(l_sc); ··· 321 322 layer->stereo.r.sc = comp_swapchain(r_sc); 322 323 layer->stereo.r.image_index = r_image_index; 323 324 layer->stereo.r.array_index = r_array_index; 325 + 326 + layer->flags = layer_flags; 327 + layer->flip_y = flip_y; 328 + layer->type = COMP_LAYER_STEREO_PROJECTION; 329 + 330 + c->slots[slot_id].num_layers++; 324 331 } 325 332 326 333 static void ··· 338 345 struct xrt_vec2 *size, 339 346 bool flip_y) 340 347 { 341 - // Noop! 348 + struct comp_compositor *c = comp_compositor(xc); 349 + 350 + // Without IPC we only have one slot 351 + uint32_t slot_id = 0; 352 + uint32_t layer_id = c->slots[slot_id].num_layers; 353 + 354 + struct comp_layer *layer = &c->slots[slot_id].layers[layer_id]; 355 + layer->quad.sc = comp_swapchain(sc); 356 + layer->quad.visibility = visibility; 357 + layer->quad.image_index = image_index; 358 + layer->quad.rect = *rect; 359 + layer->quad.array_index = array_index; 360 + layer->quad.pose = *pose; 361 + layer->quad.size = *size; 362 + 363 + layer->flags = layer_flags; 364 + layer->flip_y = flip_y; 365 + layer->type = COMP_LAYER_QUAD; 366 + 367 + c->slots[slot_id].num_layers++; 342 368 } 343 369 344 370 static void ··· 347 373 struct comp_compositor *c = comp_compositor(xc); 348 374 349 375 COMP_SPEW(c, "LAYER_COMMIT"); 350 - 351 - struct comp_swapchain_image *right; 352 - struct comp_swapchain_image *left; 353 376 354 377 // Always zero for now. 355 378 uint32_t slot_id = 0; 356 - uint32_t layer_id = 0; 357 - 358 - struct comp_layer *layer = &c->slots[slot_id].layers[layer_id]; 359 - struct comp_layer_stereo *stereo = &layer->stereo; 360 - 361 - left = &stereo->l.sc->images[stereo->l.image_index]; 362 - right = &stereo->l.sc->images[stereo->r.image_index]; 379 + uint32_t num_layers = c->slots[slot_id].num_layers; 363 380 364 381 comp_renderer_destroy_layers(c->r); 365 - comp_renderer_allocate_layers(c->r, 1); 382 + comp_renderer_allocate_layers(c->r, num_layers); 366 383 367 - comp_renderer_set_projection_layer(c->r, left, right, layer->flip_y, 0); 384 + for (uint32_t i = 0; i < num_layers; i++) { 385 + struct comp_layer *layer = &c->slots[slot_id].layers[i]; 386 + switch (layer->type) { 387 + case COMP_LAYER_QUAD: { 388 + struct comp_layer_quad *quad = &layer->quad; 389 + struct comp_swapchain_image *image; 390 + image = &quad->sc->images[quad->image_index]; 391 + comp_renderer_set_quad_layer(c->r, image, &quad->pose, 392 + &quad->size, layer->flip_y, 393 + i); 394 + } break; 395 + case COMP_LAYER_STEREO_PROJECTION: { 396 + struct comp_layer_stereo *stereo = &layer->stereo; 397 + struct comp_swapchain_image *right; 398 + struct comp_swapchain_image *left; 399 + left = &stereo->l.sc->images[stereo->l.image_index]; 400 + right = &stereo->l.sc->images[stereo->r.image_index]; 401 + 402 + comp_renderer_set_projection_layer(c->r, left, right, 403 + layer->flip_y, i); 404 + } break; 405 + } 406 + } 368 407 369 408 comp_renderer_draw(c->r); 370 409
+10 -1
src/xrt/compositor/main/comp_compositor.h
··· 73 73 }; 74 74 75 75 /*! 76 - * A stereo projection layer. 76 + * A quad layer. 77 77 * 78 78 * @ingroup comp_main 79 79 */ 80 80 struct comp_layer_quad 81 81 { 82 82 struct comp_swapchain *sc; 83 + enum xrt_layer_eye_visibility visibility; 84 + uint32_t image_index; 85 + struct xrt_rect rect; 86 + uint32_t array_index; 87 + struct xrt_pose pose; 88 + struct xrt_vec2 size; 83 89 }; 84 90 85 91 /*! ··· 106 112 { 107 113 int64_t timestamp; 108 114 enum xrt_layer_composition_flags flags; 115 + enum comp_layer_type type; 109 116 bool flip_y; 110 117 union { 111 118 struct comp_layer_quad quad; ··· 123 130 enum xrt_blend_mode env_blend_mode; 124 131 125 132 struct comp_layer layers[COMP_MAX_LAYERS]; 133 + 134 + uint32_t num_layers; 126 135 }; 127 136 128 137 /*!