The open source OpenXR runtime
0
fork

Configure Feed

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

ipc/server_process: Check for swapchain NULL pointer.

Skip rendering when swapchains are invalid.

authored by

Lubosz Sarnecki and committed by
Jakob Bornecrantz
4ad806df 066009c0

+30 -6
+30 -6
src/xrt/ipc/ipc_server_process.c
··· 514 514 } 515 515 } 516 516 517 - static void 517 + static bool 518 518 _update_projection_layer(struct comp_compositor *c, 519 519 volatile struct ipc_client_state *active_client, 520 520 volatile struct ipc_layer_render_state *layer, ··· 522 522 { 523 523 uint32_t lsi = layer->stereo.l.swapchain_index; 524 524 uint32_t rsi = layer->stereo.r.swapchain_index; 525 + 526 + if (active_client->xscs[lsi] == NULL || 527 + active_client->xscs[rsi] == NULL) { 528 + fprintf(stderr, 529 + "ERROR: Invalid swap chain for projection layer.\n"); 530 + return false; 531 + } 532 + 525 533 struct comp_swapchain *cl = comp_swapchain(active_client->xscs[lsi]); 526 534 struct comp_swapchain *cr = comp_swapchain(active_client->xscs[rsi]); 527 535 ··· 531 539 r = &cr->images[layer->stereo.r.image_index]; 532 540 533 541 comp_renderer_set_projection_layer(c->r, l, r, layer->flip_y, i); 542 + 543 + return true; 534 544 } 535 545 536 - static void 546 + static bool 537 547 _update_quad_layer(struct comp_compositor *c, 538 548 volatile struct ipc_client_state *active_client, 539 549 volatile struct ipc_layer_render_state *layer, 540 550 uint32_t i) 541 551 { 542 552 uint32_t sci = layer->quad.swapchain_index; 553 + 554 + if (active_client->xscs[sci] == NULL) { 555 + fprintf(stderr, "ERROR: Invalid swap chain for quad layer.\n"); 556 + return false; 557 + } 558 + 543 559 struct comp_swapchain *sc = comp_swapchain(active_client->xscs[sci]); 544 560 struct comp_swapchain_image *image = NULL; 545 561 image = &sc->images[layer->quad.image_index]; ··· 549 565 550 566 comp_renderer_set_quad_layer(c->r, image, &pose, &size, layer->flip_y, 551 567 i); 568 + 569 + return true; 552 570 } 553 571 554 - static void 572 + static bool 555 573 _update_layers(struct comp_compositor *c, 556 574 volatile struct ipc_client_state *active_client, 557 575 uint32_t *num_layers) ··· 571 589 &render_state->layers[i]; 572 590 switch (layer->type) { 573 591 case IPC_LAYER_STEREO_PROJECTION: { 574 - _update_projection_layer(c, active_client, layer, i); 592 + if (!_update_projection_layer(c, active_client, layer, 593 + i)) 594 + return false; 575 595 break; 576 596 } 577 597 case IPC_LAYER_QUAD: { 578 - _update_quad_layer(c, active_client, layer, i); 598 + if (!_update_quad_layer(c, active_client, layer, i)) 599 + return false; 579 600 break; 580 601 } 581 602 } 582 603 } 604 + return true; 583 605 } 584 606 585 607 static int ··· 631 653 &active_client->render_state; 632 654 633 655 if (render_state->rendering) { 634 - _update_layers(c, active_client, &num_layers); 656 + if (!_update_layers(c, active_client, 657 + &num_layers)) 658 + continue; 635 659 636 660 // set our client state back to waiting. 637 661 render_state->rendering = false;