[Bf-blender-cvs] [13573fd22c9] tmp-workbench-rewrite2: Border Clipping (wip)

Miguel Pozo noreply at git.blender.org
Thu Nov 3 20:02:27 CET 2022


Commit: 13573fd22c926d0e227d802c0829fdb9a6e28ac5
Author: Miguel Pozo
Date:   Thu Nov 3 13:46:59 2022 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB13573fd22c926d0e227d802c0829fdb9a6e28ac5

Border Clipping (wip)

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

M	source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M	source/blender/draw/engines/workbench/workbench_private.hh
M	source/blender/draw/engines/workbench/workbench_shader_cache.cc

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

diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 51a403403ae..e71b7273337 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -22,7 +22,10 @@ void MeshPass::init_pass(SceneResources &resources, DRWState state)
   bind_ubo(WB_WORLD_SLOT, resources.world_buf);
 }
 
-void MeshPass::init_subpasses(ePipelineType pipeline, eLightingType shading, ShaderCache &shaders)
+void MeshPass::init_subpasses(ePipelineType pipeline,
+                              eLightingType lighting,
+                              bool clip,
+                              ShaderCache &shaders)
 {
   texture_subpass_map_.clear();
 
@@ -31,7 +34,7 @@ void MeshPass::init_subpasses(ePipelineType pipeline, eLightingType shading, Sha
       eGeometryType geom_type = static_cast<eGeometryType>(geom);
       eShaderType shader_type = static_cast<eShaderType>(shader);
       std::string name = std::string(get_name(geom_type)) + std::string(get_name(shader_type));
-      GPUShader *sh = shaders.prepass_shader_get(pipeline, geom_type, shader_type, shading);
+      GPUShader *sh = shaders.prepass_shader_get(pipeline, geom_type, shader_type, lighting, clip);
       PassMain::Sub *pass = &sub(name.c_str());
       pass->shader_set(sh);
       passes_[geom][shader] = pass;
@@ -91,17 +94,19 @@ void OpaquePass::sync(const SceneState &scene_state, SceneResources &resources)
   DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
                    scene_state.cull_state | scene_state.clip_state;
 
+  bool clip = scene_state.clip_state & DRW_STATE_CLIP_PLANES;
+
   DRWState in_front_state = state | DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS;
   gbuffer_in_front_ps_.init_pass(resources, in_front_state);
   gbuffer_in_front_ps_.state_stencil(0xFF, 0xFF, 0x00);
   gbuffer_in_front_ps_.init_subpasses(
-      ePipelineType::OPAQUE, scene_state.lighting_type, resources.shader_cache);
+      ePipelineType::OPAQUE, scene_state.lighting_type, clip, resources.shader_cache);
 
   state |= DRW_STATE_STENCIL_NEQUAL;
   gbuffer_ps_.init_pass(resources, state);
   gbuffer_ps_.state_stencil(0x00, 0xFF, 0xFF);
   gbuffer_ps_.init_subpasses(
-      ePipelineType::OPAQUE, scene_state.lighting_type, resources.shader_cache);
+      ePipelineType::OPAQUE, scene_state.lighting_type, clip, resources.shader_cache);
 
   deferred_ps_.init();
   deferred_ps_.shader_set(resources.shader_cache.resolve_shader_get(ePipelineType::OPAQUE,
@@ -172,16 +177,18 @@ void TransparentPass::sync(const SceneState &scene_state, SceneResources &resour
   DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_OIT |
                    scene_state.cull_state | scene_state.clip_state;
 
+  bool clip = scene_state.clip_state & DRW_STATE_CLIP_PLANES;
+
   accumulation_ps_.init_pass(resources, state | DRW_STATE_STENCIL_NEQUAL);
   accumulation_ps_.state_stencil(0x00, 0xFF, 0xFF);
   accumulation_ps_.clear_color(float4(0.0f, 0.0f, 0.0f, 1.0f));
   accumulation_ps_.init_subpasses(
-      ePipelineType::TRANSPARENT, scene_state.lighting_type, resources.shader_cache);
+      ePipelineType::TRANSPARENT, scene_state.lighting_type, clip, resources.shader_cache);
 
   accumulation_in_front_ps_.init_pass(resources, state);
   accumulation_in_front_ps_.clear_color(float4(0.0f, 0.0f, 0.0f, 1.0f));
   accumulation_in_front_ps_.init_subpasses(
-      ePipelineType::TRANSPARENT, scene_state.lighting_type, resources.shader_cache);
+      ePipelineType::TRANSPARENT, scene_state.lighting_type, clip, resources.shader_cache);
 
   if (resolve_sh_ == nullptr) {
     resolve_sh_ = GPU_shader_create_from_info_name("workbench_transparent_resolve");
@@ -240,10 +247,13 @@ void TransparentDepthPass::sync(const SceneState &scene_state, SceneResources &r
   DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
                    scene_state.cull_state | scene_state.clip_state;
 
+  bool clip = scene_state.clip_state & DRW_STATE_CLIP_PLANES;
+
   DRWState in_front_state = state | DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS;
   in_front_ps_.init_pass(resources, in_front_state);
   in_front_ps_.state_stencil(0xFF, 0xFF, 0x00);
-  in_front_ps_.init_subpasses(ePipelineType::OPAQUE, eLightingType::FLAT, resources.shader_cache);
+  in_front_ps_.init_subpasses(
+      ePipelineType::OPAQUE, eLightingType::FLAT, clip, resources.shader_cache);
 
   if (merge_sh_ == nullptr) {
     merge_sh_ = GPU_shader_create_from_info_name("workbench_next_merge_depth");
@@ -259,7 +269,8 @@ void TransparentDepthPass::sync(const SceneState &scene_state, SceneResources &r
   state |= DRW_STATE_STENCIL_NEQUAL;
   main_ps_.init_pass(resources, state);
   main_ps_.state_stencil(0x00, 0xFF, 0xFF);
-  main_ps_.init_subpasses(ePipelineType::OPAQUE, eLightingType::FLAT, resources.shader_cache);
+  main_ps_.init_subpasses(
+      ePipelineType::OPAQUE, eLightingType::FLAT, clip, resources.shader_cache);
 }
 
 void TransparentDepthPass::draw(Manager &manager,
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index bc5c731a7c4..9d350fda4c7 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -16,7 +16,7 @@ class ShaderCache {
  private:
   /* TODO(fclem): We might want to change to a Map since most shader will never be compiled. */
   GPUShader *prepass_shader_cache_[pipeline_type_len][geometry_type_len][shader_type_len]
-                                  [lighting_type_len] = {{{{nullptr}}}};
+                                  [lighting_type_len][2] = {{{{{nullptr}}}}};
   GPUShader *resolve_shader_cache_[pipeline_type_len][lighting_type_len][2][2] = {{{{nullptr}}}};
 
  public:
@@ -25,7 +25,8 @@ class ShaderCache {
   GPUShader *prepass_shader_get(ePipelineType pipeline_type,
                                 eGeometryType geometry_type,
                                 eShaderType shader_type,
-                                eLightingType lighting_type);
+                                eLightingType lighting_type,
+                                bool clip);
 
   GPUShader *resolve_shader_get(ePipelineType pipeline_type,
                                 eLightingType lighting_type,
@@ -165,7 +166,10 @@ class MeshPass : public PassMain {
   bool is_empty() const;
 
   void init_pass(SceneResources &resources, DRWState state);
-  void init_subpasses(ePipelineType pipeline, eLightingType shading, ShaderCache &shaders);
+  void init_subpasses(ePipelineType pipeline,
+                      eLightingType lighting,
+                      bool clip,
+                      ShaderCache &shaders);
 
   PassMain::Sub &sub_pass_get(
       ObjectRef &ref,
diff --git a/source/blender/draw/engines/workbench/workbench_shader_cache.cc b/source/blender/draw/engines/workbench/workbench_shader_cache.cc
index de4ab28f4ed..6720fc1702b 100644
--- a/source/blender/draw/engines/workbench/workbench_shader_cache.cc
+++ b/source/blender/draw/engines/workbench/workbench_shader_cache.cc
@@ -10,7 +10,9 @@ ShaderCache::~ShaderCache()
     for (auto j : IndexRange(shader_type_len)) {
       for (auto k : IndexRange(geometry_type_len)) {
         for (auto l : IndexRange(pipeline_type_len)) {
-          DRW_SHADER_FREE_SAFE(prepass_shader_cache_[i][j][k][l]);
+          for (auto m : IndexRange(2)) {
+            DRW_SHADER_FREE_SAFE(prepass_shader_cache_[i][j][k][l][m]);
+          }
         }
       }
     }
@@ -29,10 +31,12 @@ ShaderCache::~ShaderCache()
 GPUShader *ShaderCache::prepass_shader_get(ePipelineType pipeline_type,
                                            eGeometryType geometry_type,
                                            eShaderType shader_type,
-                                           eLightingType lighting_type)
+                                           eLightingType lighting_type,
+                                           bool clip)
 {
   GPUShader *&shader_ptr = prepass_shader_cache_[static_cast<int>(pipeline_type)][static_cast<int>(
-      geometry_type)][static_cast<int>(shader_type)][static_cast<int>(lighting_type)];
+      geometry_type)][static_cast<int>(shader_type)][static_cast<int>(lighting_type)]
+                                                [clip ? 1 : 0];
 
   if (shader_ptr != nullptr) {
     return shader_ptr;
@@ -79,8 +83,7 @@ GPUShader *ShaderCache::prepass_shader_get(ePipelineType pipeline_type,
       info_name += "texture";
       break;
   }
-  /* TODO Clipping */
-  info_name += "_no_clip";
+  info_name += clip ? "_clip" : "_no_clip";
   shader_ptr = GPU_shader_create_from_info_name(info_name.c_str());
   return shader_ptr;
 }



More information about the Bf-blender-cvs mailing list