Commit: 5ccc02277d7cee7affa5d3b49a8b9e6e4368b201
Author: Clément Foucault
Date:   Thu Jun 22 02:41:17 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB5ccc02277d7cee7affa5d3b49a8b9e6e4368b201

Eevee: Improve material variation managment.

- Unify variations between default shaders and material shader.
- Only create default shader passes if needed.

Downside is that we have a big array of passes and shading grp in the vedata 
... And it will double in size each time a new variation flag is added.

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

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_materials.c
M       source/blender/draw/engines/eevee/eevee_private.h

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c 
b/source/blender/draw/engines/eevee/eevee_engine.c
index 8d3cf5ea077..62edfa642eb 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -157,9 +157,7 @@ static void EEVEE_draw_scene(void *vedata)
 
        /* Shading pass */
        DRW_draw_pass(psl->probe_display);
-       DRW_draw_pass(psl->default_pass);
-       DRW_draw_pass(psl->default_flat_pass);
-       DRW_draw_pass(psl->default_hair_pass);
+       EEVEE_draw_default_passes(psl);
        DRW_draw_pass(psl->material_pass);
 
        /* Post Process */
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c 
b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 15a4b86129d..0d6f589f8a5 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -922,8 +922,7 @@ static void render_scene_to_probe(
                DRW_draw_pass(psl->depth_pass_cull);
 
                /* Shading pass */
-               DRW_draw_pass(psl->default_pass);
-               DRW_draw_pass(psl->default_flat_pass);
+               EEVEE_draw_default_passes(psl);
                DRW_draw_pass(psl->material_pass);
 
                DRW_framebuffer_texture_detach(sldata->probe_rt);
@@ -985,8 +984,7 @@ static void render_scene_to_planar(
        DRW_draw_pass(psl->depth_pass_clip_cull);
 
        /* Shading pass */
-       DRW_draw_pass(psl->default_pass);
-       DRW_draw_pass(psl->default_flat_pass);
+       EEVEE_draw_default_passes(psl);
        DRW_draw_pass(psl->material_pass);
 
        DRW_state_invert_facing();
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c 
b/source/blender/draw/engines/eevee/eevee_materials.c
index 75eec99b1a1..09c30ff5a69 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -38,6 +38,14 @@
 #include "eevee_lut.h"
 #include "eevee_private.h"
 
+#if defined(IRRADIANCE_SH_L2)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_SH_L2\n"
+#elif defined(IRRADIANCE_CUBEMAP)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_CUBEMAP\n"
+#elif defined(IRRADIANCE_HL2)
+#define SHADER_IRRADIANCE "#define IRRADIANCE_HL2\n"
+#endif
+
 #define SHADER_DEFINES \
        "#define EEVEE_ENGINE\n" \
        "#define MAX_PROBE " STRINGIFY(MAX_PROBE) "\n" \
@@ -47,20 +55,8 @@
        "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \
        "#define MAX_SHADOW_MAP " STRINGIFY(MAX_SHADOW_MAP) "\n" \
        "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \
-       "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n"
-
-/* World shader variations */
-enum {
-       VAR_WORLD_BACKGROUND,
-       VAR_WORLD_PROBE,
-};
-
-/* Material shader variations */
-enum {
-       VAR_MAT_MESH     = (1 << 0),
-       VAR_MAT_PROBE    = (1 << 1),
-       VAR_MAT_HAIR     = (1 << 2),
-};
+       "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" \
+       SHADER_IRRADIANCE
 
 /* *********** STATIC *********** */
 static struct {
@@ -68,15 +64,15 @@ static struct {
 
        struct GPUShader *default_prepass_sh;
        struct GPUShader *default_prepass_clip_sh;
-       struct GPUShader *default_lit;
-       struct GPUShader *default_lit_flat;
-       struct GPUShader *default_lit_hair;
+       struct GPUShader *default_lit[VAR_MAT_MAX];
 
        struct GPUShader *default_background;
 
        /* 64*64 array texture containing all LUTs and other utilitarian arrays.
         * Packing enables us to same precious textures slots. */
        struct GPUTexture *util_tex;
+
+       float viewvecs[2][4];
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_prepass_frag_glsl[];
@@ -166,6 +162,76 @@ static struct GPUTexture *create_ggx_lut_texture(int 
UNUSED(w), int UNUSED(h))
 }
 #endif
 
+static char *eevee_get_defines(int options)
+{
+       char *str = NULL;
+
+       BLI_assert(options < VAR_MAT_MAX);
+
+       DynStr *ds = BLI_dynstr_new();
+       BLI_dynstr_appendf(ds, SHADER_DEFINES);
+
+       if ((options & VAR_MAT_MESH) != 0) {
+               BLI_dynstr_appendf(ds, "#define MESH_SHADER\n");
+       }
+       if ((options & VAR_MAT_HAIR) != 0) {
+               BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
+       }
+       if ((options & VAR_MAT_PROBE) != 0) {
+               BLI_dynstr_appendf(ds, "#define PROBE_CAPTURE\n");
+       }
+       if ((options & VAR_MAT_AO) != 0) {
+               BLI_dynstr_appendf(ds, "#define USE_AO\n");
+       }
+       if ((options & VAR_MAT_FLAT) != 0) {
+               BLI_dynstr_appendf(ds, "#define USE_FLAT_NORMAL\n");
+       }
+       if ((options & VAR_MAT_BENT) != 0) {
+               BLI_dynstr_appendf(ds, "#define USE_BENT_NORMAL\n");
+       }
+
+       str = BLI_dynstr_get_cstring(ds);
+       BLI_dynstr_free(ds);
+
+       return str;
+}
+
+static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData 
*sldata, EEVEE_Data *vedata)
+{
+       DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
+       DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
+       DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->planar_ubo);
+       DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo);
+       DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo);
+       DRW_shgroup_uniform_int(shgrp, "light_count", 
&sldata->lamps->num_light, 1);
+       DRW_shgroup_uniform_int(shgrp, "probe_count", 
&sldata->probes->num_render_cube, 1);
+       DRW_shgroup_uniform_int(shgrp, "grid_count", 
&sldata->probes->num_render_grid, 1);
+       DRW_shgroup_uniform_int(shgrp, "planar_count", 
&sldata->probes->num_planar, 1);
+       DRW_shgroup_uniform_bool(shgrp, "specToggle", 
&sldata->probes->specular_toggle, 1);
+       DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
+       DRW_shgroup_uniform_texture(shgrp, "utilTex", e_data.util_tex);
+       DRW_shgroup_uniform_buffer(shgrp, "probeCubes", &sldata->probe_pool);
+       DRW_shgroup_uniform_buffer(shgrp, "probePlanars", 
&vedata->txl->planar_pool);
+       DRW_shgroup_uniform_buffer(shgrp, "irradianceGrid", 
&sldata->irradiance_pool);
+       DRW_shgroup_uniform_buffer(shgrp, "shadowCubes", 
&sldata->shadow_depth_cube_pool);
+       DRW_shgroup_uniform_buffer(shgrp, "shadowCascades", 
&sldata->shadow_depth_cascade_pool);
+}
+
+static void create_default_shader(int options)
+{
+       DynStr *ds_frag = BLI_dynstr_new();
+       BLI_dynstr_append(ds_frag, e_data.frag_shader_lib);
+       BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl);
+       char *frag_str = BLI_dynstr_get_cstring(ds_frag);
+       BLI_dynstr_free(ds_frag);
+
+       char *defines = eevee_get_defines(options);
+
+       e_data.default_lit[options] = 
DRW_shader_create(datatoc_lit_surface_vert_glsl, NULL, frag_str, defines);
+
+       MEM_freeN(defines);
+       MEM_freeN(frag_str);
+}
 void EEVEE_materials_init(void)
 {
        if (!e_data.frag_shader_lib) {
@@ -191,37 +257,6 @@ void EEVEE_materials_init(void)
                e_data.default_background = DRW_shader_create_fullscreen(
                        datatoc_default_world_frag_glsl, NULL);
 
-               e_data.default_lit = DRW_shader_create(
-                       datatoc_lit_surface_vert_glsl, NULL, frag_str,
-                       SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
-                       "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-                       "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-                       "#define IRRADIANCE_HL2\n"
-#endif
-                       "#define MESH_SHADER\n");
-
-               e_data.default_lit_flat = DRW_shader_create(
-                       datatoc_lit_surface_vert_glsl, NULL, frag_str,
-                       SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
-                       "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-                       "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-                       "#define IRRADIANCE_HL2\n"
-#endif
-                       "#define MESH_SHADER\n"
-                       "#define USE_FLAT_NORMAL\n");
-
-               e_data.default_lit_hair = DRW_shader_create(
-                       datatoc_lit_surface_vert_glsl, NULL, frag_str,
-                       SHADER_DEFINES
-                       "#define MESH_SHADER\n"
-                       "#define HAIR_SHADER\n");
-
                e_data.default_prepass_sh = DRW_shader_create(
                        datatoc_prepass_vert_glsl, NULL, 
datatoc_prepass_frag_glsl,
                        NULL);
@@ -280,58 +315,93 @@ struct GPUMaterial 
*EEVEE_material_world_background_get(struct Scene *scene, Wor
            SHADER_DEFINES "#define WORLD_BACKGROUND\n");
 }
 
-struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma)
+struct GPUMaterial *EEVEE_material_mesh_get(
+        struct Scene *scene, Material *ma,
+        bool use_ao, bool use_bent_normals)
 {
-       return GPU_material_from_nodetree(
+       struct GPUMaterial *mat;
+
+       int options = VAR_MAT_MESH;
+
+       if (use_ao) options |= VAR_MAT_AO;
+       if (use_bent_normals) options |= VAR_MAT_BENT;
+
+       char *defines = eevee_get_defines(options);
+
+       mat = GPU_material_from_nodetree(
            scene, ma->nodetree, &ma->gpumaterial, 
&DRW_engine_viewport_eevee_type,
-           VAR_MAT_MESH,
+           options,
            datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
-           SHADER_DEFINES
-#if defined(IRRADIANCE_SH_L2)
-           "#define IRRADIANCE_SH_L2\n"
-#elif defined(IRRADIANCE_CUBEMAP)
-           "#define IRRADIANCE_CUBEMAP\n"
-#elif defined(IRRADIANCE_HL2)
-           "#define IRRADIANCE_HL2\n"
-#endif
-           "#define MESH_SHADER\n");
+           defines);
+
+       MEM_freeN(defines);
+
+       return mat;
 }
 
-struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma)
+struct GPUMaterial *EEVEE_material_hair_get(
+        struct Scene *scene, Material *ma,
+        bool use_ao, bool use_bent_normals)
 {
-       return GPU_material_from_nodetree(
+       struct GPUMaterial *mat;
+
+       int options = VAR_MAT_MESH | VAR_MAT_HAIR;
+
+       if (use_ao) options |= VAR_MAT_AO;
+       if (use_bent_normals) options |= VAR_MAT_BENT;
+
+       char *defines = eevee_get_defines(options);
+
+       mat = GPU_material_from_nodetree(
            scene, ma->nodetree, &ma->gpumaterial, 
&DRW_engine_viewport_eevee_type,
-           VAR_MAT_HAIR,
+           options,
            datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib,
-           SHADER_DEFINES "#define MESH_SHADER\n" "#define HAIR_SHADER\n");
+           defines);
+
+       MEM_freeN(defines);
+
+       return mat;
 }
 
-static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData 
*sldata, EEVEE_Data *vedata)
+static struct DRWShadingGroup *EEVEE_default_shading_group_get(
+        EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata,
+        bool is_hair, bool is_flat_normal, bool use_ao, bool use_bent_normals)
 {
-       DRW_shgroup_uniform_block(shgrp, "probe_block", sldata->probe_ubo);
-       DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo);
-       DRW_shgroup_uniform_block(shgrp, "planar_block", sldata->plana

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to