From 1bdb3bc88a3114f7fcff50eef1c3eca4f4ce15cd Mon Sep 17 00:00:00 2001 From: clayjohn Date: Mon, 3 Mar 2025 14:28:41 -0800 Subject: [PATCH] Validate triviality of the InstanceData and RenderElementInfo structs in Mobile and Forward+ renderers. This is needed to avoid overhead that results from calling the constructor during calls to LocalVector.resize() --- .../forward_clustered/render_forward_clustered.h | 6 ++++++ .../renderer_rd/forward_mobile/render_forward_mobile.h | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index bfde315c681..f774cd4045b 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -328,6 +328,9 @@ private: float uv_scale[4]; }; + static_assert(std::is_trivially_destructible_v); + static_assert(std::is_trivially_constructible_v); + UBO ubo; LocalVector uniform_buffers; @@ -392,6 +395,9 @@ private: uint32_t lod_index : 8; }; + static_assert(std::is_trivially_destructible_v); + static_assert(std::is_trivially_constructible_v); + template _FORCE_INLINE_ void _render_list_template(RenderingDevice::DrawListID p_draw_list, RenderingDevice::FramebufferFormatID p_framebuffer_Format, RenderListParameters *p_params, uint32_t p_from_element, uint32_t p_to_element); void _render_list(RenderingDevice::DrawListID p_draw_list, RenderingDevice::FramebufferFormatID p_framebuffer_Format, RenderListParameters *p_params, uint32_t p_from_element, uint32_t p_to_element); diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h index 6e4d33520ef..763b26be98a 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -211,7 +211,7 @@ private: uint32_t flags; uint32_t instance_uniforms_ofs; // Base offset in global buffer for instance variables. uint32_t gi_offset; // GI information when using lightmapping (VCT or lightmap index). - uint32_t layer_mask = 1; + uint32_t layer_mask; float lightmap_uv_scale[4]; // Doubles as uv_offset when needed. uint32_t reflection_probes[2]; // Packed reflection probes. uint32_t omni_lights[2]; // Packed omni lights. @@ -222,6 +222,9 @@ private: float uv_scale[4]; }; + static_assert(std::is_trivially_destructible_v); + static_assert(std::is_trivially_constructible_v); + RID instance_buffer[RENDER_LIST_MAX]; uint32_t instance_buffer_size[RENDER_LIST_MAX] = { 0, 0, 0 }; LocalVector instance_data[RENDER_LIST_MAX]; @@ -327,6 +330,9 @@ private: uint32_t reserved : 23; }; + static_assert(std::is_trivially_destructible_v); + static_assert(std::is_trivially_constructible_v); + template _FORCE_INLINE_ void _render_list_template(RenderingDevice::DrawListID p_draw_list, RenderingDevice::FramebufferFormatID p_framebuffer_Format, RenderListParameters *p_params, uint32_t p_from_element, uint32_t p_to_element); void _render_list(RenderingDevice::DrawListID p_draw_list, RenderingDevice::FramebufferFormatID p_framebuffer_Format, RenderListParameters *p_params, uint32_t p_from_element, uint32_t p_to_element);