1
0
Fork 0

Clean up more dynamic allocations in the RD renderers with a focus on 2D.

This commit is contained in:
clayjohn 2025-03-09 22:23:00 -07:00
parent cae3d722a3
commit 4cf9d58dce
5 changed files with 290 additions and 384 deletions

View File

@ -3293,9 +3293,8 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
uniforms.push_back(u);
}
{
RD::Uniform u;
u.binding = 7;
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
Vector<RID> textures;
textures.resize(scene_state.max_lightmaps * 2);
RID default_tex = texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE);
for (uint32_t i = 0; i < scene_state.max_lightmaps * 2; i++) {
@ -3315,14 +3314,14 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend
if (texture.is_valid()) {
RID rd_texture = texture_storage->texture_get_rd_texture(texture);
u.append_id(rd_texture);
textures.write[i] = rd_texture;
continue;
}
}
u.append_id(default_tex);
textures.write[i] = default_tex;
}
RD::Uniform u(RD::UNIFORM_TYPE_TEXTURE, 7, textures);
uniforms.push_back(u);
}
{

View File

@ -1022,8 +1022,7 @@ void RendererCanvasRenderRD::light_update_shadow(RID p_rid, int p_shadow_index,
cl->shadow.z_far = p_far;
cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(state.max_lights_per_render * 2);
Vector<Color> cc;
cc.push_back(Color(p_far, p_far, p_far, 1.0));
Color cc = Color(p_far, p_far, p_far, 1.0);
// First, do a culling pass and record what occluders need to be drawn for this light.
static thread_local LocalVector<OccluderPolygon *> occluders;
@ -1076,7 +1075,7 @@ void RendererCanvasRenderRD::light_update_shadow(RID p_rid, int p_shadow_index,
}
Rect2i rect(0, p_shadow_index * 2, state.shadow_texture_size, 2);
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(state.shadow_fb, RD::DRAW_CLEAR_ALL, cc, 1.0f, 0, rect);
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(state.shadow_fb, RD::DRAW_CLEAR_ALL, VectorView(&cc, 1), 1.0f, 0, rect);
if (state.shadow_occluder_buffer.is_valid()) {
RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, shadow_render.render_pipelines[SHADOW_RENDER_MODE_POSITIONAL_SHADOW]);
@ -2220,7 +2219,7 @@ void RendererCanvasRenderRD::_render_batch_items(RenderTarget p_to_render_target
RID framebuffer;
RID fb_uniform_set;
bool clear = false;
Vector<Color> clear_colors;
Color clear_color;
if (p_to_backbuffer) {
framebuffer = texture_storage->render_target_get_rd_backbuffer_framebuffer(p_to_render_target.render_target);
@ -2231,7 +2230,7 @@ void RendererCanvasRenderRD::_render_batch_items(RenderTarget p_to_render_target
if (texture_storage->render_target_is_clear_requested(p_to_render_target.render_target)) {
clear = true;
clear_colors.push_back(texture_storage->render_target_get_clear_request_color(p_to_render_target.render_target));
clear_color = texture_storage->render_target_get_clear_request_color(p_to_render_target.render_target);
texture_storage->render_target_disable_clear_request(p_to_render_target.render_target);
}
// TODO: Obtain from framebuffer format eventually when this is implemented.
@ -2244,7 +2243,7 @@ void RendererCanvasRenderRD::_render_batch_items(RenderTarget p_to_render_target
RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer);
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(framebuffer, clear ? RD::DRAW_CLEAR_COLOR_0 : RD::DRAW_DEFAULT_ALL, clear_colors, 1.0f, 0, Rect2(), RDD::BreadcrumbMarker::UI_PASS);
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(framebuffer, clear ? RD::DRAW_CLEAR_COLOR_0 : RD::DRAW_DEFAULT_ALL, clear_color, 1.0f, 0, Rect2(), RDD::BreadcrumbMarker::UI_PASS);
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, fb_uniform_set, BASE_UNIFORM_SET);
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, state.default_transforms_uniform_set, TRANSFORMS_UNIFORM_SET);

View File

@ -525,7 +525,7 @@ class RendererCanvasRenderRD : public RendererCanvasRender {
uint32_t flags = 0;
};
HashMap<TextureState, TextureInfo, HashableHasher<TextureState>> texture_info_map;
HashMap<TextureState, TextureInfo, HashableHasher<TextureState>, HashMapComparatorDefault<TextureState>, PagedAllocator<HashMapElement<TextureState, TextureInfo>>> texture_info_map;
// per-frame buffers
struct DataBuffer {

File diff suppressed because it is too large Load Diff

View File

@ -1173,7 +1173,7 @@ private:
struct DrawList {
Rect2i viewport;
bool viewport_set = false;
bool active = false;
struct SetState {
uint32_t pipeline_expected_format = 0;
@ -1198,7 +1198,6 @@ private:
#ifdef DEBUG_ENABLED
struct Validation {
bool active = true; // Means command buffer was not closed, so you can keep adding things.
// Actual render pass values.
uint32_t dynamic_state = 0;
VertexFormatID vertex_format = INVALID_ID;
@ -1229,18 +1228,17 @@ private:
#endif
};
DrawList *draw_list = nullptr;
DrawList draw_list;
uint32_t draw_list_subpass_count = 0;
#ifdef DEBUG_ENABLED
FramebufferFormatID draw_list_framebuffer_format = INVALID_ID;
#endif
uint32_t draw_list_current_subpass = 0;
Vector<RID> draw_list_bound_textures;
LocalVector<RID> draw_list_bound_textures;
_FORCE_INLINE_ DrawList *_get_draw_list_ptr(DrawListID p_id);
Error _draw_list_allocate(const Rect2i &p_viewport, uint32_t p_subpass);
void _draw_list_free(Rect2i *r_last_viewport = nullptr);
void _draw_list_start(const Rect2i &p_viewport);
void _draw_list_end(Rect2i *r_last_viewport = nullptr);
public:
enum DrawFlags {
@ -1274,7 +1272,8 @@ public:
};
DrawListID draw_list_begin_for_screen(DisplayServer::WindowID p_screen = 0, const Color &p_clear_color = Color());
DrawListID draw_list_begin(RID p_framebuffer, BitField<DrawFlags> p_draw_flags = DRAW_DEFAULT_ALL, const Vector<Color> &p_clear_color_values = Vector<Color>(), float p_clear_depth_value = 1.0f, uint32_t p_clear_stencil_value = 0, const Rect2 &p_region = Rect2(), uint32_t p_breadcrumb = 0);
DrawListID draw_list_begin(RID p_framebuffer, BitField<DrawFlags> p_draw_flags = DRAW_DEFAULT_ALL, VectorView<Color> p_clear_color_values = VectorView<Color>(), float p_clear_depth_value = 1.0f, uint32_t p_clear_stencil_value = 0, const Rect2 &p_region = Rect2(), uint32_t p_breadcrumb = 0);
DrawListID _draw_list_begin_bind(RID p_framebuffer, BitField<DrawFlags> p_draw_flags = DRAW_DEFAULT_ALL, const Vector<Color> &p_clear_color_values = Vector<Color>(), float p_clear_depth_value = 1.0f, uint32_t p_clear_stencil_value = 0, const Rect2 &p_region = Rect2(), uint32_t p_breadcrumb = 0);
void draw_list_set_blend_constants(DrawListID p_list, const Color &p_color);
void draw_list_bind_render_pipeline(DrawListID p_list, RID p_render_pipeline);
@ -1302,6 +1301,7 @@ private:
/***********************/
struct ComputeList {
bool active = false;
struct SetState {
uint32_t pipeline_expected_format = 0;
uint32_t uniform_set_format = 0;
@ -1325,7 +1325,6 @@ private:
#ifdef DEBUG_ENABLED
struct Validation {
bool active = true; // Means command buffer was not closed, so you can keep adding things.
Vector<uint32_t> set_formats;
Vector<bool> set_bound;
Vector<RID> set_rids;
@ -1339,7 +1338,7 @@ private:
#endif
};
ComputeList *compute_list = nullptr;
ComputeList compute_list;
ComputeList::State compute_list_barrier_state;
public: