diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-02-27 12:22:26 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-02-27 12:24:02 +0300 |
commit | efef0ee672d5a65c8cb4a37f2837a371def6daaa (patch) | |
tree | aec294e98ee2b7d6be1d8d39a693334db41a9a93 /source/blender/gpu/intern | |
parent | 24f759ba5a16305d57c285dbff080d8adb116ed1 (diff) | |
parent | 4de50d757233009ccd5db8538fd036a62ce58648 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/gpu/intern')
-rw-r--r-- | source/blender/gpu/intern/gpu_select.c | 23 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_select_pick.c | 18 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_select_private.h | 1 |
3 files changed, 38 insertions, 4 deletions
diff --git a/source/blender/gpu/intern/gpu_select.c b/source/blender/gpu/intern/gpu_select.c index 153cf5f1e97..3240688d24b 100644 --- a/source/blender/gpu/intern/gpu_select.c +++ b/source/blender/gpu/intern/gpu_select.c @@ -150,6 +150,29 @@ bool GPU_select_load_id(unsigned int id) } /** + * Needed when GL context of #GPU_select_end + * can't be used to finalize selection operations + * (because of context changes). + */ +void GPU_select_finalize(void) +{ + if (!g_select_state.select_is_active) + return; + + switch (g_select_state.algorithm) { + case ALGO_GL_LEGACY: + case ALGO_GL_QUERY: + { + break; + } + default: /* ALGO_GL_PICK */ + { + gpu_select_pick_finalize(); + } + } +} + +/** * Cleanup and flush selection results to buffer. * Return number of hits and hits in buffer. * if \a dopass is true, we will do a second pass with occlusion queries to get the closest hit. diff --git a/source/blender/gpu/intern/gpu_select_pick.c b/source/blender/gpu/intern/gpu_select_pick.c index f1d311890e6..2d36c6f120c 100644 --- a/source/blender/gpu/intern/gpu_select_pick.c +++ b/source/blender/gpu/intern/gpu_select_pick.c @@ -524,6 +524,19 @@ bool gpu_select_pick_load_id(unsigned int id) return true; } + /** + * (Optional), call before 'gpu_select_pick_end' if GL context is not kept. + * is not compatible with regular select case. + * */ +void gpu_select_pick_finalize(void) +{ + GPUPickState *ps = &g_pick_state; + if (ps->gl.is_init) { + /* force finishing last pass */ + gpu_select_pick_load_id(ps->gl.prev_id); + } +} + unsigned int gpu_select_pick_end(void) { GPUPickState *ps = &g_pick_state; @@ -533,10 +546,7 @@ unsigned int gpu_select_pick_end(void) #endif if (ps->is_cached == false) { - if (ps->gl.is_init) { - /* force finishing last pass */ - gpu_select_pick_load_id(ps->gl.prev_id); - } + gpu_select_pick_finalize(); gpuPopAttrib(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); diff --git a/source/blender/gpu/intern/gpu_select_private.h b/source/blender/gpu/intern/gpu_select_private.h index 8935bd7b253..8368aaa9edc 100644 --- a/source/blender/gpu/intern/gpu_select_private.h +++ b/source/blender/gpu/intern/gpu_select_private.h @@ -35,6 +35,7 @@ /* gpu_select_pick */ void gpu_select_pick_begin(unsigned int (*buffer)[4], unsigned int bufsize, const rcti *input, char mode); bool gpu_select_pick_load_id(unsigned int id); +void gpu_select_pick_finalize(void); unsigned int gpu_select_pick_end(void); void gpu_select_pick_cache_begin(void); |