Module: Mesa Branch: main Commit: d6c258d9eedccddc95347442dd06df58dbbf3d20 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d6c258d9eedccddc95347442dd06df58dbbf3d20
Author: Yonggang Luo <luoyongg...@gmail.com> Date: Thu Jun 29 11:54:55 2023 +0800 util: Add align_uintptr and use it treewide to replace ALIGN that works on size_t and uintptr_t Signed-off-by: Yonggang Luo <luoyongg...@gmail.com> Acked-by: Marek Olšák <marek.ol...@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26866> --- src/amd/vulkan/radv_descriptor_set.c | 4 ++-- src/etnaviv/drm/etnaviv_cmd_stream.c | 3 ++- src/gallium/drivers/radeonsi/si_state_draw.cpp | 2 +- src/gallium/winsys/svga/drm/vmw_screen_svga.c | 10 +++++----- src/intel/vulkan/genX_acceleration_structure.c | 6 +++--- src/mesa/main/extensions.c | 2 +- src/util/blob.c | 6 +++--- src/util/streaming-load-memcpy.c | 4 ++-- src/util/u_math.h | 14 ++++++++++++++ src/util/u_printf.c | 2 +- src/vulkan/overlay-layer/overlay.cpp | 4 ++-- 11 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index e585090b453..c9e68d8ddac 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -167,7 +167,7 @@ radv_CreateDescriptorSetLayout(VkDevice _device, const VkDescriptorSetLayoutCrea /* Store block of offsets first, followed by the conversion descriptors (padded to the struct * alignment) */ size += num_bindings * sizeof(uint32_t); - size = ALIGN(size, alignof(struct vk_ycbcr_conversion_state)); + size = align_uintptr(size, alignof(struct vk_ycbcr_conversion_state)); size += ycbcr_sampler_count * sizeof(struct vk_ycbcr_conversion_state); } @@ -191,7 +191,7 @@ radv_CreateDescriptorSetLayout(VkDevice _device, const VkDescriptorSetLayoutCrea set_layout->ycbcr_sampler_offsets_offset = (char *)ycbcr_sampler_offsets - (char *)set_layout; uintptr_t first_ycbcr_sampler_offset = (uintptr_t)ycbcr_sampler_offsets + sizeof(uint32_t) * num_bindings; - first_ycbcr_sampler_offset = ALIGN(first_ycbcr_sampler_offset, alignof(struct vk_ycbcr_conversion_state)); + first_ycbcr_sampler_offset = align_uintptr(first_ycbcr_sampler_offset, alignof(struct vk_ycbcr_conversion_state)); ycbcr_samplers = (struct vk_ycbcr_conversion_state *)first_ycbcr_sampler_offset; } else set_layout->ycbcr_sampler_offsets_offset = 0; diff --git a/src/etnaviv/drm/etnaviv_cmd_stream.c b/src/etnaviv/drm/etnaviv_cmd_stream.c index 9f7a8dc3fd2..41d1fe01c95 100644 --- a/src/etnaviv/drm/etnaviv_cmd_stream.c +++ b/src/etnaviv/drm/etnaviv_cmd_stream.c @@ -28,6 +28,7 @@ #include <stdlib.h> #include "util/hash_table.h" +#include "util/u_math.h" #include "etnaviv_drmif.h" #include "etnaviv_priv.h" @@ -59,7 +60,7 @@ void etna_cmd_stream_realloc(struct etna_cmd_stream *stream, size_t n) * Increase the command buffer size by 4 kiB. Here we pick 4 kiB * increment to prevent it from growing too much too quickly. */ - size = ALIGN(stream->size + n, 1024); + size = align_uintptr(stream->size + n, 1024); /* Command buffer is too big for older kernel versions */ if (size > 0x4000) diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index 756ddf9199a..b74d8fc048e 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -313,7 +313,7 @@ static bool si_update_shaders(struct si_context *sctx) shader->binary.code_size, pipeline_code_hash); - total_size += ALIGN(shader->binary.uploaded_code_size, 256); + total_size += (uint32_t)align_uintptr(shader->binary.uploaded_code_size, 256); } } diff --git a/src/gallium/winsys/svga/drm/vmw_screen_svga.c b/src/gallium/winsys/svga/drm/vmw_screen_svga.c index f3e7744003c..95e8ece93ae 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_svga.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_svga.c @@ -137,8 +137,8 @@ size_t vmw_svga_winsys_stats_len(void) { const size_t pg_size = getpagesize(); - const size_t area_size_stat_pg = ALIGN(mksstat_area_size_stat, pg_size); - const size_t area_size_info_pg = ALIGN(mksstat_area_size_info, pg_size); + const size_t area_size_stat_pg = align_uintptr(mksstat_area_size_stat, pg_size); + const size_t area_size_info_pg = align_uintptr(mksstat_area_size_info, pg_size); const size_t area_size_strs = vmw_svga_winsys_stats_names_len(); const size_t area_size = area_size_stat_pg + area_size_info_pg + area_size_strs; @@ -187,7 +187,7 @@ vmw_mksstat_get_pstat_time(uint8_t *page_addr, size_t page_size) static inline MKSGuestStatInfoEntry * vmw_mksstat_get_pinfo(uint8_t *page_addr, size_t page_size) { - const size_t area_size_stat_pg = ALIGN(mksstat_area_size_stat, page_size); + const size_t area_size_stat_pg = align_uintptr(mksstat_area_size_stat, page_size); return (MKSGuestStatInfoEntry *)(page_addr + area_size_stat_pg); } @@ -203,8 +203,8 @@ vmw_mksstat_get_pinfo(uint8_t *page_addr, size_t page_size) static inline char * vmw_mksstat_get_pstrs(uint8_t *page_addr, const size_t page_size) { - const size_t area_size_info_pg = ALIGN(mksstat_area_size_info, page_size); - const size_t area_size_stat_pg = ALIGN(mksstat_area_size_stat, page_size); + const size_t area_size_info_pg = align_uintptr(mksstat_area_size_info, page_size); + const size_t area_size_stat_pg = align_uintptr(mksstat_area_size_stat, page_size); return (char *)(page_addr + area_size_info_pg + area_size_stat_pg); } diff --git a/src/intel/vulkan/genX_acceleration_structure.c b/src/intel/vulkan/genX_acceleration_structure.c index 05528591d5a..32fbb32bc66 100644 --- a/src/intel/vulkan/genX_acceleration_structure.c +++ b/src/intel/vulkan/genX_acceleration_structure.c @@ -55,12 +55,12 @@ get_geometry(const VkAccelerationStructureBuildGeometryInfoKHR *pInfo, static size_t align_transient_size(size_t bytes) { - return ALIGN(bytes, 64); + return align_uintptr(bytes, 64); } static size_t align_private_size(size_t bytes) { - return ALIGN(bytes, 64); + return align_uintptr(bytes, 64); } static size_t get_scheduler_size(size_t num_builds) @@ -696,7 +696,7 @@ cmd_build_acceleration_structures( } size_t geom_struct_size = bs->num_geometries * sizeof(struct Geo); - size_t geom_prefix_sum_size = ALIGN(sizeof(uint32_t) * (bs->num_geometries + 1), 64); + size_t geom_prefix_sum_size = align_uintptr(sizeof(uint32_t) * (bs->num_geometries + 1), 64); bs->transient_size = geom_prefix_sum_size + geom_struct_size; diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 6fdc1f2d6c8..e007fed65eb 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -390,7 +390,7 @@ _mesa_make_extension_string(struct gl_context *ctx) if (unrecognized_extensions.names[k]) length += 1 + strlen(unrecognized_extensions.names[k]); /* +1 for space */ - exts = calloc(ALIGN(length + 1, 4), sizeof(char)); + exts = calloc(align_uintptr(length + 1, 4), sizeof(char)); if (exts == NULL) { return NULL; } diff --git a/src/util/blob.c b/src/util/blob.c index 7f117907410..9fb30e30e96 100644 --- a/src/util/blob.c +++ b/src/util/blob.c @@ -85,7 +85,7 @@ grow_to_fit(struct blob *blob, size_t additional) bool blob_align(struct blob *blob, size_t alignment) { - const size_t new_size = ALIGN(blob->size, alignment); + const size_t new_size = align_uintptr(blob->size, alignment); if (blob->size < new_size) { if (!grow_to_fit(blob, new_size - blob->size)) @@ -102,7 +102,7 @@ blob_align(struct blob *blob, size_t alignment) void blob_reader_align(struct blob_reader *blob, size_t alignment) { - blob->current = blob->data + ALIGN(blob->current - blob->data, alignment); + blob->current = blob->data + align_uintptr(blob->current - blob->data, alignment); } void @@ -212,7 +212,7 @@ BLOB_WRITE_TYPE(blob_write_uint64, uint64_t) BLOB_WRITE_TYPE(blob_write_intptr, intptr_t) #define ASSERT_ALIGNED(_offset, _align) \ - assert(ALIGN((_offset), (_align)) == (_offset)) + assert(align_uintptr((_offset), (_align)) == (_offset)) bool blob_overwrite_uint8 (struct blob *blob, diff --git a/src/util/streaming-load-memcpy.c b/src/util/streaming-load-memcpy.c index ec10d8aa981..e770bd17080 100644 --- a/src/util/streaming-load-memcpy.c +++ b/src/util/streaming-load-memcpy.c @@ -58,8 +58,8 @@ util_streaming_load_memcpy(void *restrict dst, void *restrict src, size_t len) memcpy(d, s, MIN2(bytes_before_alignment_boundary, len)); - d = (char *)ALIGN((uintptr_t)d, 16); - s = (char *)ALIGN((uintptr_t)s, 16); + d = (char *)align_uintptr((uintptr_t)d, 16); + s = (char *)align_uintptr((uintptr_t)s, 16); len -= MIN2(bytes_before_alignment_boundary, len); } diff --git a/src/util/u_math.h b/src/util/u_math.h index 6bae2a8a9f1..773ad31be46 100644 --- a/src/util/u_math.h +++ b/src/util/u_math.h @@ -685,6 +685,20 @@ align64(uint64_t value, uint64_t alignment) return ALIGN_POT(value, alignment); } +/** + * Align a value(uintptr_t, intptr_t, ptrdiff_t), only works pot alignemnts. + */ +static inline uintptr_t +align_uintptr(uintptr_t value, uintptr_t alignment) +{ +#if UINTPTR_MAX == UINT64_MAX + assert(util_is_power_of_two_nonzero64(alignment)); +#else + assert(util_is_power_of_two_nonzero(alignment)); +#endif + return ALIGN_POT(value, alignment); +} + /** * Works like align but on npot alignments. */ diff --git a/src/util/u_printf.c b/src/util/u_printf.c index 10ea682d6ad..207757d1bd2 100644 --- a/src/util/u_printf.c +++ b/src/util/u_printf.c @@ -229,7 +229,7 @@ u_printf_impl(FILE *out, const char *buffer, size_t buffer_size, free(print_str); buf_pos += arg_size; - buf_pos = ALIGN(buf_pos, 4); + buf_pos = align_uintptr(buf_pos, 4); } /* print remaining */ diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp index 1064aefebf5..43179d5b789 100644 --- a/src/vulkan/overlay-layer/overlay.cpp +++ b/src/vulkan/overlay-layer/overlay.cpp @@ -1225,8 +1225,8 @@ static struct overlay_draw *render_swapchain_display(struct swapchain_data *data VK_SUBPASS_CONTENTS_INLINE); /* Create/Resize vertex & index buffers */ - size_t vertex_size = ALIGN(draw_data->TotalVtxCount * sizeof(ImDrawVert), device_data->properties.limits.nonCoherentAtomSize); - size_t index_size = ALIGN(draw_data->TotalIdxCount * sizeof(ImDrawIdx), device_data->properties.limits.nonCoherentAtomSize); + size_t vertex_size = align_uintptr(draw_data->TotalVtxCount * sizeof(ImDrawVert), device_data->properties.limits.nonCoherentAtomSize); + size_t index_size = align_uintptr(draw_data->TotalIdxCount * sizeof(ImDrawIdx), device_data->properties.limits.nonCoherentAtomSize); if (draw->vertex_buffer_size < vertex_size) { CreateOrResizeBuffer(device_data, &draw->vertex_buffer,