Fix T57874: Crash due to IMM_BUFFER_SIZE when drawing cached frames...

... in the timeline.
This commit is contained in:
Clément Foucault 2018-11-16 19:26:23 +01:00
parent 64dc0f2685
commit 2c347ebbba
Notes: blender-bot 2023-02-14 07:47:59 +01:00
Referenced by issue #57908, Grease Pencil 2.8 crashing
Referenced by issue #57909, Grease Pencil 2.8 crashing
Referenced by issue #57910, Grease Pencil 2.8 crashing
Referenced by issue #57892, Align Objects in Blender 2.8 Alpha 2 last Builds
Referenced by issue #57884, Triangle count is incorrect when above around 2 billion
Referenced by issue #57885, Unable to use Local View
Referenced by issue #57886, Some image empties crash blender2.8
Referenced by issue #57889, Blender 2.8 Crashes when I click on undo and redo while working with image or image empty
Referenced by issue #57874, Crash on opening a file
3 changed files with 41 additions and 13 deletions

View File

@ -476,7 +476,6 @@ void timeline_draw_cache(SpaceAction *saction, Object *ob, Scene *scene)
}
const int sta = pid->cache->startframe, end = pid->cache->endframe;
const int len = (end - sta + 1) * 6;
GPU_blend(true);
@ -493,23 +492,40 @@ void timeline_draw_cache(SpaceAction *saction, Object *ob, Scene *scene)
immUniformColor4fv(col);
if (len > 0) {
immBeginAtMost(GPU_PRIM_TRIS, len);
{
/* draw a quad for each chunk of consecutive cached frames */
const int chunk_tot = 32;
int chunk_len = 0;
int ista = 0, iend = -1;
/* draw a quad for each cached frame */
for (int i = sta; i <= end; i++) {
if (pid->cache->cached_frames[i - sta]) {
immVertex2f(pos, (float)i - 0.5f, 0.0f);
immVertex2f(pos, (float)i - 0.5f, 1.0f);
immVertex2f(pos, (float)i + 0.5f, 1.0f);
immVertex2f(pos, (float)i - 0.5f, 0.0f);
immVertex2f(pos, (float)i + 0.5f, 1.0f);
immVertex2f(pos, (float)i + 0.5f, 0.0f);
if (chunk_len == 0) {
immBeginAtMost(GPU_PRIM_TRIS, chunk_tot * 6);
}
if (ista > iend) {
chunk_len++;
ista = i;
}
iend = i;
}
else {
if (ista <= iend) {
immRectf_fast(pos, (float)ista - 0.5f, 0.0f, (float)iend + 0.5f, 1.0f);
iend = ista - 1;
}
if (chunk_len >= chunk_tot) {
immEnd();
chunk_len = 0;
}
}
}
immEnd();
if (ista <= iend) {
immRectf_fast(pos, (float)ista - 0.5f, 0.0f, (float)iend + 0.5f, 1.0f);
}
if (chunk_len != 0) {
immEnd();
}
}
GPU_blend(false);

View File

@ -33,6 +33,7 @@ void immRectf(uint pos, float x1, float y1, float x2, float y2);
void immRecti(uint pos, int x1, int y1, int x2, int y2);
/* Same as immRectf/immRecti but does not call immBegin/immEnd. To use with GPU_PRIM_TRIS. */
void immRectf_fast(uint pos, float x1, float y1, float x2, float y2);
void immRectf_fast_with_color(uint pos, uint col, float x1, float y1, float x2, float y2, const float color[4]);
void immRecti_fast_with_color(uint pos, uint col, int x1, int y1, int x2, int y2, const float color[4]);

View File

@ -87,6 +87,17 @@ void immRecti(uint pos, int x1, int y1, int x2, int y2)
immEnd();
}
void immRectf_fast(uint pos, float x1, float y1, float x2, float y2)
{
immVertex2f(pos, x1, y1);
immVertex2f(pos, x2, y1);
immVertex2f(pos, x2, y2);
immVertex2f(pos, x1, y1);
immVertex2f(pos, x2, y2);
immVertex2f(pos, x1, y2);
}
void immRectf_fast_with_color(uint pos, uint col, float x1, float y1, float x2, float y2, const float color[4])
{
immAttr4fv(col, color);