From 0a9cd5ede9011abafa5cc1a6cefaaa34908b5aa6 Mon Sep 17 00:00:00 2001 From: Stuart Carnie <stuart.carnie@gmail.com> Date: Thu, 30 Jan 2025 07:08:15 +1100 Subject: [PATCH] 2D: Fix clip children and rendering artefacts Fixes both GLES3 and RendererRD implementations Closes #102147 --- drivers/gles3/rasterizer_canvas_gles3.cpp | 8 +++++--- .../rendering/renderer_rd/renderer_canvas_render_rd.cpp | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 8cbbda249b00..0ca013abd1a0 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -568,8 +568,6 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ // Clear out state used in 2D pass reset_canvas(); - state.current_batch_index = 0; - state.canvas_instance_batches.clear(); state.current_data_buffer_index = (state.current_data_buffer_index + 1) % state.canvas_instance_data_buffers.size(); state.current_instance_buffer_index = 0; } @@ -807,6 +805,8 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou } glDisable(GL_SCISSOR_TEST); + state.current_batch_index = 0; + state.canvas_instance_batches.clear(); state.last_item_index += index; } @@ -1567,7 +1567,9 @@ void RasterizerCanvasGLES3::_add_to_batch(uint32_t &r_index, bool &r_batch_broke void RasterizerCanvasGLES3::_new_batch(bool &r_batch_broken) { if (state.canvas_instance_batches.size() == 0) { - state.canvas_instance_batches.push_back(Batch()); + Batch new_batch; + new_batch.instance_buffer_index = state.current_instance_buffer_index; + state.canvas_instance_batches.push_back(new_batch); return; } diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 6388bc864110..172d6e547118 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -914,8 +914,6 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p } texture_info_map.clear(); - state.current_batch_index = 0; - state.canvas_instance_batches.clear(); state.current_data_buffer_index = (state.current_data_buffer_index + 1) % BATCH_DATA_BUFFER_COUNT; state.current_instance_buffer_index = 0; } @@ -2289,6 +2287,8 @@ void RendererCanvasRenderRD::_render_batch_items(RenderTarget p_to_render_target RD::get_singleton()->draw_list_end(); + state.current_batch_index = 0; + state.canvas_instance_batches.clear(); state.last_instance_index += instance_index; } @@ -3200,7 +3200,9 @@ void RendererCanvasRenderRD::_render_batch(RD::DrawListID p_draw_list, CanvasSha RendererCanvasRenderRD::Batch *RendererCanvasRenderRD::_new_batch(bool &r_batch_broken) { if (state.canvas_instance_batches.size() == 0) { - state.canvas_instance_batches.push_back(Batch()); + Batch new_batch; + new_batch.instance_buffer_index = state.current_instance_buffer_index; + state.canvas_instance_batches.push_back(new_batch); return state.canvas_instance_batches.ptr(); }