[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