Changeset View
Changeset View
Standalone View
Standalone View
source/blender/render/intern/engine.c
| Show First 20 Lines • Show All 429 Lines • ▼ Show 20 Lines | void RE_engine_end_result( | ||||
| if (engine->bake.pixels) { | if (engine->bake.pixels) { | ||||
| render_result_to_bake(engine, result); | render_result_to_bake(engine, result); | ||||
| BLI_remlink(&engine->fullresult, result); | BLI_remlink(&engine->fullresult, result); | ||||
| render_result_free(result); | render_result_free(result); | ||||
| return; | return; | ||||
| } | } | ||||
| re_ensure_passes_allocated_thread_safe(re); | |||||
| if (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES)) { | if (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES)) { | ||||
| const HighlightedTile tile = highlighted_tile_from_result_get(re, result); | const HighlightedTile tile = highlighted_tile_from_result_get(re, result); | ||||
| engine_tile_highlight_set(engine, &tile, highlight); | engine_tile_highlight_set(engine, &tile, highlight); | ||||
| } | } | ||||
| if (!cancel || merge_results) { | if (!cancel || merge_results) { | ||||
| if (!(re->test_break(re->tbh) && (re->r.scemode & R_BUTS_PREVIEW))) { | if (!(re->test_break(re->tbh) && (re->r.scemode & R_BUTS_PREVIEW))) { | ||||
| re_ensure_passes_allocated_thread_safe(re); | |||||
| render_result_merge(re->result, result); | render_result_merge(re->result, result); | ||||
| } | } | ||||
| /* draw */ | /* draw */ | ||||
| if (!re->test_break(re->tbh)) { | if (!re->test_break(re->tbh)) { | ||||
| result->renlay = result->layers.first; /* weak, draws first layer always */ | result->renlay = result->layers.first; /* weak, draws first layer always */ | ||||
| re->display_update(re->duh, result, NULL); | re->display_update(re->duh, result, NULL); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 462 Lines • ▼ Show 20 Lines | if (use_engine) { | ||||
| re->engine->flag &= ~RE_ENGINE_CAN_DRAW; | re->engine->flag &= ~RE_ENGINE_CAN_DRAW; | ||||
| BLI_mutex_unlock(&engine->re->engine_draw_mutex); | BLI_mutex_unlock(&engine->re->engine_draw_mutex); | ||||
| if (use_gpu_context) { | if (use_gpu_context) { | ||||
| DRW_render_context_disable(engine->re); | DRW_render_context_disable(engine->re); | ||||
| } | } | ||||
| } | } | ||||
| /* Optionally composite grease pencil over render result. */ | /* Optionally composite grease pencil over render result. | ||||
| if (engine->has_grease_pencil && use_grease_pencil) { | * Only do it if the passes are allocated (and the engine will not override the grease pencil | ||||
| * when reading its result from EXR file and writing to the Blender side. */ | |||||
| if (engine->has_grease_pencil && use_grease_pencil && re->result->passes_allocated) { | |||||
| /* NOTE: External engine might have been requested to free its | /* NOTE: External engine might have been requested to free its | ||||
| * dependency graph, which is only allowed if there is no grease | * dependency graph, which is only allowed if there is no grease | ||||
| * pencil (pipeline is taking care of that). */ | * pencil (pipeline is taking care of that). */ | ||||
| if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) { | if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) { | ||||
| DRW_render_gpencil(engine, engine->depsgraph); | DRW_render_gpencil(engine, engine->depsgraph); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | bool RE_engine_render(Render *re, bool do_all) | ||||
| engine->resolution_x = re->winx; | engine->resolution_x = re->winx; | ||||
| engine->resolution_y = re->winy; | engine->resolution_y = re->winy; | ||||
| /* Clear UI drawing locks. */ | /* Clear UI drawing locks. */ | ||||
| if (re->draw_lock) { | if (re->draw_lock) { | ||||
| re->draw_lock(re->dlh, false); | re->draw_lock(re->dlh, false); | ||||
| } | } | ||||
| /* Render view layers. */ | |||||
| bool delay_grease_pencil = false; | |||||
| if (type->render) { | if (type->render) { | ||||
| FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) { | FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) { | ||||
| engine_render_view_layer(re, engine, view_layer_iter, true, true); | engine_render_view_layer(re, engine, view_layer_iter, true, true); | ||||
| /* If render passes are not allocated the render engine deferred final pixels write for | |||||
| * later. Need to defer the grease pencil for until after the engine has written the | |||||
| * render result to Blender. */ | |||||
| delay_grease_pencil = engine->has_grease_pencil && !re->result->passes_allocated; | |||||
| if (RE_engine_test_break(engine)) { | if (RE_engine_test_break(engine)) { | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| FOREACH_VIEW_LAYER_TO_RENDER_END; | FOREACH_VIEW_LAYER_TO_RENDER_END; | ||||
| } | } | ||||
| if (type->render_frame_finish) { | if (type->render_frame_finish) { | ||||
| type->render_frame_finish(engine); | type->render_frame_finish(engine); | ||||
| } | } | ||||
| /* Perform delayed grease pencil rendering. */ | |||||
| if (delay_grease_pencil) { | |||||
| FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) { | |||||
| engine_render_view_layer(re, engine, view_layer_iter, false, true); | |||||
| if (RE_engine_test_break(engine)) { | |||||
| break; | |||||
| } | |||||
| } | |||||
| FOREACH_VIEW_LAYER_TO_RENDER_END; | |||||
| } | |||||
| /* Clear tile data */ | /* Clear tile data */ | ||||
| engine->flag &= ~RE_ENGINE_RENDERING; | engine->flag &= ~RE_ENGINE_RENDERING; | ||||
| render_result_free_list(&engine->fullresult, engine->fullresult.first); | render_result_free_list(&engine->fullresult, engine->fullresult.first); | ||||
| /* re->engine becomes zero if user changed active render engine during render */ | /* re->engine becomes zero if user changed active render engine during render */ | ||||
| if (!engine_keep_depsgraph(engine) || !re->engine) { | if (!engine_keep_depsgraph(engine) || !re->engine) { | ||||
| engine_depsgraph_free(engine); | engine_depsgraph_free(engine); | ||||
| ▲ Show 20 Lines • Show All 150 Lines • Show Last 20 Lines | |||||