From 5ccc02277d7cee7affa5d3b49a8b9e6e4368b201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 22 Jun 2017 02:41:17 +0200 Subject: 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. --- source/blender/draw/engines/eevee/eevee_engine.c | 4 +- .../blender/draw/engines/eevee/eevee_lightprobes.c | 6 +- .../blender/draw/engines/eevee/eevee_materials.c | 284 +++++++++++++-------- source/blender/draw/engines/eevee/eevee_private.h | 29 ++- 4 files changed, 202 insertions(+), 121 deletions(-) (limited to 'source/blender/draw/engines') 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->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); + int options = VAR_MAT_MESH; + + if (is_hair) options |= VAR_MAT_HAIR; + if (use_ao) options |= VAR_MAT_AO; + if (use_bent_normals) options |= VAR_MAT_BENT; + if (is_flat_normal) options |= VAR_MAT_FLAT; + + if (e_data.default_lit[options] == NULL) { + create_default_shader(options); + } + + if (vedata->psl->default_pass[options] == NULL) { + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_WIRE; + vedata->psl->default_pass[options] = DRW_pass_create("Default Lit Pass", state); + + DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]); + add_standard_uniforms(shgrp, sldata, vedata); + } + + return DRW_shgroup_create(e_data.default_lit[options], vedata->psl->default_pass[options]); } void EEVEE_materials_cache_init(EEVEE_Data *vedata) { EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; - EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); + + { + /* Global AO Switch*/ + const DRWContextState *draw_ctx = DRW_context_state_get(); + SceneLayer *scene_layer = draw_ctx->sl; + IDProperty *props = BKE_scene_layer_engine_evaluated_get(scene_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE); + stl->effects->use_ao = BKE_collection_engine_property_value_get_bool(props, "gtao_enable"); + stl->effects->use_bent_normals = BKE_collection_engine_property_value_get_bool(props, "gtao_use_bent_normals"); + } /* Create Material Ghash */ { @@ -395,21 +465,6 @@ void EEVEE_materials_cache_init(EEVEE_Data *vedata) stl->g_data->depth_shgrp_clip_cull = DRW_shgroup_create(e_data.default_prepass_clip_sh, psl->depth_pass_clip_cull); } - { - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_WIRE; - psl->default_pass = DRW_pass_create("Default Lit Pass", state); - DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit, psl->default_pass); - add_standard_uniforms(shgrp, sldata, vedata); - - psl->default_flat_pass = DRW_pass_create("Default Flat Lit Pass", state); - shgrp = DRW_shgroup_create(e_data.default_lit_flat, psl->default_flat_pass); - add_standard_uniforms(shgrp, sldata, vedata); - - psl->default_hair_pass = DRW_pass_create("Default Hair Lit Pass", state); - shgrp = DRW_shgroup_create(e_data.default_lit_hair, psl->default_hair_pass); - add_standard_uniforms(shgrp, sldata, vedata); - } - { DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_WIRE; psl->material_pass = DRW_pass_create("Material Shader Pass", state); @@ -447,13 +502,11 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl /* Get per-material split surface */ struct Gwn_Batch **mat_geom = DRW_cache_object_surface_material_get(ob); if (mat_geom) { - struct GPUShader *default_shader = e_data.default_lit; - struct DRWPass *default_pass = psl->default_pass; + bool use_flat_nor = false; if (is_default_mode_shader) { if (is_sculpt_mode) { - bool use_flat = DRW_object_is_flat_normal(ob); - default_shader = use_flat ? e_data.default_lit_flat : e_data.default_lit; + use_flat_nor = DRW_object_is_flat_normal(ob); } } @@ -477,7 +530,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl if (ma->use_nodes && ma->nodetree) { Scene *scene = draw_ctx->scene; - struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma); + struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma, + stl->effects->use_ao, stl->effects->use_bent_normals); shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass); if (shgrp) { @@ -499,7 +553,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl /* Fallback to default shader */ if (shgrp == NULL) { - shgrp = DRW_shgroup_create(default_shader, default_pass); + shgrp = EEVEE_default_shading_group_get(sldata, vedata, false, use_flat_nor, + stl->effects->use_ao, stl->effects->use_bent_normals); DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1); DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1); DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1); @@ -549,7 +604,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl else { if (ma->use_nodes && ma->nodetree) { Scene *scene = draw_ctx->scene; - struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma); + struct GPUMaterial *gpumat = EEVEE_material_hair_get(scene, ma, + stl->effects->use_ao, stl->effects->use_bent_normals); shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass); if (shgrp) { @@ -571,7 +627,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl /* Fallback to default shader */ if (shgrp == NULL) { - shgrp = DRW_shgroup_create(e_data.default_lit_hair, psl->default_hair_pass); + shgrp = EEVEE_default_shading_group_get(sldata, vedata, true, false, + stl->effects->use_ao, stl->effects->use_bent_normals); DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1); DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1); DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1); @@ -599,12 +656,21 @@ void EEVEE_materials_cache_finish(EEVEE_Data *vedata) void EEVEE_materials_free(void) { + for (int i = 0; i < VAR_MAT_MAX; ++i) { + DRW_SHADER_FREE_SAFE(e_data.default_lit[i]); + } MEM_SAFE_FREE(e_data.frag_shader_lib); DRW_SHADER_FREE_SAFE(e_data.default_prepass_sh); DRW_SHADER_FREE_SAFE(e_data.default_prepass_clip_sh); - DRW_SHADER_FREE_SAFE(e_data.default_lit); - DRW_SHADER_FREE_SAFE(e_data.default_lit_flat); - DRW_SHADER_FREE_SAFE(e_data.default_lit_hair); DRW_SHADER_FREE_SAFE(e_data.default_background); DRW_TEXTURE_FREE_SAFE(e_data.util_tex); } + +void EEVEE_draw_default_passes(EEVEE_PassList *psl) +{ + for (int i = 0; i < VAR_MAT_MAX; ++i) { + if (psl->default_pass[i]) { + DRW_draw_pass(psl->default_pass[i]); + } + } +} diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index ea63919b23d..bd9e1bf9e89 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -46,6 +46,26 @@ extern struct DrawEngineType draw_engine_eevee_type; // #define IRRADIANCE_CUBEMAP #define IRRADIANCE_HL2 +/* 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), + VAR_MAT_AO = (1 << 3), + VAR_MAT_FLAT = (1 << 4), + VAR_MAT_BENT = (1 << 5), + /* Max number of variation */ + /* IMPORTANT : Leave it last and set + * it's value accordingly. */ + VAR_MAT_MAX = (1 << 6) +}; + typedef struct EEVEE_PassList { /* Shadows */ struct DRWPass *shadow_pass; @@ -77,9 +97,7 @@ typedef struct EEVEE_PassList { struct DRWPass *depth_pass_cull; struct DRWPass *depth_pass_clip; struct DRWPass *depth_pass_clip_cull; - struct DRWPass *default_pass; - struct DRWPass *default_flat_pass; - struct DRWPass *default_hair_pass; + struct DRWPass *default_pass[VAR_MAT_MAX]; struct DRWPass *material_pass; struct DRWPass *background_pass; } EEVEE_PassList; @@ -393,9 +411,10 @@ void EEVEE_materials_cache_finish(EEVEE_Data *vedata); struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, struct World *wo); struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, struct World *wo); struct GPUMaterial *EEVEE_material_mesh_lightprobe_get(struct Scene *scene, Material *ma); -struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma); -struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma); +struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma, bool use_ao, bool use_bent_normals); +struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, bool use_ao, bool use_bent_normals); void EEVEE_materials_free(void); +void EEVEE_draw_default_passes(EEVEE_PassList *psl); /* eevee_lights.c */ void EEVEE_lights_init(EEVEE_SceneLayerData *sldata); -- cgit v1.2.3