[Bf-blender-cvs] [91dfe40ef07] tmp-workbench-rewrite: Workbench: Refactor: Add Dof Support

Clément Foucault noreply at git.blender.org
Tue Mar 3 17:36:16 CET 2020


Commit: 91dfe40ef07a174d73cf06b497f1e35b9772bcf0
Author: Clément Foucault
Date:   Tue Mar 3 14:49:56 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB91dfe40ef07a174d73cf06b497f1e35b9772bcf0

Workbench: Refactor: Add Dof Support

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

M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_effect_cavity.c
M	source/blender/draw/engines/workbench/workbench_effect_dof.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c

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

diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 65918fe8d71..af65acddb53 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -56,6 +56,7 @@ static void workbench_view_layer_data_free(void *storage)
 {
   WORKBENCH_ViewLayerData *vldata = (WORKBENCH_ViewLayerData *)storage;
 
+  DRW_UBO_FREE_SAFE(vldata->dof_sample_ubo);
   DRW_UBO_FREE_SAFE(vldata->world_ubo);
   DRW_UBO_FREE_SAFE(vldata->cavity_sample_ubo);
   DRW_TEXTURE_FREE_SAFE(vldata->cavity_jitter_tx);
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 886fc836ce8..a0e03fd12cb 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -358,17 +358,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
   WORKBENCH_PassList *psl = vedata->psl;
   DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
   const DRWContextState *draw_ctx = DRW_context_state_get();
-  RegionView3D *rv3d = draw_ctx->rv3d;
-  View3D *v3d = draw_ctx->v3d;
   Scene *scene = draw_ctx->scene;
-  Object *camera;
-
-  if (v3d && rv3d) {
-    camera = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL;
-  }
-  else {
-    camera = scene->camera;
-  }
 
   if (!stl->g_data) {
     /* Alloc transient pointers */
@@ -456,7 +446,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 
   wpd->shading.xray_alpha = 1.0f;
 
-  workbench_dof_engine_init(vedata, camera);
+  workbench_dof_engine_init(vedata);
 
   if (OIT_ENABLED(wpd)) {
     if (e_data.oit_resolve_sh == NULL) {
@@ -591,7 +581,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
   }
 
   {
-    workbench_dof_create_pass(vedata, &e_data.composite_buffer_tx, e_data.jitter_tx);
+    workbench_dof_cache_init(vedata);
   }
 
   if (CAVITY_ENABLED(wpd)) {
@@ -653,7 +643,6 @@ void workbench_deferred_engine_free(void)
   workbench_volume_engine_free();
   workbench_fxaa_engine_free();
   workbench_taa_engine_free();
-  workbench_dof_engine_free();
 }
 
 static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingGroup *grp)
diff --git a/source/blender/draw/engines/workbench/workbench_effect_cavity.c b/source/blender/draw/engines/workbench/workbench_effect_cavity.c
index 1b60e1e064b..60463aba07d 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_cavity.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_cavity.c
@@ -78,7 +78,7 @@ static struct GPUTexture *create_jitter_texture(int num_samples)
   return DRW_texture_create_2d(64, 64, GPU_RGBA16F, DRW_TEX_WRAP, &jitter[0][0]);
 }
 
-static void workbench_cavity_samples_ubo_ensure(WORKBENCH_PrivateData *wpd)
+void workbench_cavity_samples_ubo_ensure(WORKBENCH_PrivateData *wpd)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
   Scene *scene = draw_ctx->scene;
diff --git a/source/blender/draw/engines/workbench/workbench_effect_dof.c b/source/blender/draw/engines/workbench/workbench_effect_dof.c
index 219cf3ba625..cff6671c384 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_dof.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_dof.c
@@ -27,24 +27,6 @@
 
 #include "DNA_camera_types.h"
 
-/* *********** STATIC *********** */
-static struct {
-  struct GPUShader *effect_dof_prepare_sh;
-  struct GPUShader *effect_dof_downsample_sh;
-  struct GPUShader *effect_dof_flatten_v_sh;
-  struct GPUShader *effect_dof_flatten_h_sh;
-  struct GPUShader *effect_dof_dilate_v_sh;
-  struct GPUShader *effect_dof_dilate_h_sh;
-  struct GPUShader *effect_dof_blur1_sh;
-  struct GPUShader *effect_dof_blur2_sh;
-  struct GPUShader *effect_dof_resolve_sh;
-} e_data = {NULL};
-
-/* Shaders */
-extern char datatoc_workbench_effect_dof_frag_glsl[];
-
-/* *********** Functions *********** */
-
 /**
  * Transform [-1..1] square to unit circle.
  */
@@ -129,52 +111,40 @@ static void workbench_dof_setup_samples(struct GPUUniformBuffer **ubo,
   DRW_uniformbuffer_update(*ubo, *data);
 }
 
-void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera)
+void workbench_dof_engine_init(WORKBENCH_Data *vedata)
 {
   WORKBENCH_TextureList *txl = vedata->txl;
   WORKBENCH_StorageList *stl = vedata->stl;
-  WORKBENCH_PrivateData *wpd = stl->g_data;
+  WORKBENCH_PrivateData *wpd = stl->wpd;
   WORKBENCH_FramebufferList *fbl = vedata->fbl;
 
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  RegionView3D *rv3d = draw_ctx->rv3d;
+  View3D *v3d = draw_ctx->v3d;
+  Scene *scene = draw_ctx->scene;
+  Object *camera;
+
+  if (v3d && rv3d) {
+    camera = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL;
+  }
+  else {
+    camera = scene->camera;
+  }
+
   Camera *cam = camera != NULL ? camera->data : NULL;
   if ((wpd->shading.flag & V3D_SHADING_DEPTH_OF_FIELD) == 0 || (cam == NULL) ||
       ((cam->dof.flag & CAM_DOF_ENABLED) == 0)) {
     wpd->dof_enabled = false;
-    return;
-  }
-
-  if (e_data.effect_dof_prepare_sh == NULL) {
-    e_data.effect_dof_prepare_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define PREPARE\n");
 
-    e_data.effect_dof_downsample_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define DOWNSAMPLE\n");
-
-    e_data.effect_dof_flatten_v_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define FLATTEN_VERTICAL\n");
-
-    e_data.effect_dof_flatten_h_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define FLATTEN_HORIZONTAL\n");
-
-    e_data.effect_dof_dilate_v_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define DILATE_VERTICAL\n");
-
-    e_data.effect_dof_dilate_h_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define DILATE_HORIZONTAL\n");
-
-    e_data.effect_dof_blur1_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define BLUR1\n");
-
-    e_data.effect_dof_blur2_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define BLUR2\n");
-
-    e_data.effect_dof_resolve_sh = DRW_shader_create_fullscreen(
-        datatoc_workbench_effect_dof_frag_glsl, "#define RESOLVE\n");
+    /* Cleanup. */
+    DRW_TEXTURE_FREE_SAFE(txl->dof_source_tx);
+    DRW_TEXTURE_FREE_SAFE(txl->coc_halfres_tx);
+    return;
   }
 
   const float *full_size = DRW_viewport_size_get();
   int size[2] = {max_ii(1, (int)full_size[0] / 2), max_ii(1, (int)full_size[1] / 2)};
-#if 0
+#if 0 /* TODO(fclem) finish COC min_max optimisation */
   /* NOTE: We Ceil here in order to not miss any edge texel if using a NPO2 texture.  */
   int shrink_h_size[2] = {ceilf(size[0] / 8.0f), size[1]};
   int shrink_w_size[2] = {shrink_h_size[0], ceilf(size[1] / 8.0f)};
@@ -186,7 +156,7 @@ void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera)
       &txl->coc_halfres_tx, size[0], size[1], GPU_RG8, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
   wpd->dof_blur_tx = DRW_texture_pool_query_2d(
       size[0], size[1], GPU_RGBA16F, &draw_engine_workbench_solid);
-#if 0
+#if 0 /* TODO(fclem) finish COC min_max optimisation */
   wpd->coc_temp_tx = DRW_texture_pool_query_2d(
       shrink_h_size[0], shrink_h_size[1], GPU_RG8, &draw_engine_workbench_solid);
   wpd->coc_tiles_tx[0] = DRW_texture_pool_query_2d(
@@ -201,7 +171,7 @@ void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera)
                                     GPU_ATTACHMENT_TEXTURE(txl->dof_source_tx),
                                     GPU_ATTACHMENT_TEXTURE(txl->coc_halfres_tx),
                                 });
-#if 0
+#if 0 /* TODO(fclem) finish COC min_max optimisation */
   GPU_framebuffer_ensure_config(&fbl->dof_coc_tile_h_fb,
                                 {
                                     GPU_ATTACHMENT_NONE,
@@ -230,11 +200,7 @@ void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera)
                                 });
 
   {
-    const DRWContextState *draw_ctx = DRW_context_state_get();
-    RegionView3D *rv3d = draw_ctx->rv3d;
-
     /* Parameters */
-    /* TODO UI Options */
     float fstop = cam->dof.aperture_fstop;
     float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
     float focus_dist = BKE_camera_object_dof_distance(camera);
@@ -262,128 +228,126 @@ void workbench_dof_engine_init(WORKBENCH_Data *vedata, Object *camera)
     float rotation = cam->dof.aperture_rotation;
     float ratio = 1.0f / cam->dof.aperture_ratio;
 
-    if (wpd->dof_ubo == NULL || blades != wpd->dof_blades || rotation != wpd->dof_rotation ||
-        ratio != wpd->dof_ratio) {
+    if (wpd->vldata->dof_sample_ubo == NULL || blades != wpd->dof_blades ||
+        rotation != wpd->dof_rotation || ratio != wpd->dof_ratio) {
       wpd->dof_blades = blades;
       wpd->dof_rotation = rotation;
       wpd->dof_ratio = ratio;
-      workbench_dof_setup_samples(&wpd->dof_ubo, &stl->dof_ubo_data, blades, rotation, ratio);
+      workbench_dof_setup_samples(
+          &wpd->vldata->dof_sample_ubo, &stl->dof_ubo_data, blades, rotation, ratio);
     }
   }
 
   wpd->dof_enabled = true;
 }
 
-void workbench_dof_create_pass(WORKBENCH_Data *vedata,
-                               GPUTexture **dof_input,
-                               GPUTexture *noise_tex)
+void workbench_dof_cache_init(WORKBENCH_Data *vedata)
 {
   WORKBENCH_PassList *psl = vedata->psl;
   WORKBENCH_TextureList *txl = vedata->txl;
   WORKBENCH_StorageList *stl = vedata->stl;
-  WORKBENCH_PrivateData *wpd = stl->g_data;
+  WORKBENCH_PrivateData *wpd = stl->wpd;
   struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
 
   if (!wpd->dof_enabled) {
     return;
   }
 
-  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+  GPUShader *prepare_sh, *downsample_sh, *blur1_sh, *blur2_sh, *resolve_sh;
+  workbench_shader_depth_of_field_get(
+      &prepare_sh, &downsample_sh, &blur1_sh, &blur2_sh, &resolve_sh);
 
-  psl->dof_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list