Commit: bdfd9a11e8c55b0dcbb93ca0ea5a7bb43ab0f449
Author: Clément Foucault
Date:   Sun Jan 21 19:12:59 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBbdfd9a11e8c55b0dcbb93ca0ea5a7bb43ab0f449

Clay: Performance: Disable AO codepath if not necessary.

This optimisation only works if no material in the scene require the AO pass.
For this either set the AO distance to 0 or both Cavity and Edges factors to 0.

This double the performance of scenes with very high triangle count.

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

M       source/blender/draw/engines/clay/clay_engine.c
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/engines/clay/clay_engine.c 
b/source/blender/draw/engines/clay/clay_engine.c
index fcd9353bf1f..a9a919f7ac2 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -183,6 +183,7 @@ typedef struct CLAY_PrivateData {
        DRWShadingGroup *depth_shgrp_cull;
        DRWShadingGroup *depth_shgrp_cull_select;
        DRWShadingGroup *depth_shgrp_cull_active;
+       bool enable_ao;
 } CLAY_PrivateData; /* Transient data */
 
 /* Functions */
@@ -607,7 +608,7 @@ static int hair_mat_in_ubo(CLAY_Storage *storage, const 
CLAY_HAIR_UBO_Material *
        return id;
 }
 
-static void ubo_mat_from_object(Object *ob,  CLAY_UBO_Material *r_ubo)
+static void ubo_mat_from_object(Object *ob, CLAY_UBO_Material *r_ubo, bool 
*r_needs_ao)
 {
        IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, 
COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY);
 
@@ -622,6 +623,12 @@ static void ubo_mat_from_object(Object *ob,  
CLAY_UBO_Material *r_ubo)
        float ssao_attenuation = 
BKE_collection_engine_property_value_get_float(props, "ssao_attenuation");
        int matcap_icon = BKE_collection_engine_property_value_get_int(props, 
"matcap_icon");
 
+       if (((ssao_factor_cavity > 0.0) || (ssao_factor_edge > 0.0)) &&
+           (ssao_distance > 0.0))
+       {
+               *r_needs_ao = true;
+       }
+
        memset(r_ubo, 0x0, sizeof(*r_ubo));
 
        r_ubo->matcap_rot[0] = cosf(matcap_rot * 3.14159f * 2.0f);
@@ -667,7 +674,7 @@ static DRWShadingGroup *CLAY_object_shgrp_get(
        DRWShadingGroup **shgrps = use_flat ? stl->storage->shgrps_flat : 
stl->storage->shgrps;
        CLAY_UBO_Material mat_ubo_test;
 
-       ubo_mat_from_object(ob, &mat_ubo_test);
+       ubo_mat_from_object(ob, &mat_ubo_test, &stl->g_data->enable_ao);
 
        int id = mat_in_ubo(stl->storage, &mat_ubo_test);
 
@@ -712,6 +719,9 @@ static void clay_cache_init(void *vedata)
                stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
        }
 
+       /* Disable AO unless a material needs it. */
+       stl->g_data->enable_ao = false;
+
        /* Depth Pass */
        {
                psl->depth_pass = DRW_pass_create("Depth Pass", 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
@@ -851,18 +861,25 @@ static void clay_cache_finish(void *vedata)
 
 static void clay_draw_scene(void *vedata)
 {
-
+       CLAY_StorageList *stl = ((CLAY_Data *)vedata)->stl;
        CLAY_PassList *psl = ((CLAY_Data *)vedata)->psl;
        CLAY_FramebufferList *fbl = ((CLAY_Data *)vedata)->fbl;
        DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
        /* Pass 1 : Depth pre-pass */
-       DRW_draw_pass(psl->depth_pass);
-       DRW_draw_pass(psl->depth_pass_cull);
+       if (stl->g_data->enable_ao) {
+               DRW_draw_pass(psl->depth_pass);
+               DRW_draw_pass(psl->depth_pass_cull);
+       }
+       else {
+               DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH 
| DRW_STATE_DEPTH_LESS;
+               DRW_pass_state_set(psl->clay_pass, state);
+               DRW_pass_state_set(psl->clay_pass_flat, state);
+       }
 
        /* Pass 2 : Duplicate depth */
        /* Unless we go for deferred shading we need this to avoid manual depth 
test and artifacts */
-       if (DRW_state_is_fbo()) {
+       if (DRW_state_is_fbo() && stl->g_data->enable_ao) {
                /* attach temp textures */
                DRW_framebuffer_texture_attach(fbl->dupli_depth, 
e_data.depth_dup, 0, 0);
 
diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 8b95661681d..1f16f63ba14 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -358,6 +358,7 @@ void DRW_shgroup_uniform_mat4(DRWShadingGroup *shgroup, 
const char *name, const
 
 /* Passes */
 DRWPass *DRW_pass_create(const char *name, DRWState state);
+void DRW_pass_state_set(DRWPass *pass, DRWState state);
 void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, 
DRWShadingGroup *shgrp), void *userData);
 void DRW_pass_sort_shgroup_z(DRWPass *pass);
 
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 4ed9205bcae..f0b11fadfab 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1290,6 +1290,11 @@ DRWPass *DRW_pass_create(const char *name, DRWState 
state)
        return pass;
 }
 
+void DRW_pass_state_set(DRWPass *pass, DRWState state)
+{
+       pass->state = state;
+}
+
 void DRW_pass_free(DRWPass *pass)
 {
        for (DRWShadingGroup *shgroup = pass->shgroups; shgroup; shgroup = 
shgroup->next) {

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to