Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2022-05-23 16:59:52 +0300
committerSergey Sharybin <sergey@blender.org>2022-05-23 16:59:52 +0300
commit9bb4bf57485475faa491e31b094bded67d5dd2dd (patch)
treeb88065bbf2d75ff7c7dd74b9925a7fb41c37730e /intern
parenteb5e7d0a31eed698909c23ab0ca89c8fd4929365 (diff)
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.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/device/gpu/kernel.h10
-rw-r--r--intern/cycles/kernel/film/adaptive_sampling.h8
-rw-r--r--intern/cycles/kernel/integrator/init_from_bake.h2
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;