The open source OpenXR runtime
0
fork

Configure Feed

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

c/main: Use new samplers

The swapchain code was creating a whole bunch of samplers, two for each image.
The thought was that samplers might depend on format, but this was not the
case. So just add a few common ones on the render_resources structs and use
them everywhere. Also fixes the bleeding distortion problem.

+101 -37
+101 -37
src/xrt/compositor/main/comp_renderer.c
··· 843 843 src_norm_rects[1].y = 1 + src_norm_rects[1].y; 844 844 } 845 845 846 + VkSampler clamp_to_border_black = rr->r->samplers.clamp_to_border_black; 846 847 VkSampler src_samplers[2] = { 847 - left->sampler, 848 - right->sampler, 848 + clamp_to_border_black, 849 + clamp_to_border_black, 849 850 }; 850 851 851 852 VkImageView src_image_views[2] = { ··· 878 879 renderer_get_view_projection(r); 879 880 comp_layer_renderer_draw(r->lr); 880 881 882 + VkSampler clamp_to_border_black = r->c->nr.samplers.clamp_to_border_black; 881 883 VkSampler src_samplers[2] = { 882 - r->lr->framebuffers[0].sampler, 883 - r->lr->framebuffers[1].sampler, 884 - 884 + clamp_to_border_black, 885 + clamp_to_border_black, 885 886 }; 886 887 VkImageView src_image_views[2] = { 887 888 r->lr->framebuffers[0].view, ··· 1062 1063 ubo_data->pre_transforms[0] = crc->r->distortion.uv_to_tanangle[0]; 1063 1064 ubo_data->pre_transforms[1] = crc->r->distortion.uv_to_tanangle[1]; 1064 1065 1066 + VkSampler clamp_to_edge = crc->r->samplers.clamp_to_edge; 1067 + VkSampler clamp_to_border_black = crc->r->samplers.clamp_to_border_black; 1068 + 1065 1069 VkImage target_image = crc->r->scratch.color.image; 1066 1070 VkImageView target_image_view = crc->r->scratch.color.unorm_view; // Have to write in linear 1067 1071 ··· 1137 1141 const struct comp_swapchain_image *right = &layer->sc_array[1]->images[rvd->sub.image_index]; 1138 1142 1139 1143 // Left 1140 - src_samplers[cur_image] = left->sampler; 1144 + src_samplers[cur_image] = clamp_to_border_black; 1141 1145 src_image_views[cur_image] = get_image_view(left, data->flags, left_array_index); 1142 1146 ubo_data->images_samplers[view_index_for_layer + 0].images[0] = cur_image++; 1143 1147 1144 1148 // Right 1145 - src_samplers[cur_image] = right->sampler; 1149 + src_samplers[cur_image] = clamp_to_border_black; 1146 1150 src_image_views[cur_image] = get_image_view(right, data->flags, right_array_index); 1147 1151 ubo_data->images_samplers[view_index_for_layer + 1].images[0] = cur_image++; 1148 1152 ··· 1155 1159 const struct comp_swapchain_image *d_right = 1156 1160 &layer->sc_array[3]->images[r_dvd->sub.image_index]; 1157 1161 1162 + 1158 1163 // Depth left 1159 - src_samplers[cur_image] = d_left->sampler; 1164 + src_samplers[cur_image] = clamp_to_edge; // Edge to keep depth stable at edges. 1160 1165 src_image_views[cur_image] = get_image_view(d_left, data->flags, d_left_array_index); 1161 1166 ubo_data->images_samplers[view_index_for_layer + 0].images[1] = cur_image++; 1162 1167 1163 1168 // Depth right 1164 - src_samplers[cur_image] = d_right->sampler; 1169 + src_samplers[cur_image] = clamp_to_edge; // Edge to keep depth stable at edges. 1165 1170 src_image_views[cur_image] = get_image_view(d_right, data->flags, d_right_array_index); 1166 1171 ubo_data->images_samplers[view_index_for_layer + 1].images[1] = cur_image++; 1167 1172 } ··· 1197 1202 uint32_t array_index = q->sub.array_index; 1198 1203 1199 1204 // Same image for both views 1200 - src_samplers[cur_image] = image->sampler; 1205 + src_samplers[cur_image] = clamp_to_edge; 1201 1206 src_image_views[cur_image] = get_image_view(image, layer->data.flags, array_index); 1202 1207 ubo_data->images_samplers[view_index_for_layer + 0].images[0] = cur_image; 1203 1208 ubo_data->images_samplers[view_index_for_layer + 1].images[0] = cur_image; ··· 1300 1305 1301 1306 //! @todo: If Vulkan 1.2, use VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT and skip this 1302 1307 while (cur_image < crc->r->compute.layer.image_array_size) { 1303 - src_samplers[cur_image] = crc->r->compute.default_sampler; 1308 + src_samplers[cur_image] = clamp_to_edge; 1304 1309 src_image_views[cur_image] = crc->r->mock.color.image_view; 1305 1310 cur_image++; 1306 1311 } ··· 1323 1328 VkImageView target_image_view = r->c->target->images[r->acquired_buffer].view; 1324 1329 1325 1330 VkImageView view = crc->r->scratch.color.srgb_view; // Read with gamma curve. 1326 - VkSampler sampler = crc->r->compute.default_sampler; 1331 + VkSampler sampler = crc->r->samplers.clamp_to_border_black; 1327 1332 1328 1333 VkImageView src_image_views[2] = {view, view}; 1329 1334 VkSampler src_samplers[2] = {sampler, sampler}; ··· 1379 1384 struct xrt_pose unused[2]; // New eye poses, unused. 1380 1385 get_view_poses(r, new_world_poses, unused); 1381 1386 1387 + VkSampler clamp_to_border_black = crc->r->samplers.clamp_to_border_black; 1382 1388 VkSampler src_samplers[2] = { 1383 - left->sampler, 1384 - right->sampler, 1389 + clamp_to_border_black, 1390 + clamp_to_border_black, 1385 1391 }; 1386 1392 1387 1393 VkImageView src_image_views[2] = { ··· 1506 1512 l->transformation_ubo_binding = r->lr->transformation_ubo_binding; 1507 1513 l->texture_binding = r->lr->texture_binding; 1508 1514 1509 - comp_layer_update_descriptors(l, image->sampler, 1510 - get_image_view(image, data->flags, data->quad.sub.array_index)); 1515 + VkSampler clamp_to_edge = r->c->nr.samplers.clamp_to_edge; 1516 + VkImageView image_view = get_image_view( // 1517 + image, // 1518 + data->flags, // 1519 + data->quad.sub.array_index); // 1520 + 1521 + comp_layer_update_descriptors( // 1522 + l, // 1523 + clamp_to_edge, // 1524 + image_view); // 1511 1525 1512 1526 struct xrt_vec3 s = {data->quad.size.x, data->quad.size.y, 1.0f}; 1513 1527 struct xrt_matrix_4x4 model_matrix; ··· 1552 1566 return; 1553 1567 } 1554 1568 1555 - comp_layer_update_descriptors(r->lr->layers[layer], image->sampler, 1556 - get_image_view(image, data->flags, data->cylinder.sub.array_index)); 1569 + VkSampler clamp_to_edge = r->c->nr.samplers.clamp_to_edge; 1570 + VkImageView image_view = get_image_view( // 1571 + image, // 1572 + data->flags, // 1573 + data->cylinder.sub.array_index); // 1557 1574 1575 + comp_layer_update_descriptors( // 1576 + r->lr->layers[layer], // 1577 + clamp_to_edge, // 1578 + image_view); // 1558 1579 1559 1580 float height = (data->cylinder.radius * data->cylinder.central_angle) / data->cylinder.aspect_ratio; 1560 1581 ··· 1591 1612 l->transformation_ubo_binding = r->lr->transformation_ubo_binding; 1592 1613 l->texture_binding = r->lr->texture_binding; 1593 1614 1594 - comp_layer_update_stereo_descriptors(l, left_image->sampler, right_image->sampler, 1595 - get_image_view(left_image, data->flags, left_array_index), 1596 - get_image_view(right_image, data->flags, right_array_index)); 1615 + VkSampler clamp_to_border_black = r->c->nr.samplers.clamp_to_border_black; 1616 + 1617 + VkImageView left_image_view = get_image_view( // 1618 + left_image, // 1619 + data->flags, // 1620 + left_array_index); // 1621 + 1622 + VkImageView right_image_view = get_image_view( // 1623 + right_image, // 1624 + data->flags, // 1625 + right_array_index); // 1626 + 1627 + comp_layer_update_stereo_descriptors( // 1628 + l, // 1629 + clamp_to_border_black, // 1630 + clamp_to_border_black, // 1631 + left_image_view, // 1632 + right_image_view); // 1597 1633 1598 1634 comp_layer_set_flip_y(l, data->flip_y); 1599 1635 ··· 1629 1665 l->transformation_ubo_binding = r->lr->transformation_ubo_binding; 1630 1666 l->texture_binding = r->lr->texture_binding; 1631 1667 1632 - comp_layer_update_descriptors(l, image->repeat_sampler, 1633 - get_image_view(image, data->flags, data->equirect1.sub.array_index)); 1668 + VkSampler repeat = r->c->nr.samplers.repeat; 1669 + VkImageView image_view = get_image_view( // 1670 + image, // 1671 + data->flags, // 1672 + data->equirect1.sub.array_index); // 1673 + 1674 + comp_layer_update_descriptors( // 1675 + l, // 1676 + repeat, // 1677 + image_view); // 1634 1678 1635 1679 comp_layer_update_equirect1_descriptor(l, &data->equirect1); 1636 1680 ··· 1663 1707 l->transformation_ubo_binding = r->lr->transformation_ubo_binding; 1664 1708 l->texture_binding = r->lr->texture_binding; 1665 1709 1666 - comp_layer_update_descriptors(l, image->repeat_sampler, 1667 - get_image_view(image, data->flags, data->equirect2.sub.array_index)); 1710 + VkSampler repeat = r->c->nr.samplers.repeat; 1711 + VkImageView image_view = get_image_view( // 1712 + image, // 1713 + data->flags, // 1714 + data->equirect2.sub.array_index); // 1715 + 1716 + comp_layer_update_descriptors( // 1717 + l, // 1718 + repeat, // 1719 + image_view); // 1668 1720 1669 1721 comp_layer_update_equirect2_descriptor(l, &data->equirect2); 1670 1722 ··· 1697 1749 l->transformation_ubo_binding = r->lr->transformation_ubo_binding; 1698 1750 l->texture_binding = r->lr->texture_binding; 1699 1751 1700 - comp_layer_update_descriptors(l, image->repeat_sampler, 1701 - get_image_view(image, data->flags, data->cube.sub.array_index)); 1752 + VkSampler repeat = r->c->nr.samplers.repeat; 1753 + VkImageView image_view = get_image_view( // 1754 + image, // 1755 + data->flags, // 1756 + data->cube.sub.array_index); // 1757 + 1758 + comp_layer_update_descriptors( // 1759 + l, // 1760 + repeat, // 1761 + image_view); // 1702 1762 } 1703 1763 #endif 1704 1764 ··· 1786 1846 1787 1847 comp_mirror_fixup_ui_state(&r->mirror_to_debug_gui, c); 1788 1848 if (comp_mirror_is_ready_and_active(&r->mirror_to_debug_gui, c, predicted_display_time_ns)) { 1849 + 1850 + // Used for both, want clamp to edge to no bring in black. 1851 + VkSampler clamp_to_edge = c->nr.samplers.clamp_to_edge; 1852 + 1789 1853 if (use_compute) { 1790 1854 // Covers only the first half of the view. 1791 1855 struct xrt_normalized_rect rect = {0, 0, 0.5f, 1.0f}; ··· 1796 1860 predicted_display_time_ns, // 1797 1861 c->nr.scratch.color.image, // 1798 1862 c->nr.scratch.color.srgb_view, // 1799 - c->nr.compute.default_sampler, // 1863 + clamp_to_edge, // 1800 1864 c->nr.scratch.extent, // 1801 1865 rect); // 1802 1866 } else { 1803 1867 // Covers the whole view. 1804 1868 struct xrt_normalized_rect rect = {0, 0, 1.0f, 1.0f}; 1805 1869 1806 - comp_mirror_do_blit( // 1807 - &r->mirror_to_debug_gui, // 1808 - &c->base.vk, // 1809 - predicted_display_time_ns, // 1810 - r->lr->framebuffers[0].image, // 1811 - r->lr->framebuffers[0].view, // 1812 - r->lr->framebuffers[0].sampler, // 1813 - r->lr->extent, // 1814 - rect); // 1870 + comp_mirror_do_blit( // 1871 + &r->mirror_to_debug_gui, // 1872 + &c->base.vk, // 1873 + predicted_display_time_ns, // 1874 + r->lr->framebuffers[0].image, // 1875 + r->lr->framebuffers[0].view, // 1876 + clamp_to_edge, // 1877 + r->lr->extent, // 1878 + rect); // 1815 1879 } 1816 1880 } 1817 1881