Fix T57874: Crash due to IMM_BUFFER_SIZE when drawing cached frames...
... in the timeline.
This commit is contained in:
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
|
@ -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);
|
||||
|
|
|
@ -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]);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue