Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/render/render_opengl.c
| Show First 20 Lines • Show All 483 Lines • ▼ Show 20 Lines | BKE_sequencer_new_render_data(oglrender->bmain, | ||||
| oglrender->sizey, | oglrender->sizey, | ||||
| 100.0f, | 100.0f, | ||||
| false, | false, | ||||
| &context); | &context); | ||||
| for (view_id = 0; view_id < oglrender->views_len; view_id++) { | for (view_id = 0; view_id < oglrender->views_len; view_id++) { | ||||
| context.view_id = view_id; | context.view_id = view_id; | ||||
| context.gpu_offscreen = oglrender->ofs; | context.gpu_offscreen = oglrender->ofs; | ||||
| context.gpu_full_samples = oglrender->ofs_full_samples; | |||||
| oglrender->seq_data.ibufs_arr[view_id] = BKE_sequencer_give_ibuf(&context, CFRA, chanshown); | oglrender->seq_data.ibufs_arr[view_id] = BKE_sequencer_give_ibuf(&context, CFRA, chanshown); | ||||
| } | } | ||||
| } | } | ||||
| rr = RE_AcquireResultRead(oglrender->re); | rr = RE_AcquireResultRead(oglrender->re); | ||||
| for (rv = rr->views.first, view_id = 0; rv; rv = rv->next, view_id++) { | for (rv = rr->views.first, view_id = 0; rv; rv = rv->next, view_id++) { | ||||
| BLI_assert(view_id < oglrender->views_len); | BLI_assert(view_id < oglrender->views_len); | ||||
| RE_SetActiveRenderView(oglrender->re, rv->name); | RE_SetActiveRenderView(oglrender->re, rv->name); | ||||
| Show All 10 Lines | static void screen_opengl_render_apply(const bContext *C, OGLRender *oglrender) | ||||
| } | } | ||||
| BKE_image_release_ibuf(oglrender->ima, ibuf, lock); | BKE_image_release_ibuf(oglrender->ima, ibuf, lock); | ||||
| if (oglrender->write_still) { | if (oglrender->write_still) { | ||||
| screen_opengl_render_write(oglrender); | screen_opengl_render_write(oglrender); | ||||
| } | } | ||||
| } | } | ||||
| static bool screen_opengl_fullsample_enabled(Scene *scene) | |||||
| { | |||||
| if (scene->r.scemode & R_FULL_SAMPLE) { | |||||
| return true; | |||||
| } | |||||
| else { | |||||
| /* XXX TODO: | |||||
| * Technically if the hardware supports MSAA we could keep using Blender 2.7x approach. | |||||
| * However anti-aliasing without full_sample is not playing well even in 2.7x. | |||||
| * | |||||
| * For example, if you enable depth of field, there is aliasing, even if the viewport is fine. | |||||
| * For 2.8x this is more complicated because so many things rely on shader. | |||||
| * So until we fix the gpu_framebuffer anti-aliasing suupport we need to force full sample. | |||||
| */ | |||||
| return true; | |||||
| } | |||||
| } | |||||
| static bool screen_opengl_render_init(bContext *C, wmOperator *op) | static bool screen_opengl_render_init(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| /* new render clears all callbacks */ | /* new render clears all callbacks */ | ||||
| wmWindowManager *wm = CTX_wm_manager(C); | wmWindowManager *wm = CTX_wm_manager(C); | ||||
| wmWindow *win = CTX_wm_window(C); | wmWindow *win = CTX_wm_window(C); | ||||
| WorkSpace *workspace = CTX_wm_workspace(C); | WorkSpace *workspace = CTX_wm_workspace(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| ScrArea *prevsa = CTX_wm_area(C); | ScrArea *prevsa = CTX_wm_area(C); | ||||
| ARegion *prevar = CTX_wm_region(C); | ARegion *prevar = CTX_wm_region(C); | ||||
| GPUOffScreen *ofs; | GPUOffScreen *ofs; | ||||
| OGLRender *oglrender; | OGLRender *oglrender; | ||||
| int sizex, sizey; | int sizex, sizey; | ||||
| const int samples = (scene->r.mode & R_OSA) ? scene->r.osa : 0; | |||||
| const bool full_samples = (samples != 0) && screen_opengl_fullsample_enabled(scene); | |||||
| bool is_view_context = RNA_boolean_get(op->ptr, "view_context"); | bool is_view_context = RNA_boolean_get(op->ptr, "view_context"); | ||||
| const bool is_animation = RNA_boolean_get(op->ptr, "animation"); | const bool is_animation = RNA_boolean_get(op->ptr, "animation"); | ||||
| const bool is_sequencer = RNA_boolean_get(op->ptr, "sequencer"); | const bool is_sequencer = RNA_boolean_get(op->ptr, "sequencer"); | ||||
| const bool is_write_still = RNA_boolean_get(op->ptr, "write_still"); | const bool is_write_still = RNA_boolean_get(op->ptr, "write_still"); | ||||
| char err_out[256] = "unknown"; | char err_out[256] = "unknown"; | ||||
| if (G.background) { | if (G.background) { | ||||
| BKE_report( | BKE_report( | ||||
| Show All 32 Lines | static bool screen_opengl_render_init(bContext *C, wmOperator *op) | ||||
| WM_jobs_kill_all_except(wm, CTX_wm_screen(C)); | WM_jobs_kill_all_except(wm, CTX_wm_screen(C)); | ||||
| /* create offscreen buffer */ | /* create offscreen buffer */ | ||||
| sizex = (scene->r.size * scene->r.xsch) / 100; | sizex = (scene->r.size * scene->r.xsch) / 100; | ||||
| sizey = (scene->r.size * scene->r.ysch) / 100; | sizey = (scene->r.size * scene->r.ysch) / 100; | ||||
| /* corrects render size with actual size, not every card supports non-power-of-two dimensions */ | /* corrects render size with actual size, not every card supports non-power-of-two dimensions */ | ||||
| DRW_opengl_context_enable(); /* Offscreen creation needs to be done in DRW context. */ | DRW_opengl_context_enable(); /* Offscreen creation needs to be done in DRW context. */ | ||||
| ofs = GPU_offscreen_create(sizex, sizey, full_samples ? 0 : samples, true, true, err_out); | ofs = GPU_offscreen_create(sizex, sizey, 0, true, true, err_out); | ||||
| DRW_opengl_context_disable(); | DRW_opengl_context_disable(); | ||||
| if (!ofs) { | if (!ofs) { | ||||
| BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out); | BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL off-screen buffer, %s", err_out); | ||||
| return false; | return false; | ||||
| } | } | ||||
| /* allocate opengl render */ | /* allocate opengl render */ | ||||
| oglrender = MEM_callocN(sizeof(OGLRender), "OGLRender"); | oglrender = MEM_callocN(sizeof(OGLRender), "OGLRender"); | ||||
| op->customdata = oglrender; | op->customdata = oglrender; | ||||
| oglrender->ofs = ofs; | oglrender->ofs = ofs; | ||||
| oglrender->ofs_samples = samples; | |||||
| oglrender->ofs_full_samples = full_samples; | |||||
| oglrender->sizex = sizex; | oglrender->sizex = sizex; | ||||
| oglrender->sizey = sizey; | oglrender->sizey = sizey; | ||||
| oglrender->bmain = CTX_data_main(C); | oglrender->bmain = CTX_data_main(C); | ||||
| oglrender->scene = scene; | oglrender->scene = scene; | ||||
| oglrender->workspace = workspace; | oglrender->workspace = workspace; | ||||
| oglrender->view_layer = CTX_data_view_layer(C); | oglrender->view_layer = CTX_data_view_layer(C); | ||||
| oglrender->depsgraph = CTX_data_depsgraph(C); | oglrender->depsgraph = CTX_data_depsgraph(C); | ||||
| oglrender->cfrao = scene->r.cfra; | oglrender->cfrao = scene->r.cfra; | ||||
| ▲ Show 20 Lines • Show All 562 Lines • Show Last 20 Lines | |||||