Fix integer underflow when rounding up in VoxelGI
The code wanted to divide and round up:
- 0 / 64 = 0
- 63 / 64 = 1
- 64 / 64 = 1
- 65 / 64 = 2
However when the dividend was exactly 0 it would underflow and produce
67108864 instead.
This caused TDRs on empty scenes or extremely slow performance
Fix #80286
(cherry picked from commit e783e32108
)
This commit is contained in:
parent
a90aac5415
commit
efbe9237cc
|
@ -2966,7 +2966,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID
|
||||||
push_constant.cell_offset = mipmaps[i].cell_offset;
|
push_constant.cell_offset = mipmaps[i].cell_offset;
|
||||||
push_constant.cell_count = mipmaps[i].cell_count;
|
push_constant.cell_count = mipmaps[i].cell_count;
|
||||||
|
|
||||||
int64_t wg_todo = (mipmaps[i].cell_count - 1) / wg_size + 1;
|
int64_t wg_todo = (mipmaps[i].cell_count + wg_size - 1) / wg_size;
|
||||||
while (wg_todo) {
|
while (wg_todo) {
|
||||||
int64_t wg_count = MIN(wg_todo, wg_limit_x);
|
int64_t wg_count = MIN(wg_todo, wg_limit_x);
|
||||||
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(VoxelGIPushConstant));
|
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(VoxelGIPushConstant));
|
||||||
|
@ -2987,7 +2987,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vector<RID
|
||||||
push_constant.cell_offset = mipmaps[i].cell_offset;
|
push_constant.cell_offset = mipmaps[i].cell_offset;
|
||||||
push_constant.cell_count = mipmaps[i].cell_count;
|
push_constant.cell_count = mipmaps[i].cell_count;
|
||||||
|
|
||||||
int64_t wg_todo = (mipmaps[i].cell_count - 1) / wg_size + 1;
|
int64_t wg_todo = (mipmaps[i].cell_count + wg_size - 1) / wg_size;
|
||||||
while (wg_todo) {
|
while (wg_todo) {
|
||||||
int64_t wg_count = MIN(wg_todo, wg_limit_x);
|
int64_t wg_count = MIN(wg_todo, wg_limit_x);
|
||||||
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(VoxelGIPushConstant));
|
RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(VoxelGIPushConstant));
|
||||||
|
|
Loading…
Reference in New Issue