mirror of https://github.com/godotengine/godot
Clean up more dynamic allocations in the RD renderers with a focus on 2D.
This commit is contained in:
parent
cae3d722a3
commit
4cf9d58dce
|
|
@ -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);
|
||||
}
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue