diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-11-16 21:26:23 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-11-16 21:26:23 +0300 |
commit | 2c347ebbba9b76c26f3a4b1e4f8bbe84cb90d1f4 (patch) | |
tree | 9224a975548570da64af7700be3a389905ab5879 /source | |
parent | 64dc0f2685afbd829fffa1a95741006b7a734f7d (diff) |
Fix T57874: Crash due to IMM_BUFFER_SIZE when drawing cached frames...
... in the timeline.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/space_action/action_draw.c | 42 | ||||
-rw-r--r-- | source/blender/gpu/GPU_immediate_util.h | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_immediate_util.c | 11 |
3 files changed, 41 insertions, 13 deletions
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 77def4af6d0..738c5e4d2e2 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -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); diff --git a/source/blender/gpu/GPU_immediate_util.h b/source/blender/gpu/GPU_immediate_util.h index 7baf359c52e..e5b259b4783 100644 --- a/source/blender/gpu/GPU_immediate_util.h +++ b/source/blender/gpu/GPU_immediate_util.h @@ -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]); diff --git a/source/blender/gpu/intern/gpu_immediate_util.c b/source/blender/gpu/intern/gpu_immediate_util.c index 983c70281a2..5cba0c42ee3 100644 --- a/source/blender/gpu/intern/gpu_immediate_util.c +++ b/source/blender/gpu/intern/gpu_immediate_util.c @@ -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); |