From 1fa332cad4e987ef635b45c84595aa6a4e9a6112 Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Tue, 7 Oct 2025 01:47:17 +0200 Subject: [PATCH] Add `max()` to `Span`. Remove `` include from `rendering_device_commons.h`, using `Span` instead. --- core/templates/span.h | 15 +++++++++++++++ drivers/metal/metal_objects.mm | 1 + servers/rendering/rendering_device_commons.h | 2 -- servers/rendering/rendering_device_driver.h | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/core/templates/span.h b/core/templates/span.h index 0db7e47ed17..b179d278ca4 100644 --- a/core/templates/span.h +++ b/core/templates/span.h @@ -108,6 +108,9 @@ public: /// Note: Assumes that elements in the span are sorted. Otherwise, use find() instead. template > constexpr uint64_t bisect(const T &p_value, bool p_before, Comparator compare = Comparator()) const; + + /// The caller is responsible to ensure size() > 0. + constexpr T max() const; }; template @@ -204,6 +207,18 @@ constexpr uint64_t Span::bisect(const T &p_value, bool p_before, Comparator c return lo; } +template +constexpr T Span::max() const { + DEV_ASSERT(size() > 0); + T max_val = _ptr[0]; + for (size_t i = 1; i < _len; ++i) { + if (_ptr[i] > max_val) { + max_val = _ptr[i]; + } + } + return max_val; +} + // Zero-constructing Span initializes _ptr and _len to 0 (and thus empty). template struct is_zero_constructible> : std::true_type {}; diff --git a/drivers/metal/metal_objects.mm b/drivers/metal/metal_objects.mm index 96ade55c1b9..af106f5d35a 100644 --- a/drivers/metal/metal_objects.mm +++ b/drivers/metal/metal_objects.mm @@ -56,6 +56,7 @@ #import "rendering_shader_container_metal.h" #import +#import // We have to undefine these macros because they are defined in NSObjCRuntime.h. #undef MIN diff --git a/servers/rendering/rendering_device_commons.h b/servers/rendering/rendering_device_commons.h index 94c58d89640..738f3c8680d 100644 --- a/servers/rendering/rendering_device_commons.h +++ b/servers/rendering/rendering_device_commons.h @@ -33,8 +33,6 @@ #include "core/object/object.h" #include "core/variant/type_info.h" -#include - #define STEPIFY(m_number, m_alignment) ((((m_number) + ((m_alignment) - 1)) / (m_alignment)) * (m_alignment)) // This may one day be used in Godot for interoperability between C arrays, Vector and LocalVector. diff --git a/servers/rendering/rendering_device_driver.h b/servers/rendering/rendering_device_driver.h index a69988c994f..54898b80145 100644 --- a/servers/rendering/rendering_device_driver.h +++ b/servers/rendering/rendering_device_driver.h @@ -70,7 +70,7 @@ class RenderingShaderContainerFormat; template struct VersatileResourceTemplate { static constexpr size_t RESOURCE_SIZES[] = { sizeof(RESOURCE_TYPES)... }; - static constexpr size_t MAX_RESOURCE_SIZE = std::max_element(RESOURCE_SIZES, RESOURCE_SIZES + sizeof...(RESOURCE_TYPES))[0]; + static constexpr size_t MAX_RESOURCE_SIZE = Span(RESOURCE_SIZES).max(); uint8_t data[MAX_RESOURCE_SIZE]; template