[Bf-blender-cvs] [925b5823ccb] master: Eevee: Use DRW_view_* API instead of DRW_viewport_matrix_*

Clément Foucault noreply at git.blender.org
Wed May 22 13:30:36 CEST 2019


Commit: 925b5823ccbc4fb3f7f90b29950e3d7bb0d5c90e
Author: Clément Foucault
Date:   Tue May 21 12:34:48 2019 +0200
Branches: master
https://developer.blender.org/rB925b5823ccbc4fb3f7f90b29950e3d7bb0d5c90e

Eevee: Use DRW_view_* API instead of DRW_viewport_matrix_*

===================================================================

M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_lookdev.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_motion_blur.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee/eevee_temporal_sampling.c
M	source/blender/draw/engines/eevee/eevee_volumes.c

===================================================================

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

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list