diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-05-21 13:34:48 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-05-22 14:29:05 +0300 |
commit | 925b5823ccbc4fb3f7f90b29950e3d7bb0d5c90e (patch) | |
tree | 6ebbf9db572dd454972200c1e3f4ecc8b313c5a3 /source/blender/draw | |
parent | b944a6698659511b7c37c5bb33aa22df8c52826c (diff) |
Eevee: Use DRW_view_* API instead of DRW_viewport_matrix_*
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_effects.c | 23 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 14 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 9 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lights.c | 105 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lookdev.c | 30 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 4 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_motion_blur.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 22 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_render.c | 44 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_temporal_sampling.c | 54 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_volumes.c | 4 |
11 files changed, 153 insertions, 158 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 8a85c6671fd..3562afc9134 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -360,6 +360,13 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_vec4(grp, "color2", effects->color_checker_light, 1); DRW_shgroup_uniform_int_copy(grp, "size", 8); DRW_shgroup_call(grp, quad, NULL); + + float mat[4][4]; + unit_m4(mat); + + /* Using default view bypasses the culling. */ + const DRWView *default_view = DRW_view_default_get(); + effects->checker_view = DRW_view_create_sub(default_view, mat, mat); } } @@ -515,16 +522,11 @@ void EEVEE_draw_alpha_checker(EEVEE_Data *vedata) EEVEE_EffectsInfo *effects = stl->effects; if ((effects->enabled_effects & EFFECT_ALPHA_CHECKER) != 0) { - float mat[4][4]; - unit_m4(mat); - - /* Fragile, rely on the fact that GPU_SHADER_2D_CHECKER - * only use the persmat. */ - DRW_viewport_matrix_override_set(mat, DRW_MAT_PERS); + DRW_view_set_active(effects->checker_view); DRW_draw_pass(psl->alpha_checker); - DRW_viewport_matrix_override_unset(DRW_MAT_PERS); + DRW_view_set_active(NULL); } } @@ -534,16 +536,17 @@ static void EEVEE_velocity_resolve(EEVEE_Data *vedata) EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_StorageList *stl = vedata->stl; EEVEE_EffectsInfo *effects = stl->effects; + struct DRWView *view = effects->taa_view; if ((effects->enabled_effects & EFFECT_VELOCITY_BUFFER) != 0) { DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); e_data.depth_src = dtxl->depth; - DRW_viewport_matrix_get(effects->velocity_curr_persinv, DRW_MAT_PERSINV); + DRW_view_persmat_get(view, effects->velocity_curr_persinv, true); GPU_framebuffer_bind(fbl->velocity_resolve_fb); DRW_draw_pass(psl->velocity_resolve); } - DRW_viewport_matrix_get(effects->velocity_past_persmat, DRW_MAT_PERS); + DRW_view_persmat_get(view, effects->velocity_past_persmat, false); } void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) @@ -594,7 +597,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) } /* Record pers matrix for the next frame. */ - DRW_viewport_matrix_get(stl->effects->prev_persmat, DRW_MAT_PERS); + DRW_view_persmat_get(effects->taa_view, effects->prev_persmat, false); /* Update double buffer status if render mode. */ if (DRW_state_is_image_render()) { diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 481b566eff0..35614ac79fc 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -88,11 +88,6 @@ static void eevee_engine_init(void *ved) EEVEE_materials_init(sldata, stl, fbl); EEVEE_lights_init(sldata); EEVEE_lightprobes_init(sldata, vedata); - - if ((stl->effects->taa_current_sample > 1) && !DRW_state_is_image_render()) { - /* XXX otherwise it would break the other engines. */ - DRW_viewport_matrix_override_unset_all(); - } } static void eevee_cache_init(void *vedata) @@ -217,10 +212,7 @@ static void eevee_draw_background(void *vedata) if (((stl->effects->enabled_effects & EFFECT_TAA) != 0) && (stl->effects->taa_current_sample > 1) && !DRW_state_is_image_render() && !taa_use_reprojection) { - 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_view_set_active(stl->effects->taa_view); } /* when doing viewport rendering the overrides needs to be recalculated for @@ -243,7 +235,7 @@ static void eevee_draw_background(void *vedata) /* Refresh shadows */ DRW_stats_group_start("Shadows"); - EEVEE_draw_shadows(sldata, vedata); + EEVEE_draw_shadows(sldata, vedata, stl->effects->taa_view); DRW_stats_group_end(); /* Set ray type. */ @@ -310,7 +302,7 @@ static void eevee_draw_background(void *vedata) DRW_stats_group_end(); if ((stl->effects->taa_current_sample > 1)) { - DRW_viewport_matrix_override_unset_all(); + DRW_view_set_active(NULL); } } diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 859770329d6..56038892ca8 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -167,6 +167,9 @@ void EEVEE_lightprobes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) e_data.hammersley = create_hammersley_sample_texture(HAMMERSLEY_SIZE); } + memset(stl->g_data->cube_views, 0, sizeof(stl->g_data->cube_views)); + memset(stl->g_data->planar_views, 0, sizeof(stl->g_data->planar_views)); + /* Use fallback if we don't have gpu texture allocated an we cannot restore them. */ bool use_fallback_lightcache = (scene_eval->eevee.light_cache == NULL) || ((scene_eval->eevee.light_cache->grid_tx.tex == NULL) && @@ -487,6 +490,8 @@ void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata } if (probe->type == LIGHTPROBE_TYPE_PLANAR) { + /* TODO(fclem): Culling should be done after cache generation. + * This is needed for future draw cache persistence. */ if (!eevee_lightprobes_culling_test(ob)) { return; /* Culled */ } @@ -868,7 +873,7 @@ static void lightbake_render_scene_face(int face, EEVEE_BakeRenderData *user_dat struct GPUFrameBuffer **face_fb = user_data->face_fb; /* Be sure that cascaded shadow maps are updated. */ - EEVEE_draw_shadows(sldata, user_data->vedata); + EEVEE_draw_shadows(sldata, user_data->vedata, NULL /* TODO */); GPU_framebuffer_bind(face_fb[face]); GPU_framebuffer_clear_depth(face_fb[face], 1.0f); @@ -928,7 +933,7 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us DRW_stats_group_start("Planar Reflection"); /* Be sure that cascaded shadow maps are updated. */ - EEVEE_draw_shadows(sldata, vedata); + EEVEE_draw_shadows(sldata, vedata, NULL /* TODO */); /* Compute offset plane equation (fix missing texels near reflection plane). */ copy_v4_v4(sldata->clip_data.clip_planes[0], eplanar->plane_equation); diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 7106cf0249e..b4eda1b0f29 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -970,7 +970,7 @@ static void frustum_min_bounding_sphere(const float corners[8][3], static void eevee_shadow_cascade_setup(Object *ob, EEVEE_LightsInfo *linfo, EEVEE_LightEngineData *led, - DRWMatrixState *saved_mats, + DRWView *view, float view_near, float view_far, int sample_ofs) @@ -978,9 +978,10 @@ static void eevee_shadow_cascade_setup(Object *ob, Light *la = (Light *)ob->data; /* Camera Matrices */ - float(*persinv)[4] = saved_mats->mat[DRW_MAT_PERSINV]; - float(*vp_projmat)[4] = saved_mats->mat[DRW_MAT_WIN]; - bool is_persp = DRW_viewport_is_persp_get(); + float persinv[4][4], vp_projmat[4][4]; + DRW_view_persmat_get(view, persinv, true); + DRW_view_winmat_get(view, vp_projmat, false); + bool is_persp = DRW_view_is_persp_get(view); /* Lights Matrices */ int cascade_nbr = la->cascade_count; @@ -1286,19 +1287,52 @@ void EEVEE_lights_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } +static void eevee_ensure_cube_views(float near, float far, const float pos[3], DRWView *view[6]) +{ + float winmat[4][4], viewmat[4][4]; + perspective_m4(winmat, -near, near, -near, near, near, far); + + for (int i = 0; i < 6; i++) { + unit_m4(viewmat); + negate_v3_v3(viewmat[3], pos); + mul_m4_m4m4(viewmat, cubefacemat[i], viewmat); + + if (view[i] == NULL) { + view[i] = DRW_view_create(viewmat, winmat, NULL, NULL, NULL); + } + else { + DRW_view_update(view[i], viewmat, winmat, NULL, NULL); + } + } +} + +static void eevee_ensure_cascade_views(EEVEE_ShadowCascadeData *cascade_data, + int cascade_count, + DRWView *view[4]) +{ + for (int i = 0; i < cascade_count; i++) { + if (view[i] == NULL) { + view[i] = DRW_view_create(cascade_data->viewmat, cascade_data->projmat[i], NULL, NULL, NULL); + } + else { + DRW_view_update(view[i], cascade_data->viewmat, cascade_data->projmat[i], NULL, NULL); + } + } +} + /* this refresh lights shadow buffers */ -void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) +void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRWView *view) { EEVEE_PassList *psl = vedata->psl; EEVEE_StorageList *stl = vedata->stl; EEVEE_EffectsInfo *effects = stl->effects; + EEVEE_PrivateData *g_data = stl->g_data; EEVEE_LightsInfo *linfo = sldata->lights; const DRWContextState *draw_ctx = DRW_context_state_get(); const float light_threshold = draw_ctx->scene->eevee.light_threshold; Object *ob; int i; - DRWMatrixState saved_mats; int saved_ray_type = sldata->common_data.ray_type; /* TODO: make it optionnal if we don't draw shadows. */ @@ -1328,9 +1362,6 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) cascade_visible[i] = DRW_culling_plane_test(plane); } - /* We need to save the Matrices before overidding them */ - DRW_viewport_matrix_get_all(&saved_mats); - /* Cube Shadow Maps */ DRW_stats_group_start("Cube Shadow Maps"); /* Render each shadow to one layer of the array */ @@ -1342,11 +1373,6 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) continue; } - DRWMatrixState render_mats; - float(*winmat)[4] = render_mats.mat[DRW_MAT_WIN]; - float(*viewmat)[4] = render_mats.mat[DRW_MAT_VIEW]; - float(*persmat)[4] = render_mats.mat[DRW_MAT_PERS]; - EEVEE_ShadowRender *srd = &linfo->shadow_render_data; EEVEE_ShadowCubeData *evscd = &led->data.scd; EEVEE_ShadowCube *cube_data = linfo->shadow_cube_data + evscd->cube_id; @@ -1357,32 +1383,16 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) srd->exponent = la->bleedexp; copy_v3_v3(srd->position, cube_data->position); - perspective_m4(winmat, - -srd->clip_near, - srd->clip_near, - -srd->clip_near, - srd->clip_near, - srd->clip_near, - srd->clip_far); - DRW_uniformbuffer_update(sldata->shadow_render_ubo, srd); + eevee_ensure_cube_views(srd->clip_near, srd->clip_far, srd->position, g_data->cube_views); + /* Render shadow cube */ /* Render 6 faces separately: seems to be faster for the general case. * The only time it's more beneficial is when the CPU culling overhead * outweigh the instancing overhead. which is rarely the case. */ for (int j = 0; j < 6; j++) { - /* TODO optimize */ - float tmp[4][4]; - unit_m4(tmp); - negate_v3_v3(tmp[3], srd->position); - mul_m4_m4m4(viewmat, cubefacemat[j], tmp); - mul_m4_m4m4(persmat, winmat, viewmat); - invert_m4_m4(render_mats.mat[DRW_MAT_WININV], winmat); - invert_m4_m4(render_mats.mat[DRW_MAT_VIEWINV], viewmat); - invert_m4_m4(render_mats.mat[DRW_MAT_PERSINV], persmat); - - DRW_viewport_matrix_override_set_all(&render_mats); + DRW_view_set_active(g_data->cube_views[j]); GPU_framebuffer_texture_cubeface_attach( sldata->shadow_cube_target_fb, sldata->shadow_cube_target, 0, j, 0); @@ -1448,9 +1458,8 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) linfo->update_flag &= ~LIGHT_UPDATE_SHADOW_CUBE; DRW_stats_group_end(); - DRW_viewport_matrix_override_set_all(&saved_mats); - float near = DRW_viewport_near_distance_get(); - float far = DRW_viewport_far_distance_get(); + float near = DRW_view_near_distance_get(view); + float far = DRW_view_far_distance_get(view); /* Cascaded Shadow Maps */ DRW_stats_group_start("Cascaded Shadow Maps"); @@ -1465,34 +1474,24 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) EEVEE_ShadowCascadeData *evscd = &led->data.scad; EEVEE_ShadowRender *srd = &linfo->shadow_render_data; - DRWMatrixState render_mats; - float(*winmat)[4] = render_mats.mat[DRW_MAT_WIN]; - float(*viewmat)[4] = render_mats.mat[DRW_MAT_VIEW]; - float(*persmat)[4] = render_mats.mat[DRW_MAT_PERS]; - - eevee_shadow_cascade_setup( - ob, linfo, led, &saved_mats, near, far, effects->taa_current_sample - 1); - srd->clip_near = la->clipsta; srd->clip_far = la->clipend; srd->stored_texel_size = 1.0 / (float)linfo->shadow_cascade_size; DRW_uniformbuffer_update(sldata->shadow_render_ubo, &linfo->shadow_render_data); - copy_m4_m4(viewmat, evscd->viewmat); - invert_m4_m4(render_mats.mat[DRW_MAT_VIEWINV], viewmat); + eevee_shadow_cascade_setup(ob, linfo, led, view, near, far, effects->taa_current_sample - 1); + + /* Meh, Reusing the cube views. */ + BLI_assert(MAX_CASCADE_NUM <= 6); + eevee_ensure_cascade_views(evscd, la->cascade_count, g_data->cube_views); /* Render shadow cascades */ /* Render cascade separately: seems to be faster for the general case. * The only time it's more beneficial is when the CPU culling overhead * outweigh the instancing overhead. which is rarely the case. */ for (int j = 0; j < la->cascade_count; j++) { - copy_m4_m4(winmat, evscd->projmat[j]); - copy_m4_m4(persmat, evscd->viewprojmat[j]); - invert_m4_m4(render_mats.mat[DRW_MAT_WININV], winmat); - invert_m4_m4(render_mats.mat[DRW_MAT_PERSINV], persmat); - - DRW_viewport_matrix_override_set_all(&render_mats); + DRW_view_set_active(g_data->cube_views[j]); GPU_framebuffer_texture_layer_attach( sldata->shadow_cascade_target_fb, sldata->shadow_cascade_target, 0, j, 0); @@ -1554,7 +1553,7 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_stats_group_end(); - DRW_viewport_matrix_override_set_all(&saved_mats); + DRW_view_set_active(view); DRW_uniformbuffer_update(sldata->light_ubo, &linfo->light_data); DRW_uniformbuffer_update(sldata->shadow_ubo, &linfo->shadow_data); /* Update all data at once */ diff --git a/source/blender/draw/engines/eevee/eevee_lookdev.c b/source/blender/draw/engines/eevee/eevee_lookdev.c index 277caf85a44..a998bd3a71b 100644 --- a/source/blender/draw/engines/eevee/eevee_lookdev.c +++ b/source/blender/draw/engines/eevee/eevee_lookdev.c @@ -223,22 +223,28 @@ void EEVEE_lookdev_draw(EEVEE_Data *vedata) DRW_uniformbuffer_update(sldata->common_ubo, common); /* override matrices */ - DRWMatrixState matstate; - unit_m4(matstate.winmat); + float winmat[4][4], viewmat[4][4]; + unit_m4(winmat); /* Look through the negative Z. */ - negate_v3(matstate.winmat[2]); + negate_v3(winmat[2]); - eevee_lookdev_apply_taa(effects, effects->sphere_size, matstate.winmat); + eevee_lookdev_apply_taa(effects, effects->sphere_size, winmat); /* "Remove" view matrix location. Leaving only rotation. */ - DRW_viewport_matrix_get(matstate.viewmat, DRW_MAT_VIEW); - zero_v3(matstate.viewmat[3]); - mul_m4_m4m4(matstate.persmat, matstate.winmat, matstate.viewmat); - invert_m4_m4(matstate.wininv, matstate.winmat); - invert_m4_m4(matstate.viewinv, matstate.viewmat); - invert_m4_m4(matstate.persinv, matstate.persmat); + DRW_view_viewmat_get(NULL, viewmat, false); + zero_v3(viewmat[3]); - DRW_viewport_matrix_override_set_all(&matstate); + if (effects->lookdev_view) { + /* When rendering just update the view. This avoids recomputing the culling. */ + DRW_view_update_sub(effects->lookdev_view, viewmat, winmat); + } + else { + /* Using default view bypasses the culling. */ + const DRWView *default_view = DRW_view_default_get(); + effects->lookdev_view = DRW_view_create_sub(default_view, viewmat, winmat); + } + + DRW_view_set_active(effects->lookdev_view); /* Find the right framebuffers to render to. */ GPUFrameBuffer *fb = (effects->target_buffer == fbl->effect_color_fb) ? fbl->main_fb : @@ -272,6 +278,6 @@ void EEVEE_lookdev_draw(EEVEE_Data *vedata) DRW_stats_group_end(); - DRW_viewport_matrix_override_unset_all(); + DRW_view_set_active(NULL); } } diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 6e0bd7f31d3..45b007782ba 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -642,8 +642,8 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata, { /* Update view_vecs */ float invproj[4][4], winmat[4][4]; - DRW_viewport_matrix_get(winmat, DRW_MAT_WIN); - DRW_viewport_matrix_get(invproj, DRW_MAT_WININV); + DRW_view_winmat_get(NULL, winmat, false); + DRW_view_winmat_get(NULL, invproj, true); EEVEE_update_viewvecs(invproj, winmat, sldata->common_data.view_vecs); } diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c index ad4f72d78dc..abd5bb82815 100644 --- a/source/blender/draw/engines/eevee/eevee_motion_blur.c +++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c @@ -127,7 +127,7 @@ int EEVEE_motion_blur_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *veda /* Viewport Matrix */ /* Note: This does not have TAA jitter applied. */ - DRW_viewport_matrix_get(persmat, DRW_MAT_PERS); + DRW_view_persmat_get(NULL, persmat, false); bool view_is_valid = (stl->g_data->view_updated == false); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index e2130615b1d..c64f489ae60 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -571,10 +571,7 @@ typedef struct EEVEE_EffectsInfo { float taa_alpha; bool prev_drw_support; float prev_drw_persmat[4][4]; - float overide_persmat[4][4]; - float overide_persinv[4][4]; - float overide_winmat[4][4]; - float overide_wininv[4][4]; + struct DRWView *taa_view; /* Ambient Occlusion */ int ao_depth_layer; struct GPUTexture *ao_src_depth; /* pointer copy */ @@ -604,11 +601,13 @@ typedef struct EEVEE_EffectsInfo { /* Alpha Checker */ float color_checker_dark[4]; float color_checker_light[4]; + struct DRWView *checker_view; /* Other */ float prev_persmat[4][4]; /* Lookdev */ int sphere_size; int anchor[2]; + struct DRWView *lookdev_view; /* Bloom */ int bloom_iteration_len; float source_texel_size[2]; @@ -754,7 +753,7 @@ typedef struct EEVEE_ShadowCubeData { typedef struct EEVEE_ShadowCascadeData { short light_id, shadow_id, cascade_id, layer_id; /* World->Light->NDC : used for rendering the shadow map. */ - float viewprojmat[MAX_CASCADE_NUM][4][4]; + float viewprojmat[MAX_CASCADE_NUM][4][4]; /* Could be removed. */ float projmat[MAX_CASCADE_NUM][4][4]; float viewmat[4][4], viewinv[4][4]; float radius[MAX_CASCADE_NUM]; @@ -829,9 +828,6 @@ typedef struct EEVEE_PrivateData { bool valid_double_buffer; bool valid_taa_history; /* Render Matrices */ - float persmat[4][4], persinv[4][4]; - float viewmat[4][4], viewinv[4][4]; - float winmat[4][4], wininv[4][4]; float studiolight_matrix[3][3]; float overscan, overscan_pixels; float size_orig[2]; @@ -849,6 +845,9 @@ typedef struct EEVEE_PrivateData { float studiolight_glossy_clamp; float studiolight_filter_quality; + /** For rendering probes and shadows. */ + struct DRWView *cube_views[6]; + struct DRWView *planar_views[MAX_PLANAR]; } EEVEE_PrivateData; /* Transient data */ /* eevee_data.c */ @@ -919,7 +918,7 @@ void EEVEE_lights_cache_shcaster_material_add(EEVEE_ViewLayerData *sldata, void EEVEE_lights_cache_shcaster_object_add(EEVEE_ViewLayerData *sldata, struct Object *ob); void EEVEE_lights_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_lights_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); -void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); +void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct DRWView *view); void EEVEE_lights_free(void); /* eevee_shaders.c */ @@ -1055,10 +1054,7 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata void EEVEE_temporal_sampling_offset_calc(const double ht_point[2], const float filter_size, float r_offset[2]); -void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, - float viewmat[4][4], - float persmat[4][4], - const double ht_point[2]); +void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const double ht_point[2]); void EEVEE_temporal_sampling_update_matrices(EEVEE_Data *vedata); void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata); diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 8e3857ae8a8..e083d16c8ac 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -105,25 +105,20 @@ void EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph * } /* Set the pers & view matrix. */ + float winmat[4][4], viewmat[4][4], viewinv[4][4]; /* 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); + RE_GetCameraWindow(engine->re, ob_camera_eval, frame, winmat); + RE_GetCameraWindowWithOverscan(engine->re, winmat, g_data->overscan); + RE_GetCameraModelMatrix(engine->re, ob_camera_eval, viewinv); - 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); + invert_m4_m4(viewmat, viewinv); - 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); + DRWView *view = DRW_view_create(viewmat, winmat, NULL, NULL, NULL); + DRW_view_default_set(view); + DRW_view_set_active(view); /* EEVEE_effects_init needs to go first for TAA */ EEVEE_effects_init(sldata, vedata, ob_camera_eval, false); @@ -304,6 +299,9 @@ static void eevee_render_result_normal(RenderLayer *rl, 1, rp->rect); + float viewinv[4][4]; + DRW_view_viewmat_get(NULL, viewinv, true); + /* 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) { @@ -322,7 +320,7 @@ static void eevee_render_result_normal(RenderLayer *rl, 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]); + mul_mat3_m4_v3(viewinv, &rp->rect[i]); } } } @@ -357,6 +355,9 @@ static void eevee_render_result_z(RenderLayer *rl, bool is_persp = DRW_viewport_is_persp_get(); + float viewmat[4][4]; + DRW_view_viewmat_get(NULL, viewmat, false); + /* 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) { @@ -365,7 +366,7 @@ static void eevee_render_result_z(RenderLayer *rl, 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]); + rp->rect[i] = viewmat[3][2] / (rp->rect[i] + viewmat[2][2]); } else { rp->rect[i] = -common_data->view_vecs[0][2] + @@ -533,24 +534,17 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl 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_temporal_sampling_matrices_calc(stl->effects, 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); + DRW_view_set_active(stl->effects->taa_view); /* Refresh Probes */ EEVEE_lightprobes_refresh(sldata, vedata); @@ -566,7 +560,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl /* Refresh Shadows */ EEVEE_lights_update(sldata, vedata); - EEVEE_draw_shadows(sldata, vedata); + EEVEE_draw_shadows(sldata, vedata, stl->effects->taa_view); /* Set ray type. */ sldata->common_data.ray_type = EEVEE_RAY_CAMERA; diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c index a488e16093a..099147a82dd 100644 --- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c +++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c @@ -139,25 +139,27 @@ void EEVEE_temporal_sampling_offset_calc(const double ht_point[2], r_offset[1] = eval_table(e_data.inverted_cdf, (float)(ht_point[1])) * filter_size; } -void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, - float viewmat[4][4], - float persmat[4][4], - const double ht_point[2]) +void EEVEE_temporal_sampling_matrices_calc(EEVEE_EffectsInfo *effects, const double ht_point[2]) { const float *viewport_size = DRW_viewport_size_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene = draw_ctx->scene; RenderData *rd = &scene->r; + float persmat[4][4], viewmat[4][4], winmat[4][4]; + DRW_view_persmat_get(NULL, persmat, false); + DRW_view_viewmat_get(NULL, viewmat, false); + DRW_view_winmat_get(NULL, winmat, false); + float ofs[2]; EEVEE_temporal_sampling_offset_calc(ht_point, rd->gauss, ofs); - window_translate_m4( - effects->overide_winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + + BLI_assert(effects->taa_view != NULL); - mul_m4_m4m4(effects->overide_persmat, effects->overide_winmat, viewmat); - invert_m4_m4(effects->overide_persinv, effects->overide_persmat); - invert_m4_m4(effects->overide_wininv, effects->overide_winmat); + /* When rendering just update the view. This avoids recomputing the culling. */ + DRW_view_update_sub(effects->taa_view, viewmat, winmat); } /* Update the matrices based on the current sample. @@ -167,23 +169,15 @@ void EEVEE_temporal_sampling_update_matrices(EEVEE_Data *vedata) EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; EEVEE_EffectsInfo *effects = stl->effects; - float persmat[4][4], viewmat[4][4]; double ht_point[2]; double ht_offset[2] = {0.0, 0.0}; uint ht_primes[2] = {2, 3}; - DRW_viewport_matrix_get(persmat, DRW_MAT_PERS); - DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW); - DRW_viewport_matrix_get(effects->overide_winmat, DRW_MAT_WIN); - BLI_halton_2d(ht_primes, ht_offset, effects->taa_current_sample - 1, ht_point); - EEVEE_temporal_sampling_matrices_calc(effects, viewmat, persmat, ht_point); + EEVEE_temporal_sampling_matrices_calc(effects, ht_point); - DRW_viewport_matrix_override_set(effects->overide_persmat, DRW_MAT_PERS); - DRW_viewport_matrix_override_set(effects->overide_persinv, DRW_MAT_PERSINV); - DRW_viewport_matrix_override_set(effects->overide_winmat, DRW_MAT_WIN); - DRW_viewport_matrix_override_set(effects->overide_wininv, DRW_MAT_WININV); + DRW_view_set_active(effects->taa_view); } void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata) @@ -195,8 +189,6 @@ void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata) int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) { EEVEE_StorageList *stl = vedata->stl; - // EEVEE_FramebufferList *fbl = vedata->fbl; - // EEVEE_TextureList *txl = vedata->txl; EEVEE_EffectsInfo *effects = stl->effects; int repro_flag = 0; @@ -204,17 +196,26 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data eevee_create_cdf_table_temporal_sampling(); } - /* Reset for each "redraw". When rendering using ogl render, + /** + * Reset for each "redraw". When rendering using ogl render, * we accumulate the redraw inside the drawing loop in eevee_draw_background(). - * But we do NOT accumulate between "redraw" (as in full draw manager drawloop) - * because the opengl render already does that. */ + **/ effects->taa_render_sample = 1; + effects->taa_view = NULL; + + /* Create a sub view to disable clipping planes (if any). */ + const DRWView *default_view = DRW_view_default_get(); + float viewmat[4][4], winmat[4][4]; + DRW_view_viewmat_get(default_view, viewmat, false); + DRW_view_winmat_get(default_view, winmat, false); + effects->taa_view = DRW_view_create_sub(default_view, viewmat, winmat); + DRW_view_clip_planes_set(effects->taa_view, NULL, 0); const DRWContextState *draw_ctx = DRW_context_state_get(); const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); if ((scene_eval->eevee.taa_samples != 1) || DRW_state_is_image_render()) { - float persmat[4][4], viewmat[4][4]; + float persmat[4][4]; if (!DRW_state_is_image_render() && (scene_eval->eevee.flag & SCE_EEVEE_TAA_REPROJECTION)) { repro_flag = EFFECT_TAA_REPROJECT | EFFECT_VELOCITY_BUFFER | EFFECT_DEPTH_DOUBLE_BUFFER | @@ -236,8 +237,7 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data effects->taa_total_sample = scene_eval->eevee.taa_samples; MAX2(effects->taa_total_sample, 0); - DRW_viewport_matrix_get(persmat, DRW_MAT_PERS); - DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW); + DRW_view_persmat_get(NULL, persmat, false); view_is_valid = view_is_valid && compare_m4m4(persmat, effects->prev_drw_persmat, FLT_MIN); copy_m4_m4(effects->prev_drw_persmat, persmat); diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 9a59b95b2e8..e4d95ee9efb 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -242,8 +242,8 @@ void EEVEE_volumes_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) /* Update view_vecs */ float invproj[4][4], winmat[4][4]; - DRW_viewport_matrix_get(winmat, DRW_MAT_WIN); - DRW_viewport_matrix_get(invproj, DRW_MAT_WININV); + DRW_view_winmat_get(NULL, winmat, false); + DRW_view_winmat_get(NULL, invproj, true); EEVEE_update_viewvecs(invproj, winmat, sldata->common_data.view_vecs); if (DRW_viewport_is_persp_get()) { |