The open source OpenXR runtime
0
fork

Configure Feed

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

c/main: Use scratch image for layer renderer

+66 -141
+28 -87
src/xrt/compositor/main/comp_layer_renderer.c
··· 354 354 } 355 355 } 356 356 357 - static bool 358 - _init_frame_buffer(struct comp_layer_renderer *self, VkFormat format, VkRenderPass rp, uint32_t eye) 359 - { 360 - struct vk_bundle *vk = self->vk; 361 - 362 - VkImageUsageFlags usage = // 363 - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | // 364 - VK_IMAGE_USAGE_SAMPLED_BIT | // 365 - VK_IMAGE_USAGE_TRANSFER_SRC_BIT; // 366 - 367 - VkResult res = vk_create_image_simple(vk, self->extent, format, usage, &self->framebuffers[eye].memory, 368 - &self->framebuffers[eye].image); 369 - vk_check_error("vk_create_image_simple", res, false); 370 - 371 - VkImageSubresourceRange subresource_range = { 372 - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, 373 - .baseMipLevel = 0, 374 - .levelCount = 1, 375 - .baseArrayLayer = 0, 376 - .layerCount = 1, 377 - }; 378 - 379 - res = vk_create_view(vk, self->framebuffers[eye].image, VK_IMAGE_VIEW_TYPE_2D, format, subresource_range, 380 - &self->framebuffers[eye].view); 381 - 382 - vk_check_error("vk_create_view", res, false); 383 - 384 - VkFramebufferCreateInfo framebuffer_info = { 385 - .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 386 - .renderPass = rp, 387 - .attachmentCount = 1, 388 - .pAttachments = (VkImageView[]){self->framebuffers[eye].view}, 389 - .width = self->extent.width, 390 - .height = self->extent.height, 391 - .layers = 1, 392 - }; 393 - 394 - res = vk->vkCreateFramebuffer(vk->device, &framebuffer_info, NULL, &self->framebuffers[eye].handle); 395 - vk_check_error("vkCreateFramebuffer", res, false); 396 - 397 - return true; 398 - } 399 - 400 357 void 401 358 comp_layer_renderer_allocate_layers(struct comp_layer_renderer *self, uint32_t layer_count) 402 359 { ··· 426 383 _init(struct comp_layer_renderer *self, 427 384 struct vk_bundle *vk, 428 385 struct render_shaders *s, 429 - struct render_gfx_render_pass *rgrp, 430 - VkExtent2D extent) 386 + struct render_gfx_render_pass *rgrp) 431 387 { 432 388 self->vk = vk; 433 389 ··· 435 391 self->farZ = 100.0f; 436 392 437 393 self->layer_count = 0; 438 - 439 - self->extent = extent; 440 394 441 395 self->rgrp = rgrp; 442 396 ··· 456 410 return false; 457 411 } 458 412 459 - 460 - for (uint32_t i = 0; i < 2; i++) { 461 - if (!_init_frame_buffer( // 462 - self, // 463 - self->rgrp->format, // 464 - self->rgrp->render_pass, // 465 - i)) { // 466 - return false; 467 - } 468 - } 469 413 470 414 if (!_init_descriptor_layout(self)) 471 415 return false; ··· 506 450 } 507 451 508 452 struct comp_layer_renderer * 509 - comp_layer_renderer_create(struct vk_bundle *vk, 510 - struct render_shaders *s, 511 - struct render_gfx_render_pass *rgrp, 512 - VkExtent2D extent) 453 + comp_layer_renderer_create(struct vk_bundle *vk, struct render_shaders *s, struct render_gfx_render_pass *rgrp) 513 454 { 514 455 struct comp_layer_renderer *r = U_TYPED_CALLOC(struct comp_layer_renderer); 515 - _init(r, vk, s, rgrp, extent); 456 + _init(r, vk, s, rgrp); 516 457 return r; 517 458 } 518 459 ··· 560 501 _render_stereo(struct comp_layer_renderer *self, 561 502 struct vk_bundle *vk, 562 503 VkCommandBuffer cmd_buffer, 504 + VkExtent2D extent, 505 + VkFramebuffer framebuffers[2], 563 506 const VkClearColorValue *color) 564 507 { 565 508 COMP_TRACE_MARKER(); 566 509 567 510 VkViewport viewport = { 568 - 0.0f, 0.0f, (float)self->extent.width, (float)self->extent.height, 0.0f, 1.0f, 511 + 0.0f, 0.0f, (float)extent.width, (float)extent.height, 0.0f, 1.0f, 569 512 }; 570 513 vk->vkCmdSetViewport(cmd_buffer, 0, 1, &viewport); 571 514 VkRect2D scissor = { 572 515 .offset = {0, 0}, 573 - .extent = self->extent, 516 + .extent = extent, 574 517 }; 575 518 vk->vkCmdSetScissor(cmd_buffer, 0, 1, &scissor); 576 519 577 520 for (uint32_t eye = 0; eye < 2; eye++) { 578 - _render_pass_begin( // 579 - vk, // 580 - self->rgrp->render_pass, // 581 - self->extent, // 582 - *color, // 583 - self->framebuffers[eye].handle, // 584 - cmd_buffer); // 521 + _render_pass_begin( // 522 + vk, // 523 + self->rgrp->render_pass, // 524 + extent, // 525 + *color, // 526 + framebuffers[eye], // 527 + cmd_buffer); // 585 528 586 529 _render_eye(self, eye, cmd_buffer, self->pipeline_layout); 587 530 ··· 590 533 } 591 534 592 535 void 593 - comp_layer_renderer_draw(struct comp_layer_renderer *self) 536 + comp_layer_renderer_draw(struct comp_layer_renderer *self, 537 + struct render_gfx_target_resources *rtr_left, 538 + struct render_gfx_target_resources *rtr_right) 594 539 { 595 540 COMP_TRACE_MARKER(); 596 541 VkResult ret; ··· 608 553 return; 609 554 } 610 555 556 + VkExtent2D extent = rtr_left->extent; 557 + assert(extent.width == rtr_right->extent.width); 558 + assert(extent.height == rtr_right->extent.height); 559 + 560 + VkFramebuffer framebuffers[2] = { 561 + rtr_left->framebuffer, 562 + rtr_right->framebuffer, 563 + }; 564 + 611 565 if (self->layer_count == 0) { 612 - _render_stereo(self, vk, cmd_buffer, &background_color_idle); 566 + _render_stereo(self, vk, cmd_buffer, extent, framebuffers, &background_color_idle); 613 567 } else { 614 - _render_stereo(self, vk, cmd_buffer, &background_color_active); 568 + _render_stereo(self, vk, cmd_buffer, extent, framebuffers, &background_color_active); 615 569 } 616 570 617 571 // Done writing commands, submit to queue, waits for command to finish. ··· 624 578 vk_check_error("vk_submit_cmd_buffer", ret, ); 625 579 } 626 580 627 - static void 628 - _destroy_framebuffer(struct comp_layer_renderer *self, uint32_t i) 629 - { 630 - struct vk_bundle *vk = self->vk; 631 - vk->vkDestroyImageView(vk->device, self->framebuffers[i].view, NULL); 632 - vk->vkDestroyImage(vk->device, self->framebuffers[i].image, NULL); 633 - vk->vkFreeMemory(vk->device, self->framebuffers[i].memory, NULL); 634 - vk->vkDestroyFramebuffer(vk->device, self->framebuffers[i].handle, NULL); 635 - } 636 - 637 581 void 638 582 comp_layer_renderer_destroy(struct comp_layer_renderer **ptr_clr) 639 583 { ··· 654 598 os_mutex_unlock(&vk->queue_mutex); 655 599 656 600 comp_layer_renderer_destroy_layers(self); 657 - 658 - for (uint32_t i = 0; i < 2; i++) 659 - _destroy_framebuffer(self, i); 660 601 661 602 vk->vkDestroyPipelineLayout(vk->device, self->pipeline_layout, NULL); 662 603 vk->vkDestroyDescriptorSetLayout(vk->device, self->descriptor_set_layout, NULL);
+4 -15
src/xrt/compositor/main/comp_layer_renderer.h
··· 20 20 { 21 21 struct vk_bundle *vk; 22 22 23 - struct 24 - { 25 - VkImage image; 26 - VkDeviceMemory memory; 27 - VkImageView view; 28 - VkFramebuffer handle; 29 - } framebuffers[2]; 30 - 31 23 struct vk_cmd_pool pool; 32 24 33 25 //! Render pass used to create all pipelines. 34 26 struct render_gfx_render_pass *rgrp; 35 - 36 - VkExtent2D extent; 37 27 38 28 VkShaderModule shader_modules[2]; 39 29 VkPipeline pipeline_premultiplied_alpha; ··· 69 59 * @public @memberof comp_layer_renderer 70 60 */ 71 61 struct comp_layer_renderer * 72 - comp_layer_renderer_create(struct vk_bundle *vk, 73 - struct render_shaders *s, 74 - struct render_gfx_render_pass *rgrp, 75 - VkExtent2D extent); 62 + comp_layer_renderer_create(struct vk_bundle *vk, struct render_shaders *s, struct render_gfx_render_pass *rgrp); 76 63 77 64 /*! 78 65 * Destroy the layer renderer and set the pointer to NULL. ··· 90 77 * @public @memberof comp_layer_renderer 91 78 */ 92 79 void 93 - comp_layer_renderer_draw(struct comp_layer_renderer *self); 80 + comp_layer_renderer_draw(struct comp_layer_renderer *self, 81 + struct render_gfx_target_resources *rtr_left, 82 + struct render_gfx_target_resources *rtr_right); 94 83 95 84 /*! 96 85 * Update the internal members derived from the field of view.
+34 -39
src/xrt/compositor/main/comp_renderer.c
··· 473 473 comp_layer_renderer_destroy(&r->lr); 474 474 } 475 475 476 - VkExtent2D extent = r->scratch.extent; 477 476 r->lr = comp_layer_renderer_create( // 478 477 vk, // 479 478 &r->c->shaders, // 480 - &r->scratch_render_pass, // 481 - extent); // 479 + &r->scratch_render_pass); // 482 480 if (layer_count != 0) { 483 481 comp_layer_renderer_allocate_layers(r->lr, layer_count); 484 482 } ··· 603 601 604 602 struct vk_bundle *vk = &r->c->base.vk; 605 603 606 - VkResult ret = comp_mirror_init(&r->mirror_to_debug_gui, vk, &c->shaders, r->lr->extent); 604 + VkResult ret = comp_mirror_init( // 605 + &r->mirror_to_debug_gui, // 606 + vk, // 607 + &c->shaders, // 608 + r->scratch.extent); // 607 609 if (ret != VK_SUCCESS) { 608 610 COMP_ERROR(c, "comp_mirror_init: %s", vk_result_string(ret)); 609 611 assert(false && "Whelp, can't return a error. But should never really fail."); ··· 941 943 comp_target_mark_submit(ct, c->frame.rendering.id, os_monotonic_get_ns()); 942 944 943 945 renderer_get_view_projection(r); 944 - comp_layer_renderer_draw(r->lr); 946 + comp_layer_renderer_draw( // 947 + r->lr, // 948 + &r->scratch_targets[0], // 949 + &r->scratch_targets[1]); // 945 950 946 951 VkSampler clamp_to_border_black = r->c->nr.samplers.clamp_to_border_black; 947 952 VkSampler src_samplers[2] = { ··· 949 954 clamp_to_border_black, 950 955 }; 951 956 VkImageView src_image_views[2] = { 952 - r->lr->framebuffers[0].view, 953 - r->lr->framebuffers[1].view, 957 + r->scratch.color[0].srgb_view, 958 + r->scratch.color[1].srgb_view, 954 959 }; 955 960 956 961 struct xrt_normalized_rect src_norm_rects[2] = { ··· 1441 1446 if (c->peek) { 1442 1447 switch (comp_window_peek_get_eye(c->peek)) { 1443 1448 case COMP_WINDOW_PEEK_EYE_LEFT: 1444 - comp_window_peek_blit(c->peek, r->lr->framebuffers[0].image, r->lr->extent.width, 1445 - r->lr->extent.height); 1449 + comp_window_peek_blit( // 1450 + c->peek, // 1451 + r->scratch.color[0].image, // 1452 + r->scratch.extent.width, // 1453 + r->scratch.extent.height); // 1446 1454 break; 1447 1455 case COMP_WINDOW_PEEK_EYE_RIGHT: 1448 - comp_window_peek_blit(c->peek, r->lr->framebuffers[1].image, r->lr->extent.width, 1449 - r->lr->extent.height); 1456 + comp_window_peek_blit( // 1457 + c->peek, // 1458 + r->scratch.color[1].image, // 1459 + r->scratch.extent.width, // 1460 + r->scratch.extent.height); // 1450 1461 break; 1451 1462 case COMP_WINDOW_PEEK_EYE_BOTH: 1452 1463 /* TODO: display the undistorted image */ ··· 1474 1485 // Used for both, want clamp to edge to no bring in black. 1475 1486 VkSampler clamp_to_edge = c->nr.samplers.clamp_to_edge; 1476 1487 1477 - if (use_compute) { 1478 - // Covers only the first half of the view. 1479 - struct xrt_normalized_rect rect = {0, 0, 1.0f, 1.0f}; 1488 + // Covers the whole view. 1489 + struct xrt_normalized_rect rect = {0, 0, 1.0f, 1.0f}; 1480 1490 1481 - comp_mirror_do_blit( // 1482 - &r->mirror_to_debug_gui, // 1483 - &c->base.vk, // 1484 - frame_id, // 1485 - predicted_display_time_ns, // 1486 - r->scratch.color[0].image, // 1487 - r->scratch.color[0].srgb_view, // 1488 - clamp_to_edge, // 1489 - r->scratch.extent, // 1490 - rect); // 1491 - } else { 1492 - // Covers the whole view. 1493 - struct xrt_normalized_rect rect = {0, 0, 1.0f, 1.0f}; 1494 - 1495 - comp_mirror_do_blit( // 1496 - &r->mirror_to_debug_gui, // 1497 - &c->base.vk, // 1498 - frame_id, // 1499 - predicted_display_time_ns, // 1500 - r->lr->framebuffers[0].image, // 1501 - r->lr->framebuffers[0].view, // 1502 - clamp_to_edge, // 1503 - r->lr->extent, // 1504 - rect); // 1505 - } 1491 + comp_mirror_do_blit( // 1492 + &r->mirror_to_debug_gui, // 1493 + &c->base.vk, // 1494 + frame_id, // 1495 + predicted_display_time_ns, // 1496 + r->scratch.color[0].image, // 1497 + r->scratch.color[0].srgb_view, // 1498 + clamp_to_edge, // 1499 + r->scratch.extent, // 1500 + rect); // 1506 1501 } 1507 1502 1508 1503 /*