The open source OpenXR runtime
0
fork

Configure Feed

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

c/render: Enable timewarp to be used on mesh shader

+66 -9
+5 -4
src/xrt/compositor/main/comp_renderer.c
··· 847 847 i, // view_index 848 848 &viewport_datas[i]); // viewport_data 849 849 850 - render_gfx_mesh_draw( // 851 - rr, // rr 852 - i, // mesh_index 853 - descriptor_sets[i]); // descriptor_set 850 + render_gfx_mesh_draw( // 851 + rr, // rr 852 + i, // mesh_index 853 + descriptor_sets[i], // descriptor_set 854 + false); // do_timewarp 854 855 855 856 render_gfx_end_view(rr); 856 857 }
+55 -2
src/xrt/compositor/render/render_gfx.c
··· 295 295 * 296 296 */ 297 297 298 + struct mesh_params 299 + { 300 + uint32_t do_timewarp; 301 + }; 302 + 298 303 XRT_CHECK_RESULT static VkResult 299 304 create_mesh_pipeline(struct vk_bundle *vk, 300 305 VkRenderPass render_pass, ··· 303 308 uint32_t src_binding, 304 309 uint32_t mesh_index_count_total, 305 310 uint32_t mesh_stride, 311 + const struct mesh_params *params, 306 312 VkShaderModule mesh_vert, 307 313 VkShaderModule mesh_frag, 308 314 VkPipeline *out_mesh_pipeline) ··· 409 415 }; 410 416 // clang-format on 411 417 418 + #define ENTRY(ID, FIELD) \ 419 + { \ 420 + .constantID = ID, \ 421 + .offset = offsetof(struct mesh_params, FIELD), \ 422 + .size = sizeof(params->FIELD), \ 423 + } 424 + 425 + VkSpecializationMapEntry vert_entries[] = { 426 + ENTRY(0, do_timewarp), 427 + }; 428 + #undef ENTRY 429 + 430 + VkSpecializationInfo vert_specialization_info = { 431 + .mapEntryCount = ARRAY_SIZE(vert_entries), 432 + .pMapEntries = vert_entries, 433 + .dataSize = sizeof(*params), 434 + .pData = params, 435 + }; 436 + 412 437 VkPipelineShaderStageCreateInfo shader_stages[2] = { 413 438 { 414 439 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 415 440 .stage = VK_SHADER_STAGE_VERTEX_BIT, 416 441 .module = mesh_vert, 442 + .pSpecializationInfo = &vert_specialization_info, 417 443 .pName = "main", 418 444 }, 419 445 { ··· 482 508 &rgrp->render_pass); // out_render_pass 483 509 VK_CHK_WITH_RET(ret, "create_implicit_render_pass", false); 484 510 511 + struct mesh_params simple_params = { 512 + .do_timewarp = false, 513 + }; 514 + 485 515 ret = create_mesh_pipeline( // 486 516 vk, // vk_bundle 487 517 rgrp->render_pass, // render_pass ··· 490 520 r->mesh.src_binding, // src_binding 491 521 r->mesh.index_count_total, // mesh_index_count_total 492 522 r->mesh.stride, // mesh_stride 523 + &simple_params, // params 493 524 r->shaders->mesh_vert, // mesh_vert 494 525 r->shaders->mesh_frag, // mesh_frag 495 526 &rgrp->mesh.pipeline); // out_mesh_pipeline 496 527 VK_CHK_WITH_RET(ret, "create_mesh_pipeline", false); 497 528 529 + struct mesh_params timewarp_params = { 530 + .do_timewarp = true, 531 + }; 532 + 533 + ret = create_mesh_pipeline( // 534 + vk, // vk_bundle 535 + rgrp->render_pass, // render_pass 536 + r->mesh.pipeline_layout, // pipeline_layout 537 + r->pipeline_cache, // pipeline_cache 538 + r->mesh.src_binding, // src_binding 539 + r->mesh.index_count_total, // mesh_index_count_total 540 + r->mesh.stride, // mesh_stride 541 + &timewarp_params, // params 542 + r->shaders->mesh_vert, // mesh_vert 543 + r->shaders->mesh_frag, // mesh_frag 544 + &rgrp->mesh.pipeline_timewarp); // out_mesh_pipeline 545 + VK_CHK_WITH_RET(ret, "create_mesh_pipeline", false); 546 + 498 547 // Set fields. 499 548 rgrp->r = r; 500 549 rgrp->format = format; ··· 512 561 513 562 D(RenderPass, rgrp->render_pass); 514 563 D(Pipeline, rgrp->mesh.pipeline); 564 + D(Pipeline, rgrp->mesh.pipeline_timewarp); 515 565 516 566 U_ZERO(rgrp); 517 567 } ··· 771 821 } 772 822 773 823 void 774 - render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set) 824 + render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set, bool do_timewarp) 775 825 { 776 826 struct vk_bundle *vk = vk_from_rr(rr); 777 827 struct render_resources *r = rr->r; ··· 792 842 0, // dynamicOffsetCount 793 843 NULL); // pDynamicOffsets 794 844 845 + // Select which pipeline we want. 846 + VkPipeline pipeline = do_timewarp ? rr->rtr->rgrp->mesh.pipeline_timewarp : rr->rtr->rgrp->mesh.pipeline; 847 + 795 848 vk->vkCmdBindPipeline( // 796 849 r->cmd, // commandBuffer 797 850 VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint 798 - rr->rtr->rgrp->mesh.pipeline); // pipeline 851 + pipeline); // pipeline 799 852 800 853 801 854 /*
+6 -3
src/xrt/compositor/render/render_interface.h
··· 686 686 687 687 struct 688 688 { 689 - //! Pipeline layout used for mesh, does not depend on framebuffer. 689 + //! Pipeline layout used for mesh, without timewarp. 690 690 VkPipeline pipeline; 691 + 692 + //! Pipeline layout used for mesh, with timewarp. 693 + VkPipeline pipeline_timewarp; 691 694 } mesh; 692 695 }; 693 696 ··· 887 890 888 891 /*! 889 892 * Dispatch one mesh shader instance, using the give @p mesh_index as source for 890 - * mesh geometry. 893 + * mesh geometry, timewarp selectable via @p do_timewarp. 891 894 * 892 895 * @public @memberof render_gfx 893 896 */ 894 897 void 895 - render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set); 898 + render_gfx_mesh_draw(struct render_gfx *rr, uint32_t mesh_index, VkDescriptorSet descriptor_set, bool do_timewarp); 896 899 897 900 898 901 /*!