diff --git a/source/blender/blenkernel/BKE_sequencer_offscreen.h b/source/blender/blenkernel/BKE_sequencer_offscreen.h index 06a3516d36c..d3782e72468 100644 --- a/source/blender/blenkernel/BKE_sequencer_offscreen.h +++ b/source/blender/blenkernel/BKE_sequencer_offscreen.h @@ -29,6 +29,7 @@ typedef struct ImBuf *(*SequencerDrawView)(struct Depsgraph *depsgraph, int alpha_mode, const char *viewname, struct GPUOffScreen *ofs, + struct GPUViewport *viewport, char err_out[256]); extern SequencerDrawView sequencer_view3d_fn; diff --git a/source/blender/editors/include/ED_view3d_offscreen.hh b/source/blender/editors/include/ED_view3d_offscreen.hh index c277440c6e7..34870b71f3e 100644 --- a/source/blender/editors/include/ED_view3d_offscreen.hh +++ b/source/blender/editors/include/ED_view3d_offscreen.hh @@ -68,6 +68,9 @@ void ED_view3d_draw_offscreen_simple(Depsgraph *depsgraph, * * \param ofs: Optional off-screen buffer, can be NULL. * (avoids re-creating when doing multiple GL renders). + * \param viewport: Optional viewport data, can be NULL. + * (avoids re-creating when doing multiple GL renders, + * allows keeping track of state across frames). */ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, Scene *scene, @@ -81,12 +84,16 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, const char *viewname, bool restore_rv3d_mats, GPUOffScreen *ofs, + GPUViewport *viewport, char err_out[256]); /** * Creates own fake 3d views (wrapping #ED_view3d_draw_offscreen_imbuf) * * \param ofs: Optional off-screen buffer can be NULL. * (avoids re-creating when doing multiple GL renders). + * \param viewport: Optional viewport data, can be NULL. + * (avoids re-creating when doing multiple GL renders, + * allows keeping track of state across frames). * * \note used by the sequencer */ @@ -102,4 +109,5 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, int alpha_mode, const char *viewname, GPUOffScreen *ofs, + GPUViewport *viewport, char err_out[256]); diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index 429dba61b3c..fbc1ef13dcb 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -71,6 +71,7 @@ #include "GPU_framebuffer.h" #include "GPU_matrix.h" +#include "GPU_viewport.h" #include "render_intern.hh" @@ -115,6 +116,8 @@ struct OGLRender { int sizex, sizey; int write_still; + GPUViewport *viewport; + ReportList *reports; bMovieHandle *mh; int cfrao, nfra; @@ -348,6 +351,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R viewname, true, oglrender->ofs, + oglrender->viewport, err_out); /* for stamp only */ @@ -368,6 +372,7 @@ static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, R alpha_mode, viewname, oglrender->ofs, + oglrender->viewport, err_out); camera = scene->camera; } @@ -469,6 +474,7 @@ static void screen_opengl_render_apply(const bContext *C, OGLRender *oglrender) for (view_id = 0; view_id < oglrender->views_len; view_id++) { context.view_id = view_id; context.gpu_offscreen = oglrender->ofs; + context.gpu_viewport = oglrender->viewport; oglrender->seq_data.ibufs_arr[view_id] = SEQ_render_give_ibuf( &context, scene->r.cfra, chanshown); } @@ -759,6 +765,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) oglrender->ofs = ofs; oglrender->sizex = sizex; oglrender->sizey = sizey; + oglrender->viewport = GPU_viewport_create(); oglrender->bmain = CTX_data_main(C); oglrender->scene = scene; oglrender->workspace = workspace; @@ -921,6 +928,7 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) DRW_gpu_context_enable(); GPU_offscreen_free(oglrender->ofs); + GPU_viewport_free(oglrender->viewport); DRW_gpu_context_disable(); if (oglrender->is_sequencer) { diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index 61e1f6d4e73..aadeb2f0615 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -890,6 +890,7 @@ static void object_preview_render(IconPreview *preview, IconPreviewSize *preview R_ALPHAPREMUL, nullptr, nullptr, + nullptr, err_out); /* TODO: color-management? */ @@ -1025,6 +1026,7 @@ static void action_preview_render(IconPreview *preview, IconPreviewSize *preview R_ADDSKY, nullptr, nullptr, + nullptr, err_out); action_preview_render_cleanup(preview, pose_backup); diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.cc b/source/blender/editors/sculpt_paint/paint_image_proj.cc index 4135d32de3f..f0428492ebb 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_image_proj.cc @@ -6329,6 +6329,7 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op) nullptr, false, nullptr, + nullptr, err_out); if (!ibuf) { diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 4b995f38a8d..53a15ef3993 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -1753,6 +1753,10 @@ void ED_view3d_draw_offscreen(Depsgraph *depsgraph, view3d_main_region_setup_offscreen(depsgraph, scene, v3d, region, viewmat, winmat); } + if (viewport) { + GPU_viewport_tag_update(viewport); + } + /* main drawing call */ DRW_draw_render_loop_offscreen(depsgraph, engine_type, @@ -1905,8 +1909,9 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, int alpha_mode, const char *viewname, const bool restore_rv3d_mats, - /* output vars */ GPUOffScreen *ofs, + GPUViewport *viewport, + /* output vars */ char err_out[256]) { RegionView3D *rv3d = static_cast(region->regiondata); @@ -2024,7 +2029,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, do_color_management, restore_rv3d_mats, ofs, - nullptr); + viewport); if (ibuf->float_buffer.data) { GPU_offscreen_read_color(ofs, GPU_DATA_FLOAT, ibuf->float_buffer.data); @@ -2065,6 +2070,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, int alpha_mode, const char *viewname, GPUOffScreen *ofs, + GPUViewport *viewport, char err_out[256]) { View3D v3d = blender::dna::shallow_zero_initialize(); @@ -2159,6 +2165,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, viewname, true, ofs, + viewport, err_out); } diff --git a/source/blender/sequencer/SEQ_render.hh b/source/blender/sequencer/SEQ_render.hh index abe49b1a2c4..d8cf90d16a2 100644 --- a/source/blender/sequencer/SEQ_render.hh +++ b/source/blender/sequencer/SEQ_render.hh @@ -12,6 +12,7 @@ struct Depsgraph; struct GPUOffScreen; +struct GPUViewport; struct ImBuf; struct ListBase; struct Main; @@ -45,6 +46,7 @@ struct SeqRenderData { /* special case for OpenGL render */ GPUOffScreen *gpu_offscreen; + GPUViewport *gpu_viewport; // int gpu_samples; // bool gpu_full_samples; }; diff --git a/source/blender/sequencer/intern/render.cc b/source/blender/sequencer/intern/render.cc index d7209c185e8..767e2a13c50 100644 --- a/source/blender/sequencer/intern/render.cc +++ b/source/blender/sequencer/intern/render.cc @@ -238,6 +238,7 @@ void SEQ_render_new_render_data(Main *bmain, r_context->is_proxy_render = false; r_context->view_id = 0; r_context->gpu_offscreen = nullptr; + r_context->gpu_viewport = nullptr; r_context->task_id = SEQ_TASK_MAIN_RENDER; r_context->is_prefetch_render = false; } @@ -1534,6 +1535,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, scene->r.alphamode, viewname, context->gpu_offscreen, + context->gpu_viewport, err_out); if (ibuf == nullptr) { fprintf(stderr, "seq_render_scene_strip failed to get opengl buffer: %s\n", err_out); diff --git a/source/blender/windowmanager/intern/wm_files.cc b/source/blender/windowmanager/intern/wm_files.cc index 156ea0b4e97..138925289dc 100644 --- a/source/blender/windowmanager/intern/wm_files.cc +++ b/source/blender/windowmanager/intern/wm_files.cc @@ -1797,6 +1797,7 @@ static ImBuf *blend_file_thumb_from_camera(const bContext *C, R_ALPHAPREMUL, nullptr, nullptr, + nullptr, err_out); } else { @@ -1812,6 +1813,7 @@ static ImBuf *blend_file_thumb_from_camera(const bContext *C, nullptr, true, nullptr, + nullptr, err_out); }