From 9bb4bf57485475faa491e31b094bded67d5dd2dd Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 23 May 2022 15:59:52 +0200 Subject: Fix missing 64bit casts when calculating Cycles render buffer offset Found those missing casts while looking into a crash report made in the Blender Chat. Was unable to reproduce the crash, but the casts should totally be there to avoid integer overflow. --- intern/cycles/kernel/device/gpu/kernel.h | 10 ++++++---- intern/cycles/kernel/film/adaptive_sampling.h | 8 ++++---- intern/cycles/kernel/integrator/init_from_bake.h | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/intern/cycles/kernel/device/gpu/kernel.h b/intern/cycles/kernel/device/gpu/kernel.h index 82b51843864..328c58e7905 100644 --- a/intern/cycles/kernel/device/gpu/kernel.h +++ b/intern/cycles/kernel/device/gpu/kernel.h @@ -647,8 +647,9 @@ ccl_device_inline void kernel_gpu_film_convert_half_write(ccl_global uchar4 *rgb const int x = render_pixel_index % width; \ const int y = render_pixel_index / width; \ \ - ccl_global const float *buffer = render_buffer + offset + x * kfilm_convert.pass_stride + \ - y * stride * kfilm_convert.pass_stride; \ + const uint64_t buffer_pixel_index = x + y * stride; \ + ccl_global const float *buffer = render_buffer + offset + \ + buffer_pixel_index * kfilm_convert.pass_stride; \ \ ccl_global float *pixel = pixels + \ (render_pixel_index + rgba_offset) * kfilm_convert.pixel_stride; \ @@ -677,8 +678,9 @@ ccl_device_inline void kernel_gpu_film_convert_half_write(ccl_global uchar4 *rgb const int x = render_pixel_index % width; \ const int y = render_pixel_index / width; \ \ - ccl_global const float *buffer = render_buffer + offset + x * kfilm_convert.pass_stride + \ - y * stride * kfilm_convert.pass_stride; \ + const uint64_t buffer_pixel_index = x + y * stride; \ + ccl_global const float *buffer = render_buffer + offset + \ + buffer_pixel_index * kfilm_convert.pass_stride; \ \ float pixel[4]; \ film_get_pass_pixel_##variant(&kfilm_convert, buffer, pixel); \ diff --git a/intern/cycles/kernel/film/adaptive_sampling.h b/intern/cycles/kernel/film/adaptive_sampling.h index ad9b3b08ac5..16867c39d99 100644 --- a/intern/cycles/kernel/film/adaptive_sampling.h +++ b/intern/cycles/kernel/film/adaptive_sampling.h @@ -91,13 +91,13 @@ ccl_device void kernel_adaptive_sampling_filter_x(KernelGlobals kg, bool prev = false; for (int x = start_x; x < start_x + width; ++x) { int index = offset + x + y * stride; - ccl_global float *buffer = render_buffer + index * kernel_data.film.pass_stride; + ccl_global float *buffer = render_buffer + (uint64_t)index * kernel_data.film.pass_stride; const uint aux_w_offset = kernel_data.film.pass_adaptive_aux_buffer + 3; if (buffer[aux_w_offset] == 0.0f) { if (x > start_x && !prev) { index = index - 1; - buffer = render_buffer + index * kernel_data.film.pass_stride; + buffer = render_buffer + (uint64_t)index * kernel_data.film.pass_stride; buffer[aux_w_offset] = 0.0f; } prev = true; @@ -124,13 +124,13 @@ ccl_device void kernel_adaptive_sampling_filter_y(KernelGlobals kg, bool prev = false; for (int y = start_y; y < start_y + height; ++y) { int index = offset + x + y * stride; - ccl_global float *buffer = render_buffer + index * kernel_data.film.pass_stride; + ccl_global float *buffer = render_buffer + (uint64_t)index * kernel_data.film.pass_stride; const uint aux_w_offset = kernel_data.film.pass_adaptive_aux_buffer + 3; if (buffer[aux_w_offset] == 0.0f) { if (y > start_y && !prev) { index = index - stride; - buffer = render_buffer + index * kernel_data.film.pass_stride; + buffer = render_buffer + (uint64_t)index * kernel_data.film.pass_stride; buffer[aux_w_offset] = 0.0f; } prev = true; diff --git a/intern/cycles/kernel/integrator/init_from_bake.h b/intern/cycles/kernel/integrator/init_from_bake.h index 3772db845a8..293c1d243f8 100644 --- a/intern/cycles/kernel/integrator/init_from_bake.h +++ b/intern/cycles/kernel/integrator/init_from_bake.h @@ -102,7 +102,7 @@ ccl_device bool integrator_init_from_bake(KernelGlobals kg, /* Setup render buffers. */ const int index = INTEGRATOR_STATE(state, path, render_pixel_index); const int pass_stride = kernel_data.film.pass_stride; - ccl_global float *buffer = render_buffer + index * pass_stride; + ccl_global float *buffer = render_buffer + (uint64_t)index * pass_stride; ccl_global float *primitive = buffer + kernel_data.film.pass_bake_primitive; ccl_global float *differential = buffer + kernel_data.film.pass_bake_differential; -- cgit v1.2.3