The open source OpenXR runtime

mono: depth layer supporting mono

+233 -270
+15 -16
src/xrt/compositor/client/comp_d3d11_client.cpp
··· 564 564 assert(data->type == XRT_LAYER_PROJECTION); 565 565 566 566 struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 567 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 567 + for (uint32_t i = 0; i < data->view_count; ++i) { 568 568 xscn[i] = as_client_d3d11_swapchain(xsc[i])->xsc.get(); 569 569 } 570 570 ··· 573 573 } 574 574 575 575 static xrt_result_t 576 - client_d3d11_compositor_layer_stereo_projection_depth(struct xrt_compositor *xc, 577 - struct xrt_device *xdev, 578 - struct xrt_swapchain *l_xsc, 579 - struct xrt_swapchain *r_xsc, 580 - struct xrt_swapchain *l_d_xsc, 581 - struct xrt_swapchain *r_d_xsc, 582 - const struct xrt_layer_data *data) 576 + client_d3d11_compositor_layer_projection_depth(struct xrt_compositor *xc, 577 + struct xrt_device *xdev, 578 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 579 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 580 + const struct xrt_layer_data *data) 583 581 { 584 582 struct client_d3d11_compositor *c = as_client_d3d11_compositor(xc); 585 583 586 - assert(data->type == XRT_LAYER_STEREO_PROJECTION_DEPTH); 587 - 588 - struct xrt_swapchain *l_xscn = as_client_d3d11_swapchain(l_xsc)->xsc.get(); 589 - struct xrt_swapchain *r_xscn = as_client_d3d11_swapchain(r_xsc)->xsc.get(); 590 - struct xrt_swapchain *l_d_xscn = as_client_d3d11_swapchain(l_d_xsc)->xsc.get(); 591 - struct xrt_swapchain *r_d_xscn = as_client_d3d11_swapchain(r_d_xsc)->xsc.get(); 584 + assert(data->type == XRT_LAYER_PROJECTION_DEPTH); 585 + struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 586 + struct xrt_swapchain *d_xscn[XRT_MAX_VIEWS]; 587 + for (uint32_t i = 0; i < data->view_count; ++i) { 588 + xscn[i] = as_client_d3d11_swapchain(xsc[i])->xsc.get(); 589 + d_xscn[i] = as_client_d3d11_swapchain(d_xsc[i])->xsc.get(); 590 + } 592 591 593 592 // No flip required: D3D11 swapchain image convention matches Vulkan. 594 - return xrt_comp_layer_stereo_projection_depth(&c->xcn->base, xdev, l_xscn, r_xscn, l_d_xscn, r_d_xscn, data); 593 + return xrt_comp_layer_projection_depth(&c->xcn->base, xdev, xscn, d_xscn, data); 595 594 } 596 595 597 596 static xrt_result_t ··· 881 880 c->base.base.discard_frame = client_d3d11_compositor_discard_frame; 882 881 c->base.base.layer_begin = client_d3d11_compositor_layer_begin; 883 882 c->base.base.layer_projection = client_d3d11_compositor_layer_projection; 884 - c->base.base.layer_stereo_projection_depth = client_d3d11_compositor_layer_stereo_projection_depth; 883 + c->base.base.layer_projection_depth = client_d3d11_compositor_layer_projection_depth; 885 884 c->base.base.layer_quad = client_d3d11_compositor_layer_quad; 886 885 c->base.base.layer_cube = client_d3d11_compositor_layer_cube; 887 886 c->base.base.layer_cylinder = client_d3d11_compositor_layer_cylinder;
+19 -20
src/xrt/compositor/client/comp_d3d12_client.cpp
··· 792 792 assert(data->type == XRT_LAYER_PROJECTION); 793 793 794 794 struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 795 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 795 + for (uint32_t i = 0; i < data->view_count; ++i) { 796 796 xscn[i] = as_client_d3d12_swapchain(xsc[i])->xsc.get(); 797 797 } 798 798 struct xrt_layer_data d = *data; ··· 802 802 } 803 803 804 804 static xrt_result_t 805 - client_d3d12_compositor_layer_stereo_projection_depth(struct xrt_compositor *xc, 806 - struct xrt_device *xdev, 807 - struct xrt_swapchain *l_xsc, 808 - struct xrt_swapchain *r_xsc, 809 - struct xrt_swapchain *l_d_xsc, 810 - struct xrt_swapchain *r_d_xsc, 811 - const struct xrt_layer_data *data) 805 + client_d3d12_compositor_layer_projection_depth(struct xrt_compositor *xc, 806 + struct xrt_device *xdev, 807 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 808 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 809 + const struct xrt_layer_data *data) 812 810 { 813 811 struct client_d3d12_compositor *c = as_client_d3d12_compositor(xc); 814 812 815 - assert(data->type == XRT_LAYER_STEREO_PROJECTION_DEPTH); 813 + assert(data->type == XRT_LAYER_PROJECTION_DEPTH); 816 814 817 - struct xrt_swapchain *l_xscn = as_client_d3d12_swapchain(l_xsc)->xsc.get(); 818 - struct xrt_swapchain *r_xscn = as_client_d3d12_swapchain(r_xsc)->xsc.get(); 819 - struct xrt_swapchain *l_d_xscn = as_client_d3d12_swapchain(l_d_xsc)->xsc.get(); 820 - struct xrt_swapchain *r_d_xscn = as_client_d3d12_swapchain(r_d_xsc)->xsc.get(); 815 + struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 816 + struct xrt_swapchain *d_xscn[XRT_MAX_VIEWS]; 817 + for (uint32_t i = 0; i < data->view_count; ++i) { 818 + xscn[i] = as_client_d3d12_swapchain(xsc[i])->xsc.get(); 819 + d_xscn[i] = as_client_d3d12_swapchain(d_xsc[i])->xsc.get(); 820 + } 821 821 822 822 struct xrt_layer_data d = *data; 823 - client_d3d12_swapchain_scale_rect(l_xsc, &d.stereo_depth.l.sub.norm_rect); 824 - client_d3d12_swapchain_scale_rect(r_xsc, &d.stereo_depth.r.sub.norm_rect); 825 - client_d3d12_swapchain_scale_rect(l_d_xsc, &d.stereo_depth.l_d.sub.norm_rect); 826 - client_d3d12_swapchain_scale_rect(r_d_xsc, &d.stereo_depth.r_d.sub.norm_rect); 827 - 823 + for (uint32_t i = 0; i < data->view_count; ++i) { 824 + client_d3d12_swapchain_scale_rect(xsc[i], &d.depth.v[i].sub.norm_rect); 825 + client_d3d12_swapchain_scale_rect(d_xsc[i], &d.depth.d[i].sub.norm_rect); 826 + } 828 827 // No flip required: D3D12 swapchain image convention matches Vulkan. 829 - return xrt_comp_layer_stereo_projection_depth(&c->xcn->base, xdev, l_xscn, r_xscn, l_d_xscn, r_d_xscn, &d); 828 + return xrt_comp_layer_projection_depth(&c->xcn->base, xdev, xscn, d_xscn, &d); 830 829 } 831 830 832 831 static xrt_result_t ··· 1136 1135 c->base.base.discard_frame = client_d3d12_compositor_discard_frame; 1137 1136 c->base.base.layer_begin = client_d3d12_compositor_layer_begin; 1138 1137 c->base.base.layer_projection = client_d3d12_compositor_layer_projection; 1139 - c->base.base.layer_stereo_projection_depth = client_d3d12_compositor_layer_stereo_projection_depth; 1138 + c->base.base.layer_projection_depth = client_d3d12_compositor_layer_projection_depth; 1140 1139 c->base.base.layer_quad = client_d3d12_compositor_layer_quad; 1141 1140 c->base.base.layer_cube = client_d3d12_compositor_layer_cube; 1142 1141 c->base.base.layer_cylinder = client_d3d12_compositor_layer_cylinder;
+15 -19
src/xrt/compositor/client/comp_gl_client.c
··· 239 239 240 240 xcn = to_native_compositor(xc); 241 241 assert(data->type == XRT_LAYER_PROJECTION); 242 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 242 + for (uint32_t i = 0; i < data->view_count; ++i) { 243 243 xscn[i] = &client_gl_swapchain(xsc[i])->xscn->base; 244 244 } 245 245 struct xrt_layer_data d = *data; ··· 249 249 } 250 250 251 251 static xrt_result_t 252 - client_gl_compositor_layer_stereo_projection_depth(struct xrt_compositor *xc, 253 - struct xrt_device *xdev, 254 - struct xrt_swapchain *l_xsc, 255 - struct xrt_swapchain *r_xsc, 256 - struct xrt_swapchain *l_d_xsc, 257 - struct xrt_swapchain *r_d_xsc, 258 - const struct xrt_layer_data *data) 252 + client_gl_compositor_layer_projection_depth(struct xrt_compositor *xc, 253 + struct xrt_device *xdev, 254 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 255 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 256 + const struct xrt_layer_data *data) 259 257 { 260 258 struct xrt_compositor *xcn; 261 - struct xrt_swapchain *l_xscn; 262 - struct xrt_swapchain *r_xscn; 263 - struct xrt_swapchain *l_d_xscn; 264 - struct xrt_swapchain *r_d_xscn; 259 + struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 260 + struct xrt_swapchain *d_xscn[XRT_MAX_VIEWS]; 265 261 266 - assert(data->type == XRT_LAYER_STEREO_PROJECTION_DEPTH); 262 + assert(data->type == XRT_LAYER_PROJECTION_DEPTH); 267 263 268 264 xcn = to_native_compositor(xc); 269 - l_xscn = to_native_swapchain(l_xsc); 270 - r_xscn = to_native_swapchain(r_xsc); 271 - l_d_xscn = to_native_swapchain(l_d_xsc); 272 - r_d_xscn = to_native_swapchain(r_d_xsc); 265 + for (uint32_t i = 0; i < data->view_count; ++i) { 266 + xscn[i] = to_native_swapchain(xsc[i]); 267 + d_xscn[i] = to_native_swapchain(d_xsc[i]); 268 + } 273 269 274 270 struct xrt_layer_data d = *data; 275 271 d.flip_y = !d.flip_y; 276 272 277 - return xrt_comp_layer_stereo_projection_depth(xcn, xdev, l_xscn, r_xscn, l_d_xscn, r_d_xscn, &d); 273 + return xrt_comp_layer_projection_depth(xcn, xdev, xscn, d_xscn, &d); 278 274 } 279 275 280 276 static xrt_result_t ··· 611 607 c->base.base.discard_frame = client_gl_compositor_discard_frame; 612 608 c->base.base.layer_begin = client_gl_compositor_layer_begin; 613 609 c->base.base.layer_projection = client_gl_compositor_layer_projection; 614 - c->base.base.layer_stereo_projection_depth = client_gl_compositor_layer_stereo_projection_depth; 610 + c->base.base.layer_projection_depth = client_gl_compositor_layer_projection_depth; 615 611 c->base.base.layer_quad = client_gl_compositor_layer_quad; 616 612 c->base.base.layer_cube = client_gl_compositor_layer_cube; 617 613 c->base.base.layer_cylinder = client_gl_compositor_layer_cylinder;
+13 -16
src/xrt/compositor/client/comp_vk_client.c
··· 483 483 struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 484 484 485 485 assert(data->type == XRT_LAYER_PROJECTION); 486 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 486 + for (uint32_t i = 0; i < data->view_count; ++i) { 487 487 xscn[i] = &client_vk_swapchain(xsc[i])->xscn->base; 488 488 } 489 489 ··· 496 496 static xrt_result_t 497 497 client_vk_compositor_layer_stereo_projection_depth(struct xrt_compositor *xc, 498 498 struct xrt_device *xdev, 499 - struct xrt_swapchain *l_xsc, 500 - struct xrt_swapchain *r_xsc, 501 - struct xrt_swapchain *l_d_xsc, 502 - struct xrt_swapchain *r_d_xsc, 499 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 500 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 503 501 const struct xrt_layer_data *data) 504 502 { 505 503 struct xrt_compositor *xcn; 506 - struct xrt_swapchain *l_xscn; 507 - struct xrt_swapchain *r_xscn; 508 - struct xrt_swapchain *l_d_xscn; 509 - struct xrt_swapchain *r_d_xscn; 504 + 505 + struct xrt_swapchain *xscn[XRT_MAX_VIEWS]; 506 + struct xrt_swapchain *d_xscn[XRT_MAX_VIEWS]; 510 507 511 - assert(data->type == XRT_LAYER_STEREO_PROJECTION_DEPTH); 508 + assert(data->type == XRT_LAYER_PROJECTION_DEPTH); 512 509 513 510 xcn = to_native_compositor(xc); 514 - l_xscn = to_native_swapchain(l_xsc); 515 - r_xscn = to_native_swapchain(r_xsc); 516 - l_d_xscn = to_native_swapchain(l_d_xsc); 517 - r_d_xscn = to_native_swapchain(r_d_xsc); 511 + for (uint32_t i = 0; i < data->view_count; ++i) { 512 + xscn[i] = to_native_swapchain(xsc[i]); 513 + d_xscn[i] = to_native_swapchain(d_xsc[i]); 514 + } 518 515 519 - return xrt_comp_layer_stereo_projection_depth(xcn, xdev, l_xscn, r_xscn, l_d_xscn, r_d_xscn, data); 516 + return xrt_comp_layer_projection_depth(xcn, xdev, xscn, d_xscn, data); 520 517 } 521 518 522 519 static xrt_result_t ··· 842 839 c->base.base.discard_frame = client_vk_compositor_discard_frame; 843 840 c->base.base.layer_begin = client_vk_compositor_layer_begin; 844 841 c->base.base.layer_projection = client_vk_compositor_layer_projection; 845 - c->base.base.layer_stereo_projection_depth = client_vk_compositor_layer_stereo_projection_depth; 842 + c->base.base.layer_projection_depth = client_vk_compositor_layer_stereo_projection_depth; 846 843 c->base.base.layer_quad = client_vk_compositor_layer_quad; 847 844 c->base.base.layer_cube = client_vk_compositor_layer_cube; 848 845 c->base.base.layer_cylinder = client_vk_compositor_layer_cylinder;
+1 -1
src/xrt/compositor/main/comp_compositor.c
··· 273 273 274 274 // Handled by the distortion shader. 275 275 if (type != XRT_LAYER_PROJECTION && // 276 - type != XRT_LAYER_STEREO_PROJECTION_DEPTH) { 276 + type != XRT_LAYER_PROJECTION_DEPTH) { 277 277 return false; 278 278 } 279 279
+1 -1
src/xrt/compositor/mock/mock_compositor.cpp
··· 189 189 // mc->base.base.discard_frame = mock_compositor_discard_frame; 190 190 // mc->base.base.layer_begin = mock_compositor_layer_begin; 191 191 // mc->base.base.layer_projection = mock_compositor_layer_projection; 192 - // mc->base.base.layer_stereo_projection_depth = mock_compositor_layer_stereo_projection_depth; 192 + // mc->base.base.layer_projection_depth = mock_compositor_layer_projection_depth; 193 193 // mc->base.base.layer_quad = mock_compositor_layer_quad; 194 194 // mc->base.base.layer_cube = mock_compositor_layer_cube; 195 195 // mc->base.base.layer_cylinder = mock_compositor_layer_cylinder;
+8 -8
src/xrt/compositor/mock/mock_compositor.h
··· 164 164 165 165 /*! 166 166 * Optional function pointer for mock compositor, called during @ref 167 - * xrt_comp_layer_stereo_projection_depth 167 + * xrt_comp_layer_projection_depth 168 168 */ 169 - xrt_result_t (*layer_stereo_projection_depth)(struct mock_compositor *mc, 170 - struct xrt_device *xdev, 171 - struct xrt_swapchain *l_xsc, 172 - struct xrt_swapchain *r_xsc, 173 - struct xrt_swapchain *l_d_xsc, 174 - struct xrt_swapchain *r_d_xsc, 175 - const struct xrt_layer_data *data); 169 + xrt_result_t (*layer_projection_depth)(struct mock_compositor *mc, 170 + struct xrt_device *xdev, 171 + struct xrt_swapchain *l_xsc, 172 + struct xrt_swapchain *r_xsc, 173 + struct xrt_swapchain *l_d_xsc, 174 + struct xrt_swapchain *r_d_xsc, 175 + const struct xrt_layer_data *data); 176 176 177 177 /*! 178 178 * Optional function pointer for mock compositor, called during @ref xrt_comp_layer_quad
+12 -13
src/xrt/compositor/multi/comp_multi_compositor.c
··· 655 655 656 656 size_t index = mc->progress.layer_count++; 657 657 mc->progress.layers[index].xdev = xdev; 658 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 658 + for (uint32_t i = 0; i < data->view_count; ++i) { 659 659 xrt_swapchain_reference(&mc->progress.layers[index].xscs[i], xsc[i]); 660 660 } 661 661 mc->progress.layers[index].data = *data; ··· 664 664 } 665 665 666 666 static xrt_result_t 667 - multi_compositor_layer_stereo_projection_depth(struct xrt_compositor *xc, 668 - struct xrt_device *xdev, 669 - struct xrt_swapchain *l_xsc, 670 - struct xrt_swapchain *r_xsc, 671 - struct xrt_swapchain *l_d_xsc, 672 - struct xrt_swapchain *r_d_xsc, 673 - const struct xrt_layer_data *data) 667 + multi_compositor_layer_projection_depth(struct xrt_compositor *xc, 668 + struct xrt_device *xdev, 669 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 670 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 671 + const struct xrt_layer_data *data) 674 672 { 675 673 struct multi_compositor *mc = multi_compositor(xc); 676 674 677 675 size_t index = mc->progress.layer_count++; 678 676 mc->progress.layers[index].xdev = xdev; 679 - xrt_swapchain_reference(&mc->progress.layers[index].xscs[0], l_xsc); 680 - xrt_swapchain_reference(&mc->progress.layers[index].xscs[1], r_xsc); 681 - xrt_swapchain_reference(&mc->progress.layers[index].xscs[2], l_d_xsc); 682 - xrt_swapchain_reference(&mc->progress.layers[index].xscs[3], r_d_xsc); 677 + 678 + for (uint32_t i = 0; i < data->view_count; ++i) { 679 + xrt_swapchain_reference(&mc->progress.layers[index].xscs[i], xsc[i]); 680 + xrt_swapchain_reference(&mc->progress.layers[index].xscs[i + data->view_count], d_xsc[i]); 681 + } 683 682 mc->progress.layers[index].data = *data; 684 683 685 684 return XRT_SUCCESS; ··· 970 969 mc->base.base.discard_frame = multi_compositor_discard_frame; 971 970 mc->base.base.layer_begin = multi_compositor_layer_begin; 972 971 mc->base.base.layer_projection = multi_compositor_layer_projection; 973 - mc->base.base.layer_stereo_projection_depth = multi_compositor_layer_stereo_projection_depth; 972 + mc->base.base.layer_projection_depth = multi_compositor_layer_projection_depth; 974 973 mc->base.base.layer_quad = multi_compositor_layer_quad; 975 974 mc->base.base.layer_cube = multi_compositor_layer_cube; 976 975 mc->base.base.layer_cylinder = multi_compositor_layer_cylinder;
+16 -12
src/xrt/compositor/multi/comp_multi_system.c
··· 57 57 struct xrt_layer_data *data = (struct xrt_layer_data *)&layer->data; 58 58 59 59 // Do not need to copy the reference, but should verify the pointers for consistency 60 - for (uint32_t j = 0; j < data->proj.view_count; j++) { 60 + for (uint32_t j = 0; j < data->view_count; j++) { 61 61 if (layer->xscs[j] == NULL) { 62 62 U_LOG_E("Invalid swap chain for projection layer #%u!", i); 63 63 return; ··· 79 79 uint32_t i) 80 80 { 81 81 struct xrt_device *xdev = layer->xdev; 82 - struct xrt_swapchain *l_xcs = layer->xscs[0]; 83 - struct xrt_swapchain *r_xcs = layer->xscs[1]; 84 - struct xrt_swapchain *l_d_xcs = layer->xscs[2]; 85 - struct xrt_swapchain *r_d_xcs = layer->xscs[3]; 86 82 87 - if (l_xcs == NULL || r_xcs == NULL || l_d_xcs == NULL || r_d_xcs == NULL) { 88 - U_LOG_E("Invalid swap chain for projection layer #%u!", i); 89 - return; 83 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS]; 84 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS]; 85 + // Cast away 86 + struct xrt_layer_data *data = (struct xrt_layer_data *)&layer->data; 87 + 88 + for (uint32_t j = 0; j < data->view_count; j++) { 89 + xsc[j] = layer->xscs[j]; 90 + d_xsc[j] = layer->xscs[j + data->view_count]; 91 + 92 + if (xsc[j] == NULL || d_xsc[j] == NULL) { 93 + U_LOG_E("Invalid swap chain for projection layer #%u!", i); 94 + return; 95 + } 90 96 } 91 97 92 98 if (xdev == NULL) { ··· 94 100 return; 95 101 } 96 102 97 - // Cast away 98 - struct xrt_layer_data *data = (struct xrt_layer_data *)&layer->data; 99 103 100 - xrt_comp_layer_stereo_projection_depth(xc, xdev, l_xcs, r_xcs, l_d_xcs, r_d_xcs, data); 104 + xrt_comp_layer_projection_depth(xc, xdev, xsc, d_xsc, data); 101 105 } 102 106 103 107 static bool ··· 284 288 285 289 switch (layer->data.type) { 286 290 case XRT_LAYER_PROJECTION: do_projection_layer(xc, mc, layer, i); break; 287 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: do_projection_layer_depth(xc, mc, layer, i); break; 291 + case XRT_LAYER_PROJECTION_DEPTH: do_projection_layer_depth(xc, mc, layer, i); break; 288 292 case XRT_LAYER_QUAD: do_quad_layer(xc, mc, layer, i); break; 289 293 case XRT_LAYER_CUBE: do_cube_layer(xc, mc, layer, i); break; 290 294 case XRT_LAYER_CYLINDER: do_cylinder_layer(xc, mc, layer, i); break;
+2 -2
src/xrt/compositor/shaders/layer.comp
··· 10 10 11 11 //! @todo should this be a spcialization const? 12 12 #define XRT_LAYER_PROJECTION 0 13 - #define XRT_LAYER_STEREO_PROJECTION_DEPTH 1 13 + #define XRT_LAYER_PROJECTION_DEPTH 1 14 14 #define XRT_LAYER_QUAD 2 15 15 #define XRT_LAYER_CUBE 3 16 16 #define XRT_LAYER_CYLINDER 4 ··· 465 465 rgba = do_equirect2(view_uv, layer); 466 466 break; 467 467 case XRT_LAYER_PROJECTION: 468 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: 468 + case XRT_LAYER_PROJECTION_DEPTH: 469 469 rgba = do_projection(view_uv, layer); 470 470 break; 471 471 case XRT_LAYER_QUAD:
+12 -14
src/xrt/compositor/util/comp_base.c
··· 125 125 uint32_t layer_id = cb->slot.layer_count; 126 126 127 127 struct comp_layer *layer = &cb->slot.layers[layer_id]; 128 - assert(ARRAY_SIZE(layer->sc_array) >= data->proj.view_count); 129 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 128 + assert(ARRAY_SIZE(layer->sc_array) >= data->view_count); 129 + for (uint32_t i = 0; i < data->view_count; ++i) { 130 130 layer->sc_array[i] = comp_swapchain(xsc[i]); 131 131 } 132 132 layer->data = *data; ··· 137 137 } 138 138 139 139 static xrt_result_t 140 - base_layer_stereo_projection_depth(struct xrt_compositor *xc, 141 - struct xrt_device *xdev, 142 - struct xrt_swapchain *l_xsc, 143 - struct xrt_swapchain *r_xsc, 144 - struct xrt_swapchain *l_d_xsc, 145 - struct xrt_swapchain *r_d_xsc, 146 - const struct xrt_layer_data *data) 140 + base_layer_projection_depth(struct xrt_compositor *xc, 141 + struct xrt_device *xdev, 142 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 143 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 144 + const struct xrt_layer_data *data) 147 145 { 148 146 struct comp_base *cb = comp_base(xc); 149 147 150 148 uint32_t layer_id = cb->slot.layer_count; 151 149 152 150 struct comp_layer *layer = &cb->slot.layers[layer_id]; 153 - layer->sc_array[0] = comp_swapchain(l_xsc); 154 - layer->sc_array[1] = comp_swapchain(r_xsc); 155 - layer->sc_array[2] = comp_swapchain(l_d_xsc); 156 - layer->sc_array[3] = comp_swapchain(r_d_xsc); 151 + for (uint32_t i = 0; i < data->view_count; ++i) { 152 + layer->sc_array[i] = comp_swapchain(xsc[i]); 153 + layer->sc_array[i + data->view_count] = comp_swapchain(d_xsc[i]); 154 + } 157 155 layer->data = *data; 158 156 159 157 cb->slot.layer_count++; ··· 258 256 cb->base.base.import_fence = base_import_fence; 259 257 cb->base.base.layer_begin = base_layer_begin; 260 258 cb->base.base.layer_projection = base_layer_projection; 261 - cb->base.base.layer_stereo_projection_depth = base_layer_stereo_projection_depth; 259 + cb->base.base.layer_projection_depth = base_layer_projection_depth; 262 260 cb->base.base.layer_quad = base_layer_quad; 263 261 cb->base.base.layer_cube = base_layer_cube; 264 262 cb->base.base.layer_cylinder = base_layer_cylinder;
+11 -10
src/xrt/compositor/util/comp_render_cs.c
··· 131 131 ubo_data->images_samplers[cur_layer + 0].images[0] = cur_image++; 132 132 133 133 // Depth 134 - if (data->type == XRT_LAYER_STEREO_PROJECTION_DEPTH) { 134 + if (data->type == XRT_LAYER_PROJECTION_DEPTH) { 135 135 uint32_t d_array_index = dvd->sub.array_index; 136 136 const struct comp_swapchain_image *d_image = 137 137 &layer->sc_array[sc_array_index + 2]->images[dvd->sub.image_index]; ··· 324 324 } 325 325 326 326 struct render_viewport_data target_viewport_datas[XRT_MAX_VIEWS]; 327 - for (uint32_t i = 0; i < crc->r->view_count; ++i) { 327 + for (uint32_t i = 0; i < d->view_count; ++i) { 328 328 target_viewport_datas[i] = d->views[i].target_viewport_data; 329 329 } 330 330 ··· 525 525 case XRT_LAYER_CYLINDER: required_image_samplers = 1; break; 526 526 case XRT_LAYER_EQUIRECT2: required_image_samplers = 1; break; 527 527 case XRT_LAYER_PROJECTION: required_image_samplers = 1; break; 528 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: required_image_samplers = 2; break; 528 + case XRT_LAYER_PROJECTION_DEPTH: required_image_samplers = 2; break; 529 529 case XRT_LAYER_QUAD: required_image_samplers = 1; break; 530 530 default: 531 531 VK_ERROR(crc->r->vk, "Skipping layer #%u, unknown type: %u", c_layer_i, data->type); ··· 570 570 ubo_data, // ubo_data 571 571 &cur_image); // out_cur_image 572 572 break; 573 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: 573 + case XRT_LAYER_PROJECTION_DEPTH: 574 574 case XRT_LAYER_PROJECTION: { 575 575 do_cs_projection_layer( // 576 576 data, // data ··· 711 711 const struct comp_layer *layer = &layers[i]; 712 712 const struct xrt_layer_projection_data *proj = &layer->data.proj; 713 713 const struct xrt_layer_projection_view_data *vds[XRT_MAX_VIEWS]; 714 - for (uint32_t view = 0; view < crc->r->view_count; ++view) { 714 + for (uint32_t view = 0; view < d->view_count; ++view) { 715 715 vds[view] = &proj->v[view]; 716 716 } 717 717 do_cs_distortion_for_layer( // ··· 719 719 layer, // layer 720 720 vds, // vds 721 721 d); // d 722 - } else if (fast_path && layers[0].data.type == XRT_LAYER_STEREO_PROJECTION_DEPTH) { 722 + } else if (fast_path && layers[0].data.type == XRT_LAYER_PROJECTION_DEPTH) { 723 723 int i = 0; 724 724 const struct comp_layer *layer = &layers[i]; 725 - const struct xrt_layer_stereo_projection_depth_data *stereo = &layer->data.stereo_depth; 726 - const struct xrt_layer_projection_view_data *vds[2]; 727 - vds[0] = &stereo->l; 728 - vds[1] = &stereo->r; 725 + const struct xrt_layer_projection_depth_data *depth = &layer->data.depth; 726 + const struct xrt_layer_projection_view_data *vds[XRT_MAX_VIEWS]; 727 + for (uint32_t view = 0; view < d->view_count; ++view) { 728 + vds[view] = &depth->v[view]; 729 + } 729 730 do_cs_distortion_for_layer( // 730 731 crc, // crc 731 732 layer, // layer
+8 -7
src/xrt/compositor/util/comp_render_gfx.c
··· 562 562 VK_CHK_WITH_GOTO(ret, "do_equirect2_layer", err_layer); 563 563 break; 564 564 case XRT_LAYER_PROJECTION: 565 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: 565 + case XRT_LAYER_PROJECTION_DEPTH: 566 566 ret = do_projection_layer( // 567 567 rr, // rr 568 568 &layers[i], // layer ··· 627 627 state->descriptor_sets[i]); // 628 628 break; 629 629 case XRT_LAYER_PROJECTION: 630 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: 630 + case XRT_LAYER_PROJECTION_DEPTH: 631 631 render_gfx_layer_projection( // 632 632 rr, // 633 633 state->premultiplied_alphas[i], // ··· 827 827 layer, // 828 828 vds); // 829 829 830 - } else if (fast_path && layer->data.type == XRT_LAYER_STEREO_PROJECTION_DEPTH) { 830 + } else if (fast_path && layer->data.type == XRT_LAYER_PROJECTION_DEPTH) { 831 831 // Fast path. 832 - const struct xrt_layer_stereo_projection_depth_data *stereo = &layer->data.stereo_depth; 833 - const struct xrt_layer_projection_view_data *vds[2]; 834 - vds[0] = &stereo->l; 835 - vds[1] = &stereo->r; 832 + const struct xrt_layer_projection_depth_data *depth = &layer->data.depth; 833 + const struct xrt_layer_projection_view_data *vds[XRT_MAX_VIEWS]; 834 + for (uint32_t view = 0; view < d->view_count; ++view) { 835 + vds[view] = &depth->v[view]; 836 + } 836 837 do_mesh_from_proj( // 837 838 rr, // 838 839 d, //
+5 -16
src/xrt/compositor/util/comp_render_helpers.h
··· 52 52 const struct xrt_layer_projection_view_data **out_vd) 53 53 { 54 54 const struct xrt_layer_projection_data *proj = &data->proj; 55 - 56 - if (is_view_index_right(view_index)) { 57 - *out_vd = &proj->v[view_index]; 58 - } else { 59 - *out_vd = &proj->v[view_index]; 60 - } 55 + *out_vd = &proj->v[view_index]; 61 56 } 62 57 63 58 static inline void ··· 66 61 const struct xrt_layer_projection_view_data **out_vd, 67 62 const struct xrt_layer_depth_data **out_dvd) 68 63 { 69 - const struct xrt_layer_stereo_projection_depth_data *stereo = &data->stereo_depth; 70 - 71 - if (is_view_index_right(view_index)) { 72 - *out_vd = &stereo->r; 73 - *out_dvd = &stereo->r_d; 74 - } else { 75 - *out_vd = &stereo->l; 76 - *out_dvd = &stereo->l_d; 77 - } 64 + const struct xrt_layer_projection_depth_data *depth = &data->depth; 65 + *out_vd = &depth->v[view_index]; 66 + *out_dvd = &depth->d[view_index]; 78 67 } 79 68 80 69 ··· 95 84 case XRT_LAYER_EQUIRECT2: visibility = data->equirect2.visibility; break; 96 85 case XRT_LAYER_QUAD: visibility = data->quad.visibility; break; 97 86 case XRT_LAYER_PROJECTION: 98 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: return true; 87 + case XRT_LAYER_PROJECTION_DEPTH: return true; 99 88 default: return false; 100 89 }; 101 90
+22 -26
src/xrt/include/xrt/xrt_compositor.h
··· 76 76 enum xrt_layer_type 77 77 { 78 78 XRT_LAYER_PROJECTION, 79 - XRT_LAYER_STEREO_PROJECTION_DEPTH, 79 + XRT_LAYER_PROJECTION_DEPTH, 80 80 XRT_LAYER_QUAD, 81 81 XRT_LAYER_CUBE, 82 82 XRT_LAYER_CYLINDER, ··· 223 223 }; 224 224 225 225 /*! 226 - * All the pure data values associated with a stereo projection layer. 226 + * All the pure data values associated with a projection layer. 227 227 * 228 228 * The @ref xrt_swapchain references and @ref xrt_device are provided outside of 229 229 * this struct. 230 230 */ 231 231 struct xrt_layer_projection_data 232 232 { 233 - uint32_t view_count; 234 233 struct xrt_layer_projection_view_data v[XRT_MAX_VIEWS]; 235 234 }; 236 235 ··· 258 257 }; 259 258 260 259 /*! 261 - * All the pure data values associated with a stereo projection layer with depth 260 + * All the pure data values associated with a projection layer with depth 262 261 * swapchain attached. 263 262 * 264 263 * The @ref xrt_swapchain references and @ref xrt_device are provided outside of 265 264 * this struct. 266 265 */ 267 - struct xrt_layer_stereo_projection_depth_data 266 + struct xrt_layer_projection_depth_data 268 267 { 269 - struct xrt_layer_projection_view_data l, r; 268 + struct xrt_layer_projection_view_data v[XRT_MAX_VIEWS]; 270 269 271 - struct xrt_layer_depth_data l_d, r_d; 270 + struct xrt_layer_depth_data d[XRT_MAX_VIEWS]; 272 271 }; 273 272 274 273 /*! ··· 460 459 */ 461 460 union { 462 461 struct xrt_layer_projection_data proj; 463 - struct xrt_layer_stereo_projection_depth_data stereo_depth; 462 + struct xrt_layer_projection_depth_data depth; 464 463 struct xrt_layer_quad_data quad; 465 464 struct xrt_layer_cube_data cube; 466 465 struct xrt_layer_cylinder_data cylinder; ··· 468 467 struct xrt_layer_equirect2_data equirect2; 469 468 struct xrt_layer_passthrough_data passthrough; 470 469 }; 470 + uint32_t view_count; 471 471 }; 472 472 473 473 /*! ··· 1197 1197 xrt_result_t (*layer_begin)(struct xrt_compositor *xc, const struct xrt_layer_frame_data *data); 1198 1198 1199 1199 /*! 1200 - * @brief Adds a stereo projection layer for submissions. 1200 + * @brief Adds a projection layer for submissions. 1201 1201 * 1202 1202 * Note that e.g. the same swapchain object may be passed as both 1203 1203 * @p l_xsc and @p r_xsc - the parameters in @p data identify ··· 1216 1216 const struct xrt_layer_data *data); 1217 1217 1218 1218 /*! 1219 - * @brief Adds a stereo projection layer for submission, has depth information. 1219 + * @brief Adds a projection layer for submission, has depth information. 1220 1220 * 1221 1221 * Note that e.g. the same swapchain object may be passed as both 1222 1222 * @p l_xsc and @p r_xsc - the parameters in @p data identify ··· 1234 1234 * including what parts of the supplied swapchain 1235 1235 * objects to use for each view. 1236 1236 */ 1237 - xrt_result_t (*layer_stereo_projection_depth)(struct xrt_compositor *xc, 1238 - struct xrt_device *xdev, 1239 - struct xrt_swapchain *l_xsc, 1240 - struct xrt_swapchain *r_xsc, 1241 - struct xrt_swapchain *l_d_xsc, 1242 - struct xrt_swapchain *r_d_xsc, 1243 - const struct xrt_layer_data *data); 1237 + xrt_result_t (*layer_projection_depth)(struct xrt_compositor *xc, 1238 + struct xrt_device *xdev, 1239 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 1240 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 1241 + const struct xrt_layer_data *data); 1244 1242 1245 1243 /*! 1246 1244 * Adds a quad layer for submission, the center of the quad is specified ··· 1695 1693 } 1696 1694 1697 1695 /*! 1698 - * @copydoc xrt_compositor::layer_stereo_projection_depth 1696 + * @copydoc xrt_compositor::layer_projection_depth 1699 1697 * 1700 1698 * Helper for calling through the function pointer. 1701 1699 * 1702 1700 * @public @memberof xrt_compositor 1703 1701 */ 1704 1702 static inline xrt_result_t 1705 - xrt_comp_layer_stereo_projection_depth(struct xrt_compositor *xc, 1706 - struct xrt_device *xdev, 1707 - struct xrt_swapchain *l_xsc, 1708 - struct xrt_swapchain *r_xsc, 1709 - struct xrt_swapchain *l_d_xsc, 1710 - struct xrt_swapchain *r_d_xsc, 1711 - const struct xrt_layer_data *data) 1703 + xrt_comp_layer_projection_depth(struct xrt_compositor *xc, 1704 + struct xrt_device *xdev, 1705 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 1706 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 1707 + const struct xrt_layer_data *data) 1712 1708 { 1713 - return xc->layer_stereo_projection_depth(xc, xdev, l_xsc, r_xsc, l_d_xsc, r_d_xsc, data); 1709 + return xc->layer_projection_depth(xc, xdev, xsc, d_xsc, data); 1714 1710 } 1715 1711 1716 1712 /*!
+18 -18
src/xrt/ipc/client/ipc_client_compositor.c
··· 595 595 struct ipc_layer_entry *layer = &slot->layers[icc->layers.layer_count]; 596 596 layer->xdev_id = 0; //! @todo Real id. 597 597 layer->data = *data; 598 - for (uint32_t i = 0; i < data->proj.view_count; ++i) { 598 + for (uint32_t i = 0; i < data->view_count; ++i) { 599 599 struct ipc_client_swapchain *ics = ipc_client_swapchain(xsc[i]); 600 600 layer->swapchain_ids[i] = ics->id; 601 601 } ··· 606 606 } 607 607 608 608 static xrt_result_t 609 - ipc_compositor_layer_stereo_projection_depth(struct xrt_compositor *xc, 610 - struct xrt_device *xdev, 611 - struct xrt_swapchain *l_xsc, 612 - struct xrt_swapchain *r_xsc, 613 - struct xrt_swapchain *l_d_xsc, 614 - struct xrt_swapchain *r_d_xsc, 615 - const struct xrt_layer_data *data) 609 + ipc_compositor_layer_projection_depth(struct xrt_compositor *xc, 610 + struct xrt_device *xdev, 611 + struct xrt_swapchain *xsc[XRT_MAX_VIEWS], 612 + struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS], 613 + const struct xrt_layer_data *data) 616 614 { 617 615 struct ipc_client_compositor *icc = ipc_client_compositor(xc); 618 616 619 - assert(data->type == XRT_LAYER_STEREO_PROJECTION_DEPTH); 617 + assert(data->type == XRT_LAYER_PROJECTION_DEPTH); 620 618 621 619 struct ipc_shared_memory *ism = icc->ipc_c->ism; 622 620 struct ipc_layer_slot *slot = &ism->slots[icc->layers.slot_id]; 623 621 struct ipc_layer_entry *layer = &slot->layers[icc->layers.layer_count]; 624 - struct ipc_client_swapchain *l = ipc_client_swapchain(l_xsc); 625 - struct ipc_client_swapchain *r = ipc_client_swapchain(r_xsc); 626 - struct ipc_client_swapchain *l_d = ipc_client_swapchain(l_d_xsc); 627 - struct ipc_client_swapchain *r_d = ipc_client_swapchain(r_d_xsc); 622 + struct ipc_client_swapchain *xscn[XRT_MAX_VIEWS]; 623 + struct ipc_client_swapchain *d_xscn[XRT_MAX_VIEWS]; 624 + for (uint32_t i = 0; i < data->view_count; ++i) { 625 + xscn[i] = ipc_client_swapchain(xsc[i]); 626 + d_xscn[i] = ipc_client_swapchain(d_xsc[i]); 627 + 628 + layer->swapchain_ids[i] = xscn[i]->id; 629 + layer->swapchain_ids[i + data->view_count] = d_xscn[i]->id; 630 + } 628 631 629 632 layer->xdev_id = 0; //! @todo Real id. 630 - layer->swapchain_ids[0] = l->id; 631 - layer->swapchain_ids[1] = r->id; 632 - layer->swapchain_ids[2] = l_d->id; 633 - layer->swapchain_ids[3] = r_d->id; 633 + 634 634 layer->data = *data; 635 635 636 636 // Increment the number of layers. ··· 885 885 icc->base.base.discard_frame = ipc_compositor_discard_frame; 886 886 icc->base.base.layer_begin = ipc_compositor_layer_begin; 887 887 icc->base.base.layer_projection = ipc_compositor_layer_projection; 888 - icc->base.base.layer_stereo_projection_depth = ipc_compositor_layer_stereo_projection_depth; 888 + icc->base.base.layer_projection_depth = ipc_compositor_layer_projection_depth; 889 889 icc->base.base.layer_quad = ipc_compositor_layer_quad; 890 890 icc->base.base.layer_cube = ipc_compositor_layer_cube; 891 891 icc->base.base.layer_cylinder = ipc_compositor_layer_cylinder;
+19 -22
src/xrt/ipc/server/ipc_server_handler.c
··· 775 775 { 776 776 // xdev 777 777 uint32_t xdevi = layer->xdev_id; 778 - // left 779 - uint32_t l_xsci = layer->swapchain_ids[0]; 780 - // right 781 - uint32_t r_xsci = layer->swapchain_ids[1]; 782 - // left 783 - uint32_t l_d_xsci = layer->swapchain_ids[2]; 784 - // right 785 - uint32_t r_d_xsci = layer->swapchain_ids[3]; 786 778 787 - struct xrt_device *xdev = get_xdev(ics, xdevi); 788 - struct xrt_swapchain *l_xcs = ics->xscs[l_xsci]; 789 - struct xrt_swapchain *r_xcs = ics->xscs[r_xsci]; 790 - struct xrt_swapchain *l_d_xcs = ics->xscs[l_d_xsci]; 791 - struct xrt_swapchain *r_d_xcs = ics->xscs[r_d_xsci]; 779 + // Cast away volatile. 780 + struct xrt_layer_data *data = (struct xrt_layer_data *)&layer->data; 792 781 793 - if (l_xcs == NULL || r_xcs == NULL || l_d_xcs == NULL || r_d_xcs == NULL) { 794 - U_LOG_E("Invalid swap chain for projection layer #%u!", i); 795 - return false; 796 - } 797 - 782 + struct xrt_device *xdev = get_xdev(ics, xdevi); 798 783 if (xdev == NULL) { 799 784 U_LOG_E("Invalid xdev for projection layer #%u!", i); 800 785 return false; 801 786 } 802 787 803 - // Cast away volatile. 804 - struct xrt_layer_data *data = (struct xrt_layer_data *)&layer->data; 788 + struct xrt_swapchain *xcs[XRT_MAX_VIEWS]; 789 + struct xrt_swapchain *d_xcs[XRT_MAX_VIEWS]; 790 + 791 + for (uint32_t j = 0; j < data->view_count; j++) { 792 + int xsci = layer->swapchain_ids[j]; 793 + int d_xsci = layer->swapchain_ids[j + data->view_count]; 794 + 795 + xcs[j] = ics->xscs[xsci]; 796 + d_xcs[j] = ics->xscs[d_xsci]; 797 + if (xcs[j] == NULL || d_xcs[j] == NULL) { 798 + U_LOG_E("Invalid swap chain for projection layer #%u!", i); 799 + return false; 800 + } 801 + } 805 802 806 - xrt_comp_layer_stereo_projection_depth(xc, xdev, l_xcs, r_xcs, l_d_xcs, r_d_xcs, data); 803 + xrt_comp_layer_projection_depth(xc, xdev, xcs, d_xcs, data); 807 804 808 805 return true; 809 806 } ··· 977 974 return false; 978 975 } 979 976 break; 980 - case XRT_LAYER_STEREO_PROJECTION_DEPTH: 977 + case XRT_LAYER_PROJECTION_DEPTH: 981 978 if (!_update_projection_layer_depth(xc, ics, layer, i)) { 982 979 return false; 983 980 }
+35 -48
src/xrt/state_trackers/oxr/oxr_session_frame_end.c
··· 694 694 } 695 695 696 696 #ifdef OXR_HAVE_KHR_composition_layer_depth 697 - if (depth_layer_count > 0 && depth_layer_count != proj->viewCount && proj->viewCount != 2) { 697 + if (depth_layer_count > 0 && depth_layer_count != proj->viewCount) { 698 698 return oxr_error( 699 699 log, XR_ERROR_VALIDATION_FAILURE, 700 700 "(frameEndInfo->layers[%u] projection layer must have %u depth layers or none, but has: %u)", ··· 1258 1258 uint64_t xrt_timestamp) 1259 1259 { 1260 1260 struct oxr_space *spc = XRT_CAST_OXR_HANDLE_TO_PTR(struct oxr_space *, proj->space); 1261 - struct oxr_swapchain *d_scs[2] = {NULL, NULL}; 1261 + struct oxr_swapchain *d_scs[XRT_MAX_VIEWS]; 1262 1262 struct oxr_swapchain *scs[XRT_MAX_VIEWS]; 1263 1263 struct xrt_pose *pose_ptr; 1264 1264 struct xrt_pose pose[XRT_MAX_VIEWS]; 1265 1265 struct xrt_swapchain *swapchains[XRT_MAX_VIEWS]; 1266 + struct xrt_swapchain *d_swapchains[XRT_MAX_VIEWS]; 1266 1267 1267 1268 enum xrt_layer_composition_flags flags = convert_layer_flags(proj->layerFlags); 1268 1269 ··· 1286 1287 data.name = XRT_INPUT_GENERIC_HEAD_POSE; 1287 1288 data.timestamp = xrt_timestamp; 1288 1289 data.flags = flags; 1289 - data.proj.view_count = proj->viewCount; 1290 + data.view_count = proj->viewCount; 1290 1291 for (size_t i = 0; i < proj->viewCount; ++i) { 1291 1292 struct xrt_fov *fov = (struct xrt_fov *)&proj->views[i].fov; 1292 1293 data.proj.v[i].fov = *fov; ··· 1298 1299 fill_in_y_flip(sess, (XrCompositionLayerBaseHeader *)proj, &data); 1299 1300 fill_in_blend_factors(sess, (XrCompositionLayerBaseHeader *)proj, &data); 1300 1301 fill_in_layer_settings(sess, (XrCompositionLayerBaseHeader *)proj, &data); 1301 - 1302 1302 1303 1303 #ifdef OXR_HAVE_KHR_composition_layer_depth 1304 - if (proj->viewCount == 2) { 1305 - const XrCompositionLayerDepthInfoKHR *d_l = OXR_GET_INPUT_FROM_CHAIN( 1306 - &proj->views[0], XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR, XrCompositionLayerDepthInfoKHR); 1307 - if (d_l) { 1308 - data.stereo_depth.l_d.far_z = d_l->farZ; 1309 - data.stereo_depth.l_d.near_z = d_l->nearZ; 1310 - data.stereo_depth.l_d.max_depth = d_l->maxDepth; 1311 - data.stereo_depth.l_d.min_depth = d_l->minDepth; 1312 - 1304 + // number of depth layers must be 0 or proj->viewCount 1305 + const XrCompositionLayerDepthInfoKHR *d_is[XRT_MAX_VIEWS]; 1306 + for (uint32_t i = 0; i < proj->viewCount; ++i) { 1307 + d_scs[i] = NULL; 1308 + d_is[i] = OXR_GET_INPUT_FROM_CHAIN(&proj->views[i], XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR, 1309 + XrCompositionLayerDepthInfoKHR); 1310 + if (d_is[i]) { 1311 + data.depth.d[i].far_z = d_is[i]->farZ; 1312 + data.depth.d[i].near_z = d_is[i]->nearZ; 1313 + data.depth.d[i].max_depth = d_is[i]->maxDepth; 1314 + data.depth.d[i].min_depth = d_is[i]->minDepth; 1313 1315 struct oxr_swapchain *sc = 1314 - XRT_CAST_OXR_HANDLE_TO_PTR(struct oxr_swapchain *, d_l->subImage.swapchain); 1315 - 1316 - fill_in_sub_image(sc, &d_l->subImage, &data.stereo_depth.l_d.sub); 1317 - 1318 - // Need to pass this in. 1319 - d_scs[0] = sc; 1316 + XRT_CAST_OXR_HANDLE_TO_PTR(struct oxr_swapchain *, d_is[i]->subImage.swapchain); 1317 + fill_in_sub_image(sc, &d_is[i]->subImage, &data.depth.d[i].sub); 1318 + d_scs[i] = sc; 1319 + d_swapchains[i] = sc->swapchain; 1320 1320 } 1321 - 1322 - const XrCompositionLayerDepthInfoKHR *d_r = OXR_GET_INPUT_FROM_CHAIN( 1323 - &proj->views[1], XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR, XrCompositionLayerDepthInfoKHR); 1324 - 1325 - if (d_r) { 1326 - data.stereo_depth.r_d.far_z = d_r->farZ; 1327 - data.stereo_depth.r_d.near_z = d_r->nearZ; 1328 - data.stereo_depth.r_d.max_depth = d_r->maxDepth; 1329 - data.stereo_depth.r_d.min_depth = d_r->minDepth; 1330 - 1331 - struct oxr_swapchain *sc = 1332 - XRT_CAST_OXR_HANDLE_TO_PTR(struct oxr_swapchain *, d_r->subImage.swapchain); 1333 - 1334 - fill_in_sub_image(sc, &d_r->subImage, &data.stereo_depth.r_d.sub); 1335 - 1336 - // Need to pass this in. 1337 - d_scs[1] = sc; 1321 + } 1322 + #endif // OXR_HAVE_KHR_composition_layer_depth 1323 + bool d_scs_valid = true; 1324 + for (uint32_t i = 0; i < proj->viewCount; i++) { 1325 + if (d_scs[i] == NULL) { 1326 + d_scs_valid = false; 1327 + break; 1338 1328 } 1339 1329 } 1340 - #endif // OXR_HAVE_KHR_composition_layer_depth 1341 - if (d_scs[0] != NULL && d_scs[1] != NULL) { 1330 + if (d_scs_valid) { 1342 1331 #ifdef OXR_HAVE_KHR_composition_layer_depth 1343 1332 fill_in_depth_test(sess, (XrCompositionLayerBaseHeader *)proj, &data); 1344 - data.type = XRT_LAYER_STEREO_PROJECTION_DEPTH; 1345 - xrt_result_t xret = xrt_comp_layer_stereo_projection_depth( // 1346 - xc, // compositor 1347 - head, // xdev 1348 - scs[0]->swapchain, // left 1349 - scs[1]->swapchain, // right 1350 - d_scs[0]->swapchain, // left 1351 - d_scs[1]->swapchain, // right 1352 - &data); // data 1353 - OXR_CHECK_XRET(log, sess, xret, xrt_comp_layer_stereo_projection_depth); 1333 + data.type = XRT_LAYER_PROJECTION_DEPTH; 1334 + xrt_result_t xret = xrt_comp_layer_projection_depth( // 1335 + xc, // compositor 1336 + head, // xdev 1337 + swapchains, // swapchains 1338 + d_swapchains, // depth swapchains 1339 + &data); // data 1340 + OXR_CHECK_XRET(log, sess, xret, xrt_comp_layer_projection_depth); 1354 1341 #else 1355 1342 assert(false && "Should not get here"); 1356 1343 #endif // OXR_HAVE_KHR_composition_layer_depth
+1 -1
src/xrt/targets/sdl_test/sdl_program.cpp
··· 116 116 glClearColor(0.2f, 0.2f, 0.2f, 0.0f); 117 117 glClear(GL_COLOR_BUFFER_BIT); 118 118 } else if (spp.c.base.slot.layers[0].data.type == XRT_LAYER_PROJECTION || 119 - spp.c.base.slot.layers[0].data.type == XRT_LAYER_STEREO_PROJECTION_DEPTH) { 119 + spp.c.base.slot.layers[0].data.type == XRT_LAYER_PROJECTION_DEPTH) { 120 120 121 121 auto &l = spp.c.base.slot.layers[0]; 122 122 auto &ssc = *(sdl_swapchain *)l.sc_array[0];