Don't try to statically allocate 2x 8193 pointers
Maximum stack size is only 8KiB, this will try to allocate 8193 * sizeof(void*) * 2 = 131088 bytes on the stack. This causes a crash in some cases.
This commit is contained in:
parent
886afa9b76
commit
c52f890626
|
@ -33,11 +33,9 @@
|
||||||
#include "visual_server_raster.h"
|
#include "visual_server_raster.h"
|
||||||
#include "visual_server_viewport.h"
|
#include "visual_server_viewport.h"
|
||||||
|
|
||||||
void VisualServerCanvas::_render_canvas_item_tree(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, RasterizerCanvas::Light *p_lights) {
|
|
||||||
|
|
||||||
static const int z_range = VS::CANVAS_ITEM_Z_MAX - VS::CANVAS_ITEM_Z_MIN + 1;
|
static const int z_range = VS::CANVAS_ITEM_Z_MAX - VS::CANVAS_ITEM_Z_MIN + 1;
|
||||||
RasterizerCanvas::Item *z_list[z_range];
|
|
||||||
RasterizerCanvas::Item *z_last_list[z_range];
|
void VisualServerCanvas::_render_canvas_item_tree(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, RasterizerCanvas::Light *p_lights) {
|
||||||
|
|
||||||
memset(z_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
memset(z_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
||||||
memset(z_last_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
memset(z_last_list, 0, z_range * sizeof(RasterizerCanvas::Item *));
|
||||||
|
@ -1456,5 +1454,15 @@ bool VisualServerCanvas::free(RID p_rid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
VisualServerCanvas::VisualServerCanvas() {
|
VisualServerCanvas::VisualServerCanvas() {
|
||||||
|
|
||||||
|
z_list = (RasterizerCanvas::Item **)memalloc(z_range * sizeof(RasterizerCanvas::Item *));
|
||||||
|
z_last_list = (RasterizerCanvas::Item **)memalloc(z_range * sizeof(RasterizerCanvas::Item *));
|
||||||
|
|
||||||
disable_scale = false;
|
disable_scale = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VisualServerCanvas::~VisualServerCanvas() {
|
||||||
|
|
||||||
|
memfree(z_list);
|
||||||
|
memfree(z_last_list);
|
||||||
|
}
|
||||||
|
|
|
@ -160,6 +160,9 @@ private:
|
||||||
void _render_canvas_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RasterizerCanvas::Item **z_list, RasterizerCanvas::Item **z_last_list, Item *p_canvas_clip, Item *p_material_owner);
|
void _render_canvas_item(Item *p_canvas_item, const Transform2D &p_transform, const Rect2 &p_clip_rect, const Color &p_modulate, int p_z, RasterizerCanvas::Item **z_list, RasterizerCanvas::Item **z_last_list, Item *p_canvas_clip, Item *p_material_owner);
|
||||||
void _light_mask_canvas_items(int p_z, RasterizerCanvas::Item *p_canvas_item, RasterizerCanvas::Light *p_masked_lights);
|
void _light_mask_canvas_items(int p_z, RasterizerCanvas::Item *p_canvas_item, RasterizerCanvas::Light *p_masked_lights);
|
||||||
|
|
||||||
|
RasterizerCanvas::Item **z_list;
|
||||||
|
RasterizerCanvas::Item **z_last_list;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void render_canvas(Canvas *p_canvas, const Transform2D &p_transform, RasterizerCanvas::Light *p_lights, RasterizerCanvas::Light *p_masked_lights, const Rect2 &p_clip_rect);
|
void render_canvas(Canvas *p_canvas, const Transform2D &p_transform, RasterizerCanvas::Light *p_lights, RasterizerCanvas::Light *p_masked_lights, const Rect2 &p_clip_rect);
|
||||||
|
|
||||||
|
@ -254,6 +257,7 @@ public:
|
||||||
|
|
||||||
bool free(RID p_rid);
|
bool free(RID p_rid);
|
||||||
VisualServerCanvas();
|
VisualServerCanvas();
|
||||||
|
~VisualServerCanvas();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VISUALSERVERCANVAS_H
|
#endif // VISUALSERVERCANVAS_H
|
||||||
|
|
Loading…
Reference in New Issue