Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/draw/engines/eevee/eevee_render.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_render.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c1108
1 files changed, 567 insertions, 541 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index e563fa8b9ce..961fe103251 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -46,584 +46,610 @@
void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *depsgraph)
{
- EEVEE_Data *vedata = (EEVEE_Data *)ved;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_TextureList *txl = vedata->txl;
- EEVEE_FramebufferList *fbl = vedata->fbl;
- EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
- Scene *scene = DEG_get_evaluated_scene(depsgraph);
- const float *size_orig = DRW_viewport_size_get();
-
- /* Init default FB and render targets:
- * In render mode the default framebuffer is not generated
- * because there is no viewport. So we need to manually create it or
- * not use it. For code clarity we just allocate it make use of it. */
- DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
- DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-
- /* Alloc transient data. */
- if (!stl->g_data) {
- stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
- }
- EEVEE_PrivateData *g_data = stl->g_data;
- g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
- g_data->valid_double_buffer = 0;
- copy_v2_v2(g_data->size_orig, size_orig);
-
- if (scene->eevee.flag & SCE_EEVEE_OVERSCAN) {
- g_data->overscan = scene->eevee.overscan / 100.0f;
- g_data->overscan_pixels = roundf(max_ff(size_orig[0], size_orig[1]) * g_data->overscan);
- }
- else {
- g_data->overscan = 0.0f;
- g_data->overscan_pixels = 0.0f;
- }
-
- /* XXX overiding viewport size. Simplify things but is not really 100% safe. */
- DRW_render_viewport_size_set((int[2]){size_orig[0] + g_data->overscan_pixels * 2.0f,
- size_orig[1] + g_data->overscan_pixels * 2.0f});
-
- /* TODO 32 bit depth */
- DRW_texture_ensure_fullscreen_2d(&dtxl->depth, GPU_DEPTH24_STENCIL8, 0);
- DRW_texture_ensure_fullscreen_2d(&txl->color, GPU_RGBA32F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
-
- GPU_framebuffer_ensure_config(&dfbl->default_fb, {
- GPU_ATTACHMENT_TEXTURE(dtxl->depth),
- GPU_ATTACHMENT_TEXTURE(txl->color)
- });
- GPU_framebuffer_ensure_config(&fbl->main_fb, {
- GPU_ATTACHMENT_TEXTURE(dtxl->depth),
- GPU_ATTACHMENT_TEXTURE(txl->color)
- });
- GPU_framebuffer_ensure_config(&fbl->main_color_fb, {
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(txl->color)
- });
-
- /* Alloc common ubo data. */
- if (sldata->common_ubo == NULL) {
- sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data), &sldata->common_data);
- }
- if (sldata->clip_ubo == NULL) {
- sldata->clip_ubo = DRW_uniformbuffer_create(sizeof(sldata->clip_data), &sldata->clip_data);
- }
-
- /* Set the pers & view matrix. */
- /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
- struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
- float frame = BKE_scene_frame_get(scene);
- RE_GetCameraWindow(engine->re, ob_camera_eval, frame, g_data->winmat);
- RE_GetCameraModelMatrix(engine->re, ob_camera_eval, g_data->viewinv);
-
- RE_GetCameraWindowWithOverscan(engine->re, g_data->winmat, g_data->overscan);
-
- invert_m4_m4(g_data->viewmat, g_data->viewinv);
- mul_m4_m4m4(g_data->persmat, g_data->winmat, g_data->viewmat);
- invert_m4_m4(g_data->persinv, g_data->persmat);
- invert_m4_m4(g_data->wininv, g_data->winmat);
-
- DRW_viewport_matrix_override_set(g_data->persmat, DRW_MAT_PERS);
- DRW_viewport_matrix_override_set(g_data->persinv, DRW_MAT_PERSINV);
- DRW_viewport_matrix_override_set(g_data->winmat, DRW_MAT_WIN);
- DRW_viewport_matrix_override_set(g_data->wininv, DRW_MAT_WININV);
- DRW_viewport_matrix_override_set(g_data->viewmat, DRW_MAT_VIEW);
- DRW_viewport_matrix_override_set(g_data->viewinv, DRW_MAT_VIEWINV);
-
- /* EEVEE_effects_init needs to go first for TAA */
- EEVEE_effects_init(sldata, vedata, ob_camera_eval, false);
- EEVEE_materials_init(sldata, stl, fbl);
- EEVEE_lights_init(sldata);
- EEVEE_lightprobes_init(sldata, vedata);
-
- /* INIT CACHE */
- EEVEE_bloom_cache_init(sldata, vedata);
- EEVEE_depth_of_field_cache_init(sldata, vedata);
- EEVEE_effects_cache_init(sldata, vedata);
- EEVEE_lightprobes_cache_init(sldata, vedata);
- EEVEE_lights_cache_init(sldata, vedata);
- EEVEE_materials_cache_init(sldata, vedata);
- EEVEE_motion_blur_cache_init(sldata, vedata);
- EEVEE_occlusion_cache_init(sldata, vedata);
- EEVEE_screen_raytrace_cache_init(sldata, vedata);
- EEVEE_subsurface_cache_init(sldata, vedata);
- EEVEE_temporal_sampling_cache_init(sldata, vedata);
- EEVEE_volumes_cache_init(sldata, vedata);
+ EEVEE_Data *vedata = (EEVEE_Data *)ved;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_TextureList *txl = vedata->txl;
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+ Scene *scene = DEG_get_evaluated_scene(depsgraph);
+ const float *size_orig = DRW_viewport_size_get();
+
+ /* Init default FB and render targets:
+ * In render mode the default framebuffer is not generated
+ * because there is no viewport. So we need to manually create it or
+ * not use it. For code clarity we just allocate it make use of it. */
+ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+ /* Alloc transient data. */
+ if (!stl->g_data) {
+ stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
+ }
+ EEVEE_PrivateData *g_data = stl->g_data;
+ g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
+ g_data->valid_double_buffer = 0;
+ copy_v2_v2(g_data->size_orig, size_orig);
+
+ if (scene->eevee.flag & SCE_EEVEE_OVERSCAN) {
+ g_data->overscan = scene->eevee.overscan / 100.0f;
+ g_data->overscan_pixels = roundf(max_ff(size_orig[0], size_orig[1]) * g_data->overscan);
+ }
+ else {
+ g_data->overscan = 0.0f;
+ g_data->overscan_pixels = 0.0f;
+ }
+
+ /* XXX overiding viewport size. Simplify things but is not really 100% safe. */
+ DRW_render_viewport_size_set((int[2]){size_orig[0] + g_data->overscan_pixels * 2.0f,
+ size_orig[1] + g_data->overscan_pixels * 2.0f});
+
+ /* TODO 32 bit depth */
+ DRW_texture_ensure_fullscreen_2d(&dtxl->depth, GPU_DEPTH24_STENCIL8, 0);
+ DRW_texture_ensure_fullscreen_2d(&txl->color, GPU_RGBA32F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
+
+ GPU_framebuffer_ensure_config(
+ &dfbl->default_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(txl->color)});
+ GPU_framebuffer_ensure_config(
+ &fbl->main_fb, {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(txl->color)});
+ GPU_framebuffer_ensure_config(&fbl->main_color_fb,
+ {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->color)});
+
+ /* Alloc common ubo data. */
+ if (sldata->common_ubo == NULL) {
+ sldata->common_ubo = DRW_uniformbuffer_create(sizeof(sldata->common_data),
+ &sldata->common_data);
+ }
+ if (sldata->clip_ubo == NULL) {
+ sldata->clip_ubo = DRW_uniformbuffer_create(sizeof(sldata->clip_data), &sldata->clip_data);
+ }
+
+ /* Set the pers & view matrix. */
+ /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
+ struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
+ float frame = BKE_scene_frame_get(scene);
+ RE_GetCameraWindow(engine->re, ob_camera_eval, frame, g_data->winmat);
+ RE_GetCameraModelMatrix(engine->re, ob_camera_eval, g_data->viewinv);
+
+ RE_GetCameraWindowWithOverscan(engine->re, g_data->winmat, g_data->overscan);
+
+ invert_m4_m4(g_data->viewmat, g_data->viewinv);
+ mul_m4_m4m4(g_data->persmat, g_data->winmat, g_data->viewmat);
+ invert_m4_m4(g_data->persinv, g_data->persmat);
+ invert_m4_m4(g_data->wininv, g_data->winmat);
+
+ DRW_viewport_matrix_override_set(g_data->persmat, DRW_MAT_PERS);
+ DRW_viewport_matrix_override_set(g_data->persinv, DRW_MAT_PERSINV);
+ DRW_viewport_matrix_override_set(g_data->winmat, DRW_MAT_WIN);
+ DRW_viewport_matrix_override_set(g_data->wininv, DRW_MAT_WININV);
+ DRW_viewport_matrix_override_set(g_data->viewmat, DRW_MAT_VIEW);
+ DRW_viewport_matrix_override_set(g_data->viewinv, DRW_MAT_VIEWINV);
+
+ /* EEVEE_effects_init needs to go first for TAA */
+ EEVEE_effects_init(sldata, vedata, ob_camera_eval, false);
+ EEVEE_materials_init(sldata, stl, fbl);
+ EEVEE_lights_init(sldata);
+ EEVEE_lightprobes_init(sldata, vedata);
+
+ /* INIT CACHE */
+ EEVEE_bloom_cache_init(sldata, vedata);
+ EEVEE_depth_of_field_cache_init(sldata, vedata);
+ EEVEE_effects_cache_init(sldata, vedata);
+ EEVEE_lightprobes_cache_init(sldata, vedata);
+ EEVEE_lights_cache_init(sldata, vedata);
+ EEVEE_materials_cache_init(sldata, vedata);
+ EEVEE_motion_blur_cache_init(sldata, vedata);
+ EEVEE_occlusion_cache_init(sldata, vedata);
+ EEVEE_screen_raytrace_cache_init(sldata, vedata);
+ EEVEE_subsurface_cache_init(sldata, vedata);
+ EEVEE_temporal_sampling_cache_init(sldata, vedata);
+ EEVEE_volumes_cache_init(sldata, vedata);
}
/* Used by light cache. in this case engine is NULL. */
-void EEVEE_render_cache(
- void *vedata, struct Object *ob,
- struct RenderEngine *engine, struct Depsgraph *UNUSED(depsgraph))
+void EEVEE_render_cache(void *vedata,
+ struct Object *ob,
+ struct RenderEngine *engine,
+ struct Depsgraph *UNUSED(depsgraph))
{
- EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
- EEVEE_LightProbesInfo *pinfo = sldata->probes;
- bool cast_shadow = false;
-
- if (pinfo->vis_data.collection) {
- /* Used for rendering probe with visibility groups. */
- bool ob_vis = BKE_collection_has_object_recursive(pinfo->vis_data.collection, ob);
- ob_vis = (pinfo->vis_data.invert) ? !ob_vis : ob_vis;
-
- if (!ob_vis) {
- return;
- }
- }
-
- /* Don't print dupli objects as this can be very verbose and
- * increase the render time on Windows because of slow windows term.
- * (see T59649) */
- if (engine && (ob->base_flag & BASE_FROM_DUPLI) == 0) {
- char info[42];
- BLI_snprintf(info, sizeof(info), "Syncing %s", ob->id.name + 2);
- RE_engine_update_stats(engine, NULL, info);
- }
-
- const int ob_visibility = DRW_object_visibility_in_active_context(ob);
- if (ob_visibility & OB_VISIBLE_PARTICLES) {
- EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
- }
-
- if (ob_visibility & OB_VISIBLE_SELF) {
- if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
- EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow);
- }
- else if (ob->type == OB_LIGHTPROBE) {
- EEVEE_lightprobes_cache_add(sldata, vedata, ob);
- }
- else if (ob->type == OB_LAMP) {
- EEVEE_lights_cache_add(sldata, ob);
- }
- }
-
- if (cast_shadow) {
- EEVEE_lights_cache_shcaster_object_add(sldata, ob);
- }
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+ EEVEE_LightProbesInfo *pinfo = sldata->probes;
+ bool cast_shadow = false;
+
+ if (pinfo->vis_data.collection) {
+ /* Used for rendering probe with visibility groups. */
+ bool ob_vis = BKE_collection_has_object_recursive(pinfo->vis_data.collection, ob);
+ ob_vis = (pinfo->vis_data.invert) ? !ob_vis : ob_vis;
+
+ if (!ob_vis) {
+ return;
+ }
+ }
+
+ /* Don't print dupli objects as this can be very verbose and
+ * increase the render time on Windows because of slow windows term.
+ * (see T59649) */
+ if (engine && (ob->base_flag & BASE_FROM_DUPLI) == 0) {
+ char info[42];
+ BLI_snprintf(info, sizeof(info), "Syncing %s", ob->id.name + 2);
+ RE_engine_update_stats(engine, NULL, info);
+ }
+
+ const int ob_visibility = DRW_object_visibility_in_active_context(ob);
+ if (ob_visibility & OB_VISIBLE_PARTICLES) {
+ EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
+ }
+
+ if (ob_visibility & OB_VISIBLE_SELF) {
+ if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
+ EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow);
+ }
+ else if (ob->type == OB_LIGHTPROBE) {
+ EEVEE_lightprobes_cache_add(sldata, vedata, ob);
+ }
+ else if (ob->type == OB_LAMP) {
+ EEVEE_lights_cache_add(sldata, ob);
+ }
+ }
+
+ if (cast_shadow) {
+ EEVEE_lights_cache_shcaster_object_add(sldata, ob);
+ }
}
-static void eevee_render_result_combined(
- RenderLayer *rl, const char *viewname, const rcti *rect,
- EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata))
+static void eevee_render_result_combined(RenderLayer *rl,
+ const char *viewname,
+ const rcti *rect,
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *UNUSED(sldata))
{
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_COMBINED, viewname);
-
- GPU_framebuffer_bind(vedata->stl->effects->final_fb);
- GPU_framebuffer_read_color(
- vedata->stl->effects->final_fb,
- vedata->stl->g_data->overscan_pixels + rect->xmin,
- vedata->stl->g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- 4, 0, rp->rect);
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_COMBINED, viewname);
+
+ GPU_framebuffer_bind(vedata->stl->effects->final_fb);
+ GPU_framebuffer_read_color(vedata->stl->effects->final_fb,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 4,
+ 0,
+ rp->rect);
}
-static void eevee_render_result_subsurface(
- RenderLayer *rl, const char *viewname, const rcti *rect,
- EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata), int render_samples)
+static void eevee_render_result_subsurface(RenderLayer *rl,
+ const char *viewname,
+ const rcti *rect,
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *UNUSED(sldata),
+ int render_samples)
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- ViewLayer *view_layer = draw_ctx->view_layer;
-
- if (vedata->fbl->sss_accum_fb == NULL) {
- /* SSS is not enabled. */
- return;
- }
-
- if ((view_layer->passflag & SCE_PASS_SUBSURFACE_COLOR) != 0) {
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_SUBSURFACE_COLOR, viewname);
-
- GPU_framebuffer_bind(vedata->fbl->sss_accum_fb);
- GPU_framebuffer_read_color(
- vedata->fbl->sss_accum_fb,
- vedata->stl->g_data->overscan_pixels + rect->xmin,
- vedata->stl->g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- 3, 1, rp->rect);
-
- /* This is the accumulated color. Divide by the number of samples. */
- for (int i = 0; i < rp->rectx * rp->recty * 3; i++) {
- rp->rect[i] /= (float)render_samples;
- }
- }
-
- if ((view_layer->passflag & SCE_PASS_SUBSURFACE_DIRECT) != 0) {
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_SUBSURFACE_DIRECT, viewname);
-
- GPU_framebuffer_bind(vedata->fbl->sss_accum_fb);
- GPU_framebuffer_read_color(
- vedata->fbl->sss_accum_fb,
- vedata->stl->g_data->overscan_pixels + rect->xmin,
- vedata->stl->g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- 3, 0, rp->rect);
-
- /* This is the accumulated color. Divide by the number of samples. */
- for (int i = 0; i < rp->rectx * rp->recty * 3; i++) {
- rp->rect[i] /= (float)render_samples;
- }
- }
-
- if ((view_layer->passflag & SCE_PASS_SUBSURFACE_INDIRECT) != 0) {
- /* Do nothing as all the lighting is in the direct pass.
- * TODO : Separate Direct from indirect lighting. */
- }
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ViewLayer *view_layer = draw_ctx->view_layer;
+
+ if (vedata->fbl->sss_accum_fb == NULL) {
+ /* SSS is not enabled. */
+ return;
+ }
+
+ if ((view_layer->passflag & SCE_PASS_SUBSURFACE_COLOR) != 0) {
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_SUBSURFACE_COLOR, viewname);
+
+ GPU_framebuffer_bind(vedata->fbl->sss_accum_fb);
+ GPU_framebuffer_read_color(vedata->fbl->sss_accum_fb,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 3,
+ 1,
+ rp->rect);
+
+ /* This is the accumulated color. Divide by the number of samples. */
+ for (int i = 0; i < rp->rectx * rp->recty * 3; i++) {
+ rp->rect[i] /= (float)render_samples;
+ }
+ }
+
+ if ((view_layer->passflag & SCE_PASS_SUBSURFACE_DIRECT) != 0) {
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_SUBSURFACE_DIRECT, viewname);
+
+ GPU_framebuffer_bind(vedata->fbl->sss_accum_fb);
+ GPU_framebuffer_read_color(vedata->fbl->sss_accum_fb,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 3,
+ 0,
+ rp->rect);
+
+ /* This is the accumulated color. Divide by the number of samples. */
+ for (int i = 0; i < rp->rectx * rp->recty * 3; i++) {
+ rp->rect[i] /= (float)render_samples;
+ }
+ }
+
+ if ((view_layer->passflag & SCE_PASS_SUBSURFACE_INDIRECT) != 0) {
+ /* Do nothing as all the lighting is in the direct pass.
+ * TODO : Separate Direct from indirect lighting. */
+ }
}
-static void eevee_render_result_normal(
- RenderLayer *rl, const char *viewname, const rcti *rect,
- EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata))
+static void eevee_render_result_normal(RenderLayer *rl,
+ const char *viewname,
+ const rcti *rect,
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *UNUSED(sldata))
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- ViewLayer *view_layer = draw_ctx->view_layer;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_PrivateData *g_data = stl->g_data;
-
- /* Only read the center texel. */
- if (stl->effects->taa_current_sample > 1) {
- return;
- }
-
- if ((view_layer->passflag & SCE_PASS_NORMAL) != 0) {
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_NORMAL, viewname);
-
- GPU_framebuffer_bind(vedata->fbl->main_fb);
- GPU_framebuffer_read_color(
- vedata->fbl->main_fb,
- g_data->overscan_pixels + rect->xmin,
- g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- 3, 1, rp->rect);
-
- /* Convert Eevee encoded normals to Blender normals. */
- for (int i = 0; i < rp->rectx * rp->recty * 3; i += 3) {
- if (rp->rect[i] == 0.0f && rp->rect[i + 1] == 0.0f) {
- /* If normal is not correct then do not produce NANs. */
- continue;
- }
-
- float fenc[2];
- fenc[0] = rp->rect[i + 0] * 4.0f - 2.0f;
- fenc[1] = rp->rect[i + 1] * 4.0f - 2.0f;
-
- float f = dot_v2v2(fenc, fenc);
- float g = sqrtf(1.0f - f / 4.0f);
-
- rp->rect[i + 0] = fenc[0] * g;
- rp->rect[i + 1] = fenc[1] * g;
- rp->rect[i + 2] = 1.0f - f / 2.0f;
-
- mul_mat3_m4_v3(g_data->viewinv, &rp->rect[i]);
- }
- }
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ViewLayer *view_layer = draw_ctx->view_layer;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_PrivateData *g_data = stl->g_data;
+
+ /* Only read the center texel. */
+ if (stl->effects->taa_current_sample > 1) {
+ return;
+ }
+
+ if ((view_layer->passflag & SCE_PASS_NORMAL) != 0) {
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_NORMAL, viewname);
+
+ GPU_framebuffer_bind(vedata->fbl->main_fb);
+ GPU_framebuffer_read_color(vedata->fbl->main_fb,
+ g_data->overscan_pixels + rect->xmin,
+ g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 3,
+ 1,
+ rp->rect);
+
+ /* Convert Eevee encoded normals to Blender normals. */
+ for (int i = 0; i < rp->rectx * rp->recty * 3; i += 3) {
+ if (rp->rect[i] == 0.0f && rp->rect[i + 1] == 0.0f) {
+ /* If normal is not correct then do not produce NANs. */
+ continue;
+ }
+
+ float fenc[2];
+ fenc[0] = rp->rect[i + 0] * 4.0f - 2.0f;
+ fenc[1] = rp->rect[i + 1] * 4.0f - 2.0f;
+
+ float f = dot_v2v2(fenc, fenc);
+ float g = sqrtf(1.0f - f / 4.0f);
+
+ rp->rect[i + 0] = fenc[0] * g;
+ rp->rect[i + 1] = fenc[1] * g;
+ rp->rect[i + 2] = 1.0f - f / 2.0f;
+
+ mul_mat3_m4_v3(g_data->viewinv, &rp->rect[i]);
+ }
+ }
}
-static void eevee_render_result_z(
- RenderLayer *rl, const char *viewname, const rcti *rect,
- EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata)
+static void eevee_render_result_z(RenderLayer *rl,
+ const char *viewname,
+ const rcti *rect,
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *sldata)
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- ViewLayer *view_layer = draw_ctx->view_layer;
- EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_PrivateData *g_data = stl->g_data;
-
- /* Only read the center texel. */
- if (stl->effects->taa_current_sample > 1) {
- return;
- }
-
- if ((view_layer->passflag & SCE_PASS_Z) != 0) {
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname);
-
- GPU_framebuffer_bind(vedata->fbl->main_fb);
- GPU_framebuffer_read_depth(
- vedata->fbl->main_fb,
- g_data->overscan_pixels + rect->xmin,
- g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- rp->rect);
-
- bool is_persp = DRW_viewport_is_persp_get();
-
- /* Convert ogl depth [0..1] to view Z [near..far] */
- for (int i = 0; i < rp->rectx * rp->recty; ++i) {
- if (rp->rect[i] == 1.0f ) {
- rp->rect[i] = 1e10f; /* Background */
- }
- else {
- if (is_persp) {
- rp->rect[i] = rp->rect[i] * 2.0f - 1.0f;
- rp->rect[i] = g_data->winmat[3][2] / (rp->rect[i] + g_data->winmat[2][2]);
- }
- else {
- rp->rect[i] = -common_data->view_vecs[0][2] + rp->rect[i] * -common_data->view_vecs[1][2];
- }
- }
- }
- }
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ViewLayer *view_layer = draw_ctx->view_layer;
+ EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_PrivateData *g_data = stl->g_data;
+
+ /* Only read the center texel. */
+ if (stl->effects->taa_current_sample > 1) {
+ return;
+ }
+
+ if ((view_layer->passflag & SCE_PASS_Z) != 0) {
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname);
+
+ GPU_framebuffer_bind(vedata->fbl->main_fb);
+ GPU_framebuffer_read_depth(vedata->fbl->main_fb,
+ g_data->overscan_pixels + rect->xmin,
+ g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ rp->rect);
+
+ bool is_persp = DRW_viewport_is_persp_get();
+
+ /* Convert ogl depth [0..1] to view Z [near..far] */
+ for (int i = 0; i < rp->rectx * rp->recty; ++i) {
+ if (rp->rect[i] == 1.0f) {
+ rp->rect[i] = 1e10f; /* Background */
+ }
+ else {
+ if (is_persp) {
+ rp->rect[i] = rp->rect[i] * 2.0f - 1.0f;
+ rp->rect[i] = g_data->winmat[3][2] / (rp->rect[i] + g_data->winmat[2][2]);
+ }
+ else {
+ rp->rect[i] = -common_data->view_vecs[0][2] +
+ rp->rect[i] * -common_data->view_vecs[1][2];
+ }
+ }
+ }
+ }
}
-static void eevee_render_result_mist(
- RenderLayer *rl, const char *viewname, const rcti *rect,
- EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata), int render_samples)
+static void eevee_render_result_mist(RenderLayer *rl,
+ const char *viewname,
+ const rcti *rect,
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *UNUSED(sldata),
+ int render_samples)
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- ViewLayer *view_layer = draw_ctx->view_layer;
-
- if ((view_layer->passflag & SCE_PASS_MIST) != 0) {
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_MIST, viewname);
-
- GPU_framebuffer_bind(vedata->fbl->mist_accum_fb);
- GPU_framebuffer_read_color(
- vedata->fbl->mist_accum_fb,
- vedata->stl->g_data->overscan_pixels + rect->xmin,
- vedata->stl->g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- 1, 0, rp->rect);
-
- /* This is the accumulated color. Divide by the number of samples. */
- for (int i = 0; i < rp->rectx * rp->recty; i++) {
- rp->rect[i] /= (float)render_samples;
- }
- }
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ViewLayer *view_layer = draw_ctx->view_layer;
+
+ if ((view_layer->passflag & SCE_PASS_MIST) != 0) {
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_MIST, viewname);
+
+ GPU_framebuffer_bind(vedata->fbl->mist_accum_fb);
+ GPU_framebuffer_read_color(vedata->fbl->mist_accum_fb,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 1,
+ 0,
+ rp->rect);
+
+ /* This is the accumulated color. Divide by the number of samples. */
+ for (int i = 0; i < rp->rectx * rp->recty; i++) {
+ rp->rect[i] /= (float)render_samples;
+ }
+ }
}
-static void eevee_render_result_occlusion(
- RenderLayer *rl, const char *viewname, const rcti *rect,
- EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata), int render_samples)
+static void eevee_render_result_occlusion(RenderLayer *rl,
+ const char *viewname,
+ const rcti *rect,
+ EEVEE_Data *vedata,
+ EEVEE_ViewLayerData *UNUSED(sldata),
+ int render_samples)
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- ViewLayer *view_layer = draw_ctx->view_layer;
-
- if (vedata->fbl->ao_accum_fb == NULL) {
- /* AO is not enabled. */
- return;
- }
-
- if ((view_layer->passflag & SCE_PASS_AO) != 0) {
- RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_AO, viewname);
-
- GPU_framebuffer_bind(vedata->fbl->ao_accum_fb);
- GPU_framebuffer_read_color(
- vedata->fbl->ao_accum_fb,
- vedata->stl->g_data->overscan_pixels + rect->xmin,
- vedata->stl->g_data->overscan_pixels + rect->ymin,
- BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
- 3, 0, rp->rect);
-
- /* This is the accumulated color. Divide by the number of samples. */
- for (int i = 0; i < rp->rectx * rp->recty * 3; i += 3) {
- rp->rect[i] = rp->rect[i + 1] = rp->rect[i + 2] = min_ff(1.0f, rp->rect[i] / (float)render_samples);
- }
- }
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ ViewLayer *view_layer = draw_ctx->view_layer;
+
+ if (vedata->fbl->ao_accum_fb == NULL) {
+ /* AO is not enabled. */
+ return;
+ }
+
+ if ((view_layer->passflag & SCE_PASS_AO) != 0) {
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_AO, viewname);
+
+ GPU_framebuffer_bind(vedata->fbl->ao_accum_fb);
+ GPU_framebuffer_read_color(vedata->fbl->ao_accum_fb,
+ vedata->stl->g_data->overscan_pixels + rect->xmin,
+ vedata->stl->g_data->overscan_pixels + rect->ymin,
+ BLI_rcti_size_x(rect),
+ BLI_rcti_size_y(rect),
+ 3,
+ 0,
+ rp->rect);
+
+ /* This is the accumulated color. Divide by the number of samples. */
+ for (int i = 0; i < rp->rectx * rp->recty * 3; i += 3) {
+ rp->rect[i] = rp->rect[i + 1] = rp->rect[i + 2] = min_ff(
+ 1.0f, rp->rect[i] / (float)render_samples);
+ }
+ }
}
static void eevee_render_draw_background(EEVEE_Data *vedata)
{
- EEVEE_FramebufferList *fbl = vedata->fbl;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_PassList *psl = vedata->psl;
-
- /* Prevent background to write to data buffers.
- * NOTE : This also make sure the textures are bound
- * to the right double buffer. */
- GPU_framebuffer_ensure_config(&fbl->main_fb, {
- GPU_ATTACHMENT_LEAVE,
- GPU_ATTACHMENT_LEAVE,
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_NONE
- });
- GPU_framebuffer_bind(fbl->main_fb);
-
- DRW_draw_pass(psl->background_pass);
-
- GPU_framebuffer_ensure_config(&fbl->main_fb, {
- GPU_ATTACHMENT_LEAVE,
- GPU_ATTACHMENT_LEAVE,
- GPU_ATTACHMENT_TEXTURE(stl->effects->ssr_normal_input),
- GPU_ATTACHMENT_TEXTURE(stl->effects->ssr_specrough_input),
- GPU_ATTACHMENT_TEXTURE(stl->effects->sss_data),
- GPU_ATTACHMENT_TEXTURE(stl->effects->sss_albedo)
- });
- GPU_framebuffer_bind(fbl->main_fb);
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_PassList *psl = vedata->psl;
+
+ /* Prevent background to write to data buffers.
+ * NOTE : This also make sure the textures are bound
+ * to the right double buffer. */
+ GPU_framebuffer_ensure_config(&fbl->main_fb,
+ {GPU_ATTACHMENT_LEAVE,
+ GPU_ATTACHMENT_LEAVE,
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_NONE});
+ GPU_framebuffer_bind(fbl->main_fb);
+
+ DRW_draw_pass(psl->background_pass);
+
+ GPU_framebuffer_ensure_config(&fbl->main_fb,
+ {GPU_ATTACHMENT_LEAVE,
+ GPU_ATTACHMENT_LEAVE,
+ GPU_ATTACHMENT_TEXTURE(stl->effects->ssr_normal_input),
+ GPU_ATTACHMENT_TEXTURE(stl->effects->ssr_specrough_input),
+ GPU_ATTACHMENT_TEXTURE(stl->effects->sss_data),
+ GPU_ATTACHMENT_TEXTURE(stl->effects->sss_albedo)});
+ GPU_framebuffer_bind(fbl->main_fb);
}
void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl, const rcti *rect)
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
- ViewLayer *view_layer = draw_ctx->view_layer;
- const char *viewname = RE_GetActiveRenderView(engine->re);
- EEVEE_PassList *psl = vedata->psl;
- EEVEE_StorageList *stl = vedata->stl;
- EEVEE_FramebufferList *fbl = vedata->fbl;
- DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
- EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
- EEVEE_PrivateData *g_data = stl->g_data;
-
- /* FINISH CACHE */
- EEVEE_materials_cache_finish(vedata);
- EEVEE_lights_cache_finish(sldata, vedata);
- EEVEE_lightprobes_cache_finish(sldata, vedata);
-
- /* Sort transparents before the loop. */
- DRW_pass_sort_shgroup_z(psl->transparent_pass);
-
- /* Push instances attributes to the GPU. */
- DRW_render_instance_buffer_finish();
-
- /* Need to be called after DRW_render_instance_buffer_finish() */
- /* Also we weed to have a correct fbo bound for DRW_hair_update */
- GPU_framebuffer_bind(fbl->main_fb);
- DRW_hair_update();
-
- if ((view_layer->passflag & (SCE_PASS_SUBSURFACE_COLOR |
- SCE_PASS_SUBSURFACE_DIRECT |
- SCE_PASS_SUBSURFACE_INDIRECT)) != 0)
- {
- EEVEE_subsurface_output_init(sldata, vedata);
- }
-
- if ((view_layer->passflag & SCE_PASS_MIST) != 0) {
- EEVEE_mist_output_init(sldata, vedata);
- }
-
- if ((view_layer->passflag & SCE_PASS_AO) != 0) {
- EEVEE_occlusion_output_init(sldata, vedata);
- }
-
- uint tot_sample = scene_eval->eevee.taa_render_samples;
- uint render_samples = 0;
-
- if (RE_engine_test_break(engine)) {
- return;
- }
-
- while (render_samples < tot_sample && !RE_engine_test_break(engine)) {
- float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
- float clear_depth = 1.0f;
- uint clear_stencil = 0x00;
- uint primes[3] = {2, 3, 7};
- double offset[3] = {0.0, 0.0, 0.0};
- double r[3];
-
- /* Restore winmat before jittering again. */
- copy_m4_m4(stl->effects->overide_winmat, g_data->winmat);
- /* Copy previous persmat to UBO data */
- copy_m4_m4(sldata->common_data.prev_persmat, stl->effects->prev_persmat);
-
- BLI_halton_3d(primes, offset, stl->effects->taa_current_sample, r);
- EEVEE_update_noise(psl, fbl, r);
- EEVEE_temporal_sampling_matrices_calc(stl->effects, g_data->viewmat, g_data->persmat, r);
- EEVEE_volumes_set_jitter(sldata, stl->effects->taa_current_sample - 1);
- EEVEE_materials_init(sldata, stl, fbl);
-
- /* Set matrices. */
- DRW_viewport_matrix_override_set(stl->effects->overide_persmat, DRW_MAT_PERS);
- DRW_viewport_matrix_override_set(stl->effects->overide_persinv, DRW_MAT_PERSINV);
- DRW_viewport_matrix_override_set(stl->effects->overide_winmat, DRW_MAT_WIN);
- DRW_viewport_matrix_override_set(stl->effects->overide_wininv, DRW_MAT_WININV);
- DRW_viewport_matrix_override_set(g_data->viewmat, DRW_MAT_VIEW);
- DRW_viewport_matrix_override_set(g_data->viewinv, DRW_MAT_VIEWINV);
-
- /* Refresh Probes */
- EEVEE_lightprobes_refresh(sldata, vedata);
- EEVEE_lightprobes_refresh_planar(sldata, vedata);
-
- /* Don't print every samples as it can lead to bad performance. (see T59649) */
- if ((render_samples % 25) == 0 ||
- (render_samples + 1) == tot_sample)
- {
- char info[42];
- BLI_snprintf(info, sizeof(info), "Rendering %u / %u samples", render_samples + 1, tot_sample);
- RE_engine_update_stats(engine, NULL, info);
- }
-
- /* Refresh Shadows */
- EEVEE_lights_update(sldata, vedata);
- EEVEE_draw_shadows(sldata, vedata);
-
- /* Set ray type. */
- sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
- sldata->common_data.ray_depth = 0.0f;
- DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
-
- GPU_framebuffer_bind(fbl->main_fb);
- GPU_framebuffer_clear_color_depth_stencil(fbl->main_fb, clear_col, clear_depth, clear_stencil);
- /* Depth prepass */
- DRW_draw_pass(psl->depth_pass);
- DRW_draw_pass(psl->depth_pass_cull);
- /* Create minmax texture */
- EEVEE_create_minmax_buffer(vedata, dtxl->depth, -1);
- EEVEE_occlusion_compute(sldata, vedata, dtxl->depth, -1);
- EEVEE_volumes_compute(sldata, vedata);
- /* Shading pass */
- eevee_render_draw_background(vedata);
- GPU_framebuffer_bind(fbl->main_fb);
- EEVEE_draw_default_passes(psl);
- DRW_draw_pass(psl->material_pass);
- DRW_draw_pass(psl->material_pass_cull);
- EEVEE_subsurface_data_render(sldata, vedata);
- /* Effects pre-transparency */
- EEVEE_subsurface_compute(sldata, vedata);
- EEVEE_reflection_compute(sldata, vedata);
- EEVEE_refraction_compute(sldata, vedata);
- /* Opaque refraction */
- DRW_draw_pass(psl->refract_depth_pass);
- DRW_draw_pass(psl->refract_depth_pass_cull);
- DRW_draw_pass(psl->refract_pass);
- /* Subsurface output */
- EEVEE_subsurface_output_accumulate(sldata, vedata);
- /* Occlusion output */
- EEVEE_occlusion_output_accumulate(sldata, vedata);
- /* Result NORMAL */
- eevee_render_result_normal(rl, viewname, rect, vedata, sldata);
- /* Volumetrics Resolve Opaque */
- EEVEE_volumes_resolve(sldata, vedata);
- /* Mist output */
- EEVEE_mist_output_accumulate(sldata, vedata);
- /* Transparent */
- DRW_draw_pass(psl->transparent_pass);
- /* Result Z */
- eevee_render_result_z(rl, viewname, rect, vedata, sldata);
- /* Post Process */
- EEVEE_draw_effects(sldata, vedata);
-
- /* XXX Seems to fix TDR issue with NVidia drivers on linux. */
- GPU_finish();
-
- RE_engine_update_progress(engine, (float)(render_samples++) / (float)tot_sample);
- }
-
- eevee_render_result_combined(rl, viewname, rect, vedata, sldata);
- eevee_render_result_subsurface(rl, viewname, rect, vedata, sldata, render_samples);
- eevee_render_result_mist(rl, viewname, rect, vedata, sldata, render_samples);
- eevee_render_result_occlusion(rl, viewname, rect, vedata, sldata, render_samples);
-
- /* Restore original viewport size. */
- DRW_render_viewport_size_set((int[2]){g_data->size_orig[0], g_data->size_orig[1]});
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
+ ViewLayer *view_layer = draw_ctx->view_layer;
+ const char *viewname = RE_GetActiveRenderView(engine->re);
+ EEVEE_PassList *psl = vedata->psl;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+ EEVEE_PrivateData *g_data = stl->g_data;
+
+ /* FINISH CACHE */
+ EEVEE_materials_cache_finish(vedata);
+ EEVEE_lights_cache_finish(sldata, vedata);
+ EEVEE_lightprobes_cache_finish(sldata, vedata);
+
+ /* Sort transparents before the loop. */
+ DRW_pass_sort_shgroup_z(psl->transparent_pass);
+
+ /* Push instances attributes to the GPU. */
+ DRW_render_instance_buffer_finish();
+
+ /* Need to be called after DRW_render_instance_buffer_finish() */
+ /* Also we weed to have a correct fbo bound for DRW_hair_update */
+ GPU_framebuffer_bind(fbl->main_fb);
+ DRW_hair_update();
+
+ if ((view_layer->passflag & (SCE_PASS_SUBSURFACE_COLOR | SCE_PASS_SUBSURFACE_DIRECT |
+ SCE_PASS_SUBSURFACE_INDIRECT)) != 0) {
+ EEVEE_subsurface_output_init(sldata, vedata);
+ }
+
+ if ((view_layer->passflag & SCE_PASS_MIST) != 0) {
+ EEVEE_mist_output_init(sldata, vedata);
+ }
+
+ if ((view_layer->passflag & SCE_PASS_AO) != 0) {
+ EEVEE_occlusion_output_init(sldata, vedata);
+ }
+
+ uint tot_sample = scene_eval->eevee.taa_render_samples;
+ uint render_samples = 0;
+
+ if (RE_engine_test_break(engine)) {
+ return;
+ }
+
+ while (render_samples < tot_sample && !RE_engine_test_break(engine)) {
+ float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float clear_depth = 1.0f;
+ uint clear_stencil = 0x00;
+ uint primes[3] = {2, 3, 7};
+ double offset[3] = {0.0, 0.0, 0.0};
+ double r[3];
+
+ /* Restore winmat before jittering again. */
+ copy_m4_m4(stl->effects->overide_winmat, g_data->winmat);
+ /* Copy previous persmat to UBO data */
+ copy_m4_m4(sldata->common_data.prev_persmat, stl->effects->prev_persmat);
+
+ BLI_halton_3d(primes, offset, stl->effects->taa_current_sample, r);
+ EEVEE_update_noise(psl, fbl, r);
+ EEVEE_temporal_sampling_matrices_calc(stl->effects, g_data->viewmat, g_data->persmat, r);
+ EEVEE_volumes_set_jitter(sldata, stl->effects->taa_current_sample - 1);
+ EEVEE_materials_init(sldata, stl, fbl);
+
+ /* Set matrices. */
+ DRW_viewport_matrix_override_set(stl->effects->overide_persmat, DRW_MAT_PERS);
+ DRW_viewport_matrix_override_set(stl->effects->overide_persinv, DRW_MAT_PERSINV);
+ DRW_viewport_matrix_override_set(stl->effects->overide_winmat, DRW_MAT_WIN);
+ DRW_viewport_matrix_override_set(stl->effects->overide_wininv, DRW_MAT_WININV);
+ DRW_viewport_matrix_override_set(g_data->viewmat, DRW_MAT_VIEW);
+ DRW_viewport_matrix_override_set(g_data->viewinv, DRW_MAT_VIEWINV);
+
+ /* Refresh Probes */
+ EEVEE_lightprobes_refresh(sldata, vedata);
+ EEVEE_lightprobes_refresh_planar(sldata, vedata);
+
+ /* Don't print every samples as it can lead to bad performance. (see T59649) */
+ if ((render_samples % 25) == 0 || (render_samples + 1) == tot_sample) {
+ char info[42];
+ BLI_snprintf(
+ info, sizeof(info), "Rendering %u / %u samples", render_samples + 1, tot_sample);
+ RE_engine_update_stats(engine, NULL, info);
+ }
+
+ /* Refresh Shadows */
+ EEVEE_lights_update(sldata, vedata);
+ EEVEE_draw_shadows(sldata, vedata);
+
+ /* Set ray type. */
+ sldata->common_data.ray_type = EEVEE_RAY_CAMERA;
+ sldata->common_data.ray_depth = 0.0f;
+ DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
+
+ GPU_framebuffer_bind(fbl->main_fb);
+ GPU_framebuffer_clear_color_depth_stencil(fbl->main_fb, clear_col, clear_depth, clear_stencil);
+ /* Depth prepass */
+ DRW_draw_pass(psl->depth_pass);
+ DRW_draw_pass(psl->depth_pass_cull);
+ /* Create minmax texture */
+ EEVEE_create_minmax_buffer(vedata, dtxl->depth, -1);
+ EEVEE_occlusion_compute(sldata, vedata, dtxl->depth, -1);
+ EEVEE_volumes_compute(sldata, vedata);
+ /* Shading pass */
+ eevee_render_draw_background(vedata);
+ GPU_framebuffer_bind(fbl->main_fb);
+ EEVEE_draw_default_passes(psl);
+ DRW_draw_pass(psl->material_pass);
+ DRW_draw_pass(psl->material_pass_cull);
+ EEVEE_subsurface_data_render(sldata, vedata);
+ /* Effects pre-transparency */
+ EEVEE_subsurface_compute(sldata, vedata);
+ EEVEE_reflection_compute(sldata, vedata);
+ EEVEE_refraction_compute(sldata, vedata);
+ /* Opaque refraction */
+ DRW_draw_pass(psl->refract_depth_pass);
+ DRW_draw_pass(psl->refract_depth_pass_cull);
+ DRW_draw_pass(psl->refract_pass);
+ /* Subsurface output */
+ EEVEE_subsurface_output_accumulate(sldata, vedata);
+ /* Occlusion output */
+ EEVEE_occlusion_output_accumulate(sldata, vedata);
+ /* Result NORMAL */
+ eevee_render_result_normal(rl, viewname, rect, vedata, sldata);
+ /* Volumetrics Resolve Opaque */
+ EEVEE_volumes_resolve(sldata, vedata);
+ /* Mist output */
+ EEVEE_mist_output_accumulate(sldata, vedata);
+ /* Transparent */
+ DRW_draw_pass(psl->transparent_pass);
+ /* Result Z */
+ eevee_render_result_z(rl, viewname, rect, vedata, sldata);
+ /* Post Process */
+ EEVEE_draw_effects(sldata, vedata);
+
+ /* XXX Seems to fix TDR issue with NVidia drivers on linux. */
+ GPU_finish();
+
+ RE_engine_update_progress(engine, (float)(render_samples++) / (float)tot_sample);
+ }
+
+ eevee_render_result_combined(rl, viewname, rect, vedata, sldata);
+ eevee_render_result_subsurface(rl, viewname, rect, vedata, sldata, render_samples);
+ eevee_render_result_mist(rl, viewname, rect, vedata, sldata, render_samples);
+ eevee_render_result_occlusion(rl, viewname, rect, vedata, sldata, render_samples);
+
+ /* Restore original viewport size. */
+ DRW_render_viewport_size_set((int[2]){g_data->size_orig[0], g_data->size_orig[1]});
}
void EEVEE_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
{
- int type;
+ int type;
- RE_engine_register_pass(engine, scene, view_layer, RE_PASSNAME_COMBINED, 4, "RGBA", SOCK_RGBA);
+ RE_engine_register_pass(engine, scene, view_layer, RE_PASSNAME_COMBINED, 4, "RGBA", SOCK_RGBA);
#define CHECK_PASS(name, channels, chanid) \
- if (view_layer->passflag & (SCE_PASS_ ## name)) { \
- if (channels == 4) type = SOCK_RGBA; \
- else if (channels == 3) type = SOCK_VECTOR; \
- else type = SOCK_FLOAT; \
- RE_engine_register_pass(engine, scene, view_layer, RE_PASSNAME_ ## name, channels, chanid, type); \
- } ((void)0)
-
- CHECK_PASS(Z, 1, "Z");
- CHECK_PASS(MIST, 1, "Z");
- CHECK_PASS(NORMAL, 3, "XYZ");
- CHECK_PASS(AO, 3, "RGB");
- CHECK_PASS(SUBSURFACE_COLOR, 3, "RGB");
- CHECK_PASS(SUBSURFACE_DIRECT, 3, "RGB");
+ if (view_layer->passflag & (SCE_PASS_##name)) { \
+ if (channels == 4) \
+ type = SOCK_RGBA; \
+ else if (channels == 3) \
+ type = SOCK_VECTOR; \
+ else \
+ type = SOCK_FLOAT; \
+ RE_engine_register_pass( \
+ engine, scene, view_layer, RE_PASSNAME_##name, channels, chanid, type); \
+ } \
+ ((void)0)
+
+ CHECK_PASS(Z, 1, "Z");
+ CHECK_PASS(MIST, 1, "Z");
+ CHECK_PASS(NORMAL, 3, "XYZ");
+ CHECK_PASS(AO, 3, "RGB");
+ CHECK_PASS(SUBSURFACE_COLOR, 3, "RGB");
+ CHECK_PASS(SUBSURFACE_DIRECT, 3, "RGB");
#undef CHECK_PASS
}