From 8148684688bee4ba4c779305b6fec55b56784d25 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 23 May 2025 16:41:52 +0300 Subject: [PATCH] isl: fix 32bit math with 4GB buffer size Signed-off-by: Lionel Landwerlin Cc: mesa-stable Reviewed-by: Kenneth Graunke (cherry picked from commit d9569571537e5f252b3893cbe2c4bb6fb1bede1c) Part-of: --- .pick_status.json | 2 +- src/intel/isl/isl_surface_state.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 9f3204cce73..6a764a7fe70 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2304,7 +2304,7 @@ "description": "isl: fix 32bit math with 4GB buffer size", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/intel/isl/isl_surface_state.c b/src/intel/isl/isl_surface_state.c index fdd01b73034..6e07900bb0f 100644 --- a/src/intel/isl/isl_surface_state.c +++ b/src/intel/isl/isl_surface_state.c @@ -1007,10 +1007,11 @@ isl_genX(buffer_fill_state_s)(const struct isl_device *dev, void *state, !info->is_scratch) { assert(info->stride_B == 1); uint64_t aligned_size = isl_align(buffer_size, 4); - buffer_size = aligned_size + (aligned_size - buffer_size); + buffer_size = MIN2(aligned_size + (aligned_size - buffer_size), + dev->max_buffer_size); } - uint32_t num_elements = buffer_size / info->stride_B; + uint64_t num_elements = buffer_size / info->stride_B; assert(num_elements > 0); if (info->format == ISL_FORMAT_RAW) { @@ -1038,7 +1039,7 @@ isl_genX(buffer_fill_state_s)(const struct isl_device *dev, void *state, * newer are enough to fit 32bit num_elements. */ if (num_elements > (1 << 27)) { - mesa_logw("%s: num_elements is too big: %u (buffer size: %"PRIu64")\n", + mesa_logw("%s: num_elements is too big: %"PRIu64" (buffer size: %"PRIu64")\n", __func__, num_elements, buffer_size); } }