Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_sequencer/sequencer_draw.c
| Show First 20 Lines • Show All 1,232 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| void ED_sequencer_special_preview_clear(void) | void ED_sequencer_special_preview_clear(void) | ||||
| { | { | ||||
| sequencer_special_update_set(NULL); | sequencer_special_update_set(NULL); | ||||
| } | } | ||||
| ImBuf *sequencer_ibuf_get(struct Main *bmain, | ImBuf *sequencer_ibuf_get(struct Main *bmain, | ||||
| ARegion *region, | |||||
| struct Depsgraph *depsgraph, | struct Depsgraph *depsgraph, | ||||
| Scene *scene, | Scene *scene, | ||||
| SpaceSeq *sseq, | SpaceSeq *sseq, | ||||
| int cfra, | int cfra, | ||||
| int frame_ofs, | int frame_ofs, | ||||
| const char *viewname) | const char *viewname) | ||||
| { | { | ||||
| SeqRenderData context = {0}; | SeqRenderData context = {0}; | ||||
| Show All 19 Lines | ImBuf *sequencer_ibuf_get(struct Main *bmain, | ||||
| BKE_sequencer_new_render_data( | BKE_sequencer_new_render_data( | ||||
| bmain, depsgraph, scene, rectx, recty, sseq->render_size, false, &context); | bmain, depsgraph, scene, rectx, recty, sseq->render_size, false, &context); | ||||
| context.view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname); | context.view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname); | ||||
| /* Sequencer could start rendering, in this case we need to be sure it wouldn't be canceled | /* Sequencer could start rendering, in this case we need to be sure it wouldn't be canceled | ||||
| * by Escape pressed somewhere in the past. */ | * by Escape pressed somewhere in the past. */ | ||||
| G.is_break = false; | G.is_break = false; | ||||
| /* Rendering can change OGL context. Save & Restore framebuffer. */ | GPUViewport *viewport = WM_draw_region_get_bound_viewport(region); | ||||
| GPUFrameBuffer *fb = GPU_framebuffer_active_get(); | GPUFrameBuffer *fb = GPU_framebuffer_active_get(); | ||||
| if (viewport) { | |||||
| /* Unbind viewport to release the DRW context. */ | |||||
| GPU_viewport_unbind(viewport); | |||||
| } | |||||
| else { | |||||
| /* Rendering can change OGL context. Save & Restore framebuffer. */ | |||||
| GPU_framebuffer_restore(); | GPU_framebuffer_restore(); | ||||
| } | |||||
| if (special_seq_update) { | if (special_seq_update) { | ||||
| ibuf = BKE_sequencer_give_ibuf_direct(&context, cfra + frame_ofs, special_seq_update); | ibuf = BKE_sequencer_give_ibuf_direct(&context, cfra + frame_ofs, special_seq_update); | ||||
| } | } | ||||
| else { | else { | ||||
| ibuf = BKE_sequencer_give_ibuf(&context, cfra + frame_ofs, sseq->chanshown); | ibuf = BKE_sequencer_give_ibuf(&context, cfra + frame_ofs, sseq->chanshown); | ||||
| } | } | ||||
| if (fb) { | if (viewport) { | ||||
| /* Follows same logic as wm_draw_window_offscreen to make sure to restore the same viewport. */ | |||||
dfelinto: Can you elaborate on the logic here, and why you are not using `context.view_id`?
| |||||
Done Inline ActionsBecause this is what wm_draw_region_bind uses inside wm_draw_window_offscreen. And we need to follow that to ensure we bind the same viewport. fclem: Because this is what `wm_draw_region_bind` uses inside `wm_draw_window_offscreen`. And we need… | |||||
Done Inline ActionsPut this to the comment in the code, at a very least. sergey: Put this to the comment in the code, at a very least. | |||||
| int view = (sseq->multiview_eye == STEREO_RIGHT_ID) ? 1 : 0; | |||||
| GPU_viewport_bind(viewport, view, ®ion->winrct); | |||||
| } | |||||
| else if (fb) { | |||||
| GPU_framebuffer_bind(fb); | GPU_framebuffer_bind(fb); | ||||
| } | } | ||||
| /* Restore state so real rendering would be canceled if needed. */ | /* Restore state so real rendering would be canceled if needed. */ | ||||
| G.is_break = is_break; | G.is_break = is_break; | ||||
| return ibuf; | return ibuf; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 476 Lines • ▼ Show 20 Lines | void sequencer_draw_preview(const bContext *C, | ||||
| const bool draw_gpencil = ((sseq->flag & SEQ_SHOW_GPENCIL) && sseq->gpd); | const bool draw_gpencil = ((sseq->flag & SEQ_SHOW_GPENCIL) && sseq->gpd); | ||||
| const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; | const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; | ||||
| sequencer_stop_running_jobs(C, scene); | sequencer_stop_running_jobs(C, scene); | ||||
| if (G.is_rendering) { | if (G.is_rendering) { | ||||
| return; | return; | ||||
| } | } | ||||
| /* Get image. */ | |||||
| ibuf = sequencer_ibuf_get( | |||||
| bmain, region, depsgraph, scene, sseq, cfra, frame_ofs, names[sseq->multiview_eye]); | |||||
| /* Setup offscreen buffers. */ | /* Setup offscreen buffers. */ | ||||
| GPUViewport *viewport = WM_draw_region_get_viewport(region); | GPUViewport *viewport = WM_draw_region_get_viewport(region); | ||||
| GPUFrameBuffer *framebuffer_overlay = GPU_viewport_framebuffer_overlay_get(viewport); | GPUFrameBuffer *framebuffer_overlay = GPU_viewport_framebuffer_overlay_get(viewport); | ||||
| GPU_framebuffer_bind_no_srgb(framebuffer_overlay); | GPU_framebuffer_bind_no_srgb(framebuffer_overlay); | ||||
| GPU_batch_presets_reset(); | GPU_batch_presets_reset(); | ||||
| GPU_depth_test(false); | GPU_depth_test(false); | ||||
| if (sseq->render_size == SEQ_PROXY_RENDER_SIZE_NONE) { | if (sseq->render_size == SEQ_PROXY_RENDER_SIZE_NONE) { | ||||
| sequencer_preview_clear(); | sequencer_preview_clear(); | ||||
| return; | return; | ||||
| } | } | ||||
| /* Setup view. */ | /* Setup view. */ | ||||
| sequencer_display_size(scene, viewrect); | sequencer_display_size(scene, viewrect); | ||||
| UI_view2d_totRect_set(v2d, viewrect[0] + 0.5f, viewrect[1] + 0.5f); | UI_view2d_totRect_set(v2d, viewrect[0] + 0.5f, viewrect[1] + 0.5f); | ||||
| UI_view2d_curRect_validate(v2d); | UI_view2d_curRect_validate(v2d); | ||||
| UI_view2d_view_ortho(v2d); | UI_view2d_view_ortho(v2d); | ||||
| /* Draw background. */ | /* Draw background. */ | ||||
| if (!draw_backdrop && (!draw_overlay || sseq->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE)) { | if (!draw_backdrop && (!draw_overlay || sseq->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE)) { | ||||
| sequencer_preview_clear(); | sequencer_preview_clear(); | ||||
| if (sseq->flag & SEQ_USE_ALPHA) { | if (sseq->flag & SEQ_USE_ALPHA) { | ||||
| imm_draw_box_checker_2d(v2d->tot.xmin, v2d->tot.ymin, v2d->tot.xmax, v2d->tot.ymax); | imm_draw_box_checker_2d(v2d->tot.xmin, v2d->tot.ymin, v2d->tot.xmax, v2d->tot.ymax); | ||||
| } | } | ||||
| } | } | ||||
| /* Get image. */ | |||||
| ibuf = sequencer_ibuf_get( | |||||
| bmain, depsgraph, scene, sseq, cfra, frame_ofs, names[sseq->multiview_eye]); | |||||
| /* sequencer_ibuf_get can call GPU_framebuffer_bind. So disable srgb framebuffer again. */ | |||||
| GPU_framebuffer_bind_no_srgb(framebuffer_overlay); | |||||
| if (ibuf) { | if (ibuf) { | ||||
| scope = sequencer_get_scope(scene, sseq, ibuf, draw_backdrop); | scope = sequencer_get_scope(scene, sseq, ibuf, draw_backdrop); | ||||
| /* Draw image. */ | /* Draw image. */ | ||||
| sequencer_draw_display_buffer( | sequencer_draw_display_buffer( | ||||
| C, scene, region, sseq, ibuf, scope, draw_overlay, draw_backdrop); | C, scene, region, sseq, ibuf, scope, draw_overlay, draw_backdrop); | ||||
| ▲ Show 20 Lines • Show All 549 Lines • Show Last 20 Lines | |||||
Can you elaborate on the logic here, and why you are not using context.view_id?