[vulkan] Create render passes for up to 32 views

Actually, only 29 are used because nvidia's drivers segfault when there
are more than 29 views (regardless of the exact bit pattern in the view
mask). This will allow rendering shadow maps in large batches, which
should make for better GPU utilization.
This commit is contained in:
Bill Currie 2023-12-14 09:56:53 +09:00
parent a9ff79a76a
commit 3a31fa111d
2 changed files with 243 additions and 0 deletions

View file

@ -846,6 +846,12 @@ descriptorSetLayouts = {
descriptorCount = 1;
stageFlags = vertex|fragment;
},
{
binding = 1;
descriptorType = storage_buffer;
descriptorCount = 1;
stageFlags = vertex;
},
);
};
quad_data_set = {
@ -2100,6 +2106,20 @@ renderpasses = {
};
output = shadow;
};
shadow2 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x03u);
});
output = cascade_shadow;
};
shadow3 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x07u);
});
output = cascade_shadow;
};
cascade_shadow = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
@ -2107,6 +2127,13 @@ renderpasses = {
});
output = cascade_shadow;
};
shadow5 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1fu);
});
output = cascade_shadow;
};
cube_shadow = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
@ -2114,6 +2141,188 @@ renderpasses = {
});
output = cube_shadow;
};
shadow7 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7fu);
});
output = cascade_shadow;
};
shadow8 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xffu);
});
output = cascade_shadow;
};
shadow9 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1ffu);
});
output = cascade_shadow;
};
shadow10 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x3ffu);
});
output = cascade_shadow;
};
shadow11 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7ffu);
});
output = cascade_shadow;
};
shadow12 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xfffu);
});
output = cascade_shadow;
};
shadow13 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1fffu);
});
output = cascade_shadow;
};
shadow14 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x3fffu);
});
output = cascade_shadow;
};
shadow15 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7fffu);
});
output = cascade_shadow;
};
shadow16 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xffffu);
});
output = cascade_shadow;
};
shadow17 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1ffffu);
});
output = cascade_shadow;
};
shadow18 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x3ffffu);
});
output = cascade_shadow;
};
shadow19 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7ffffu);
});
output = cascade_shadow;
};
shadow20 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xfffffu);
});
output = cascade_shadow;
};
shadow21 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1fffffu);
});
output = cascade_shadow;
};
shadow22 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x3fffffu);
});
output = cascade_shadow;
};
shadow23 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7fffffu);
});
output = cascade_shadow;
};
shadow24 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xffffffu);
});
output = cascade_shadow;
};
shadow25 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1ffffffu);
});
output = cascade_shadow;
};
shadow26 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x3ffffffu);
});
output = cascade_shadow;
};
shadow27 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7ffffffu);
});
output = cascade_shadow;
};
shadow28 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xfffffffu);
});
output = cascade_shadow;
};
shadow29 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x1fffffffu);
});
output = cascade_shadow;
};
shadow30 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x3fffffffu);
});
output = cascade_shadow;
};
shadow31 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0x7fffffffu);
});
output = cascade_shadow;
};
shadow32 = {
@inherit = $renderpasses.shadow;
@next = (VkRenderPassMultiviewCreateInfo, {
viewMasks = (0xffffffffu);
});
output = cascade_shadow;
};
};
steps = {
wait_on_fence = {
@ -2186,8 +2395,39 @@ steps = {
render = {
renderpasses = {
shadow = $renderpasses.shadow;
shadow2 = $renderpasses.shadow2;
shadow3 = $renderpasses.shadow3;
cascade_shadow = $renderpasses.cascade_shadow;
shadow5 = $renderpasses.shadow5;
cube_shadow = $renderpasses.cube_shadow;
shadow7 = $renderpasses.shadow7;
shadow8 = $renderpasses.shadow8;
shadow9 = $renderpasses.shadow9;
shadow10 = $renderpasses.shadow10;
shadow11 = $renderpasses.shadow11;
shadow12 = $renderpasses.shadow12;
shadow13 = $renderpasses.shadow13;
shadow14 = $renderpasses.shadow14;
shadow15 = $renderpasses.shadow15;
shadow16 = $renderpasses.shadow16;
shadow17 = $renderpasses.shadow17;
shadow18 = $renderpasses.shadow18;
shadow19 = $renderpasses.shadow19;
shadow20 = $renderpasses.shadow20;
shadow21 = $renderpasses.shadow21;
shadow22 = $renderpasses.shadow22;
shadow23 = $renderpasses.shadow23;
shadow24 = $renderpasses.shadow24;
shadow25 = $renderpasses.shadow25;
shadow26 = $renderpasses.shadow26;
shadow27 = $renderpasses.shadow27;
shadow28 = $renderpasses.shadow28;
shadow29 = $renderpasses.shadow29;
/* FIXME bug in nvidia drivers causes segfault when building the pipelines
shadow30 = $renderpasses.shadow30;
shadow31 = $renderpasses.shadow31;
shadow32 = $renderpasses.shadow32;
*/
};
};
};

View file

@ -81,6 +81,9 @@
#define shadow_quanta 128
#define lnearclip 4
#define num_cascade 4
#define max_views 29 // FIXME should be 32 (or really, maxMultiviewViewCount,
// but there are other problems there), but nvidia's
// drivers segfault for > 29
static vec4f_t ref_direction = { 1, 0, 0, 0 };