Eevee: Put shadows and probes inside SceneLayerEngineData

This remove the duplication of data for each viewport improving memory usage.
This commit is contained in:
Clément Foucault 2017-05-30 22:29:20 +02:00
parent e7fb013a60
commit c2d81f257f
5 changed files with 239 additions and 193 deletions

View File

@ -88,6 +88,9 @@ extern char datatoc_background_vert_glsl[];
extern Material defmaterial;
extern GlobalsUboStorage ts;
/* Prototypes */
static void EEVEE_scene_layer_data_free(void *storage);
static struct GPUTexture *create_jitter_texture(int w, int h)
{
struct GPUTexture *tex;
@ -187,7 +190,11 @@ static void EEVEE_engine_init(void *ved)
EEVEE_Data *vedata = (EEVEE_Data *)ved;
EEVEE_TextureList *txl = vedata->txl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_SceneLayerData **sldata = (EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free);
if (*sldata == NULL) {
*sldata = MEM_callocN(sizeof(EEVEE_SceneLayerData), "EEVEE_SceneLayerData");
}
DRWFboTexture tex = {&txl->color, DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER};
@ -259,9 +266,9 @@ static void EEVEE_engine_init(void *ved)
copy_v3_v3(e_data.camera_pos, viewinvmat[3]);
}
EEVEE_lights_init(stl);
EEVEE_lights_init(*sldata);
EEVEE_probes_init(vedata);
EEVEE_probes_init(*sldata);
EEVEE_effects_init(vedata);
@ -283,8 +290,9 @@ static void EEVEE_cache_init(void *vedata)
static int zero = 0;
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free);
if (!stl->g_data) {
/* Alloc transient pointers */
@ -410,15 +418,15 @@ static void EEVEE_cache_init(void *vedata)
shgrp = DRW_shgroup_create(shader, psl->default_pass);
}
DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo);
DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo);
DRW_shgroup_uniform_int(shgrp, "light_count", &stl->lamps->num_light, 1);
DRW_shgroup_uniform_float(shgrp, "lodMax", &stl->probes->lodmax, 1);
DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
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_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)sldata->probes->shcoefs, 9);
DRW_shgroup_uniform_vec3(shgrp, "cameraPos", e_data.camera_pos, 1);
DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat);
DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", txl->probe_pool);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool);
/* NOTE : Adding Shadow Map textures uniform in EEVEE_cache_finish */
}
}
@ -428,16 +436,16 @@ static void EEVEE_cache_init(void *vedata)
psl->material_pass = DRW_pass_create("Material Shader Pass", state);
}
EEVEE_probes_cache_init(vedata);
EEVEE_lights_cache_init(stl, psl, txl);
EEVEE_probes_cache_init(sldata, psl);
EEVEE_lights_cache_init(sldata, psl);
EEVEE_effects_cache_init(vedata);
}
static void EEVEE_cache_populate(void *vedata, Object *ob)
{
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free);
const DRWContextState *draw_ctx = DRW_context_state_get();
const bool is_active = (ob == draw_ctx->obact);
@ -492,15 +500,15 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
DRWShadingGroup *shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass);
if (shgrp) {
DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo);
DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo);
DRW_shgroup_uniform_int(shgrp, "light_count", &stl->lamps->num_light, 1);
DRW_shgroup_uniform_float(shgrp, "lodMax", &stl->probes->lodmax, 1);
DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
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_float(shgrp, "lodMax", &sldata->probes->lodmax, 1);
DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)sldata->probes->shcoefs, 9);
DRW_shgroup_uniform_vec3(shgrp, "cameraPos", e_data.camera_pos, 1);
DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat);
DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", txl->probe_pool);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat);
@ -521,7 +529,7 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
DRW_shgroup_uniform_float(shgrp, "roughness", &half, 1);
DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat);
DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", txl->probe_pool);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat);
@ -539,7 +547,7 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
DRW_shgroup_uniform_float(shgrp, "roughness", &ma->gloss_mir, 1);
DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat);
DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", txl->probe_pool);
DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool);
if (is_sculpt_mode) {
DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat);
@ -556,11 +564,11 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
const bool cast_shadow = true;
if (cast_shadow) {
EEVEE_lights_cache_shcaster_add(psl, stl, geom, ob->obmat);
EEVEE_lights_cache_shcaster_add(sldata, psl, geom, ob->obmat);
}
}
else if (ob->type == OB_LAMP) {
EEVEE_lights_cache_add(stl, ob);
EEVEE_lights_cache_add(sldata, ob);
}
}
@ -579,18 +587,16 @@ static void eevee_bind_shadow(void *data, DRWShadingGroup *shgrp)
static void EEVEE_cache_finish(void *vedata)
{
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl;
EEVEE_FramebufferList *fbl = ((EEVEE_Data *)vedata)->fbl;
EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free);
EEVEE_lights_cache_finish(stl, txl, fbl);
EEVEE_probes_cache_finish(vedata);
EEVEE_lights_cache_finish(sldata);
EEVEE_probes_cache_finish(sldata);
/* Shadows binding */
eevee_bind_shadow_data data;
data.shadow_depth_cube_pool = txl->shadow_depth_cube_pool;
data.shadow_depth_cascade_pool = txl->shadow_depth_cascade_pool;
data.shadow_depth_cube_pool = sldata->shadow_depth_cube_pool;
data.shadow_depth_cascade_pool = sldata->shadow_depth_cascade_pool;
DRW_pass_foreach_shgroup(psl->default_pass, eevee_bind_shadow, &data);
DRW_pass_foreach_shgroup(psl->material_pass, eevee_bind_shadow, &data);
@ -600,15 +606,16 @@ static void EEVEE_draw_scene(void *vedata)
{
EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
EEVEE_FramebufferList *fbl = ((EEVEE_Data *)vedata)->fbl;
EEVEE_SceneLayerData *sldata = *(EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(&draw_engine_eevee_type, &EEVEE_scene_layer_data_free);
/* Default framebuffer and texture */
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
/* Refresh Probes */
EEVEE_refresh_probe((EEVEE_Data *)vedata);
EEVEE_refresh_probe(sldata, psl);
/* Refresh shadows */
EEVEE_draw_shadows((EEVEE_Data *)vedata);
EEVEE_draw_shadows(sldata, psl);
/* Attach depth to the hdr buffer and bind it */
DRW_framebuffer_texture_detach(dtxl->depth);
@ -643,6 +650,13 @@ static void EEVEE_engine_free(void)
DRW_TEXTURE_FREE_SAFE(e_data.jitter);
}
static void EEVEE_scene_layer_data_free(void *storage)
{
EEVEE_SceneLayerData *sldata = (EEVEE_SceneLayerData *)storage;
EEVEE_scene_layer_lights_free(sldata);
EEVEE_scene_layer_probes_free(sldata);
}
static void EEVEE_layer_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
{
BLI_assert(props &&
@ -652,7 +666,6 @@ static void EEVEE_layer_collection_settings_create(RenderEngine *UNUSED(engine),
UNUSED_VARS_NDEBUG(props);
}
static void EEVEE_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
{
BLI_assert(props &&

View File

@ -61,7 +61,7 @@ extern char datatoc_shadow_store_frag_glsl[];
/* *********** FUNCTIONS *********** */
void EEVEE_lights_init(EEVEE_StorageList *stl)
void EEVEE_lights_init(EEVEE_SceneLayerData *sldata)
{
const unsigned int shadow_ubo_size = sizeof(EEVEE_ShadowCube) * MAX_SHADOW_CUBE +
sizeof(EEVEE_ShadowMap) * MAX_SHADOW_MAP +
@ -75,17 +75,17 @@ void EEVEE_lights_init(EEVEE_StorageList *stl)
datatoc_shadow_store_vert_glsl, datatoc_shadow_store_geom_glsl, datatoc_shadow_store_frag_glsl, NULL);
}
if (!stl->lamps) {
stl->lamps = MEM_callocN(sizeof(EEVEE_LampsInfo), "EEVEE_LampsInfo");
stl->light_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_Light) * MAX_LIGHT, NULL);
stl->shadow_ubo = DRW_uniformbuffer_create(shadow_ubo_size, NULL);
stl->shadow_render_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_ShadowRender), NULL);
if (!sldata->lamps) {
sldata->lamps = MEM_callocN(sizeof(EEVEE_LampsInfo), "EEVEE_LampsInfo");
sldata->light_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_Light) * MAX_LIGHT, NULL);
sldata->shadow_ubo = DRW_uniformbuffer_create(shadow_ubo_size, NULL);
sldata->shadow_render_ubo = DRW_uniformbuffer_create(sizeof(EEVEE_ShadowRender), NULL);
}
}
void EEVEE_lights_cache_init(EEVEE_StorageList *stl, EEVEE_PassList *psl, EEVEE_TextureList *txl)
void EEVEE_lights_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
{
EEVEE_LampsInfo *linfo = stl->lamps;
EEVEE_LampsInfo *linfo = sldata->lamps;
linfo->num_light = linfo->num_cube = linfo->num_map = linfo->num_cascade = 0;
memset(linfo->light_ref, 0, sizeof(linfo->light_ref));
@ -97,8 +97,8 @@ void EEVEE_lights_cache_init(EEVEE_StorageList *stl, EEVEE_PassList *psl, EEVEE_
psl->shadow_cube_store_pass = DRW_pass_create("Shadow Storage Pass", DRW_STATE_WRITE_COLOR);
DRWShadingGroup *grp = DRW_shgroup_create(e_data.shadow_store_sh, psl->shadow_cube_store_pass);
DRW_shgroup_uniform_buffer(grp, "shadowCube", &txl->shadow_color_cube_target);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
DRW_shgroup_uniform_buffer(grp, "shadowCube", &sldata->shadow_color_cube_target);
DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
}
@ -111,9 +111,9 @@ void EEVEE_lights_cache_init(EEVEE_StorageList *stl, EEVEE_PassList *psl, EEVEE_
}
}
void EEVEE_lights_cache_add(EEVEE_StorageList *stl, Object *ob)
void EEVEE_lights_cache_add(EEVEE_SceneLayerData *sldata, Object *ob)
{
EEVEE_LampsInfo *linfo = stl->lamps;
EEVEE_LampsInfo *linfo = sldata->lamps;
/* Step 1 find all lamps in the scene and setup them */
if (linfo->num_light > MAX_LIGHT) {
@ -159,92 +159,92 @@ void EEVEE_lights_cache_add(EEVEE_StorageList *stl, Object *ob)
}
/* Add a shadow caster to the shadowpasses */
void EEVEE_lights_cache_shcaster_add(EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4])
void EEVEE_lights_cache_shcaster_add(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, struct Batch *geom, float (*obmat)[4])
{
DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cube_pass, geom);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
for (int i = 0; i < 6; ++i)
DRW_shgroup_call_dynamic_add_empty(grp);
grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cascade_pass, geom);
DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
DRW_shgroup_uniform_block(grp, "shadow_render_block", sldata->shadow_render_ubo);
DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
for (int i = 0; i < MAX_CASCADE_NUM; ++i)
DRW_shgroup_call_dynamic_add_empty(grp);
}
void EEVEE_lights_cache_finish(EEVEE_StorageList *stl, EEVEE_TextureList *txl, EEVEE_FramebufferList *fbl)
void EEVEE_lights_cache_finish(EEVEE_SceneLayerData *sldata)
{
EEVEE_LampsInfo *linfo = stl->lamps;
EEVEE_LampsInfo *linfo = sldata->lamps;
/* Step 4 Update Lamp UBOs */
EEVEE_lights_update(stl);
EEVEE_lights_update(sldata);
/* Step 5 Setup enough layers */
/* Free textures if number mismatch */
if (linfo->num_cube != linfo->cache_num_cube) {
DRW_TEXTURE_FREE_SAFE(txl->shadow_depth_cube_pool);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_pool);
linfo->cache_num_cube = linfo->num_cube;
}
if (linfo->num_map != linfo->cache_num_map) {
DRW_TEXTURE_FREE_SAFE(txl->shadow_depth_map_pool);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_map_pool);
linfo->cache_num_map = linfo->num_map;
}
if (linfo->num_cascade != linfo->cache_num_cascade) {
DRW_TEXTURE_FREE_SAFE(txl->shadow_depth_cascade_pool);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cascade_pool);
linfo->cache_num_cascade = linfo->num_cascade;
}
/* Initialize Textures Arrays first so DRW_framebuffer_init just bind them. */
if (!txl->shadow_depth_cube_target) {
if (!sldata->shadow_depth_cube_target) {
/* Render Cubemap */
txl->shadow_depth_cube_target = DRW_texture_create_cube(512, DRW_TEX_DEPTH_24, 0, NULL);
txl->shadow_color_cube_target = DRW_texture_create_cube(512, DRW_TEX_R_32, DRW_TEX_FILTER, NULL);
if (fbl->shadow_cube_fb) {
DRW_framebuffer_texture_attach(fbl->shadow_cube_fb, txl->shadow_depth_cube_target, 0, 0);
DRW_framebuffer_texture_attach(fbl->shadow_cube_fb, txl->shadow_color_cube_target, 0, 0);
sldata->shadow_depth_cube_target = DRW_texture_create_cube(512, DRW_TEX_DEPTH_24, 0, NULL);
sldata->shadow_color_cube_target = DRW_texture_create_cube(512, DRW_TEX_R_32, DRW_TEX_FILTER, NULL);
if (sldata->shadow_cube_fb) {
DRW_framebuffer_texture_attach(sldata->shadow_cube_fb, sldata->shadow_depth_cube_target, 0, 0);
DRW_framebuffer_texture_attach(sldata->shadow_cube_fb, sldata->shadow_color_cube_target, 0, 0);
}
}
if (!txl->shadow_depth_cube_pool) {
if (!sldata->shadow_depth_cube_pool) {
/* Cubemap / octahedral map pool */
/* TODO Cubemap array */
txl->shadow_depth_cube_pool = DRW_texture_create_2D_array(
sldata->shadow_depth_cube_pool = DRW_texture_create_2D_array(
512, 512, max_ff(1, linfo->num_cube), DRW_TEX_R_32,
DRW_TEX_FILTER | DRW_TEX_COMPARE, NULL);
if (fbl->shadow_cube_fb) {
DRW_framebuffer_texture_attach(fbl->shadow_cube_fb, txl->shadow_depth_cube_pool, 0, 0);
if (sldata->shadow_cube_fb) {
DRW_framebuffer_texture_attach(sldata->shadow_cube_fb, sldata->shadow_depth_cube_pool, 0, 0);
}
}
if (!txl->shadow_depth_map_pool) {
txl->shadow_depth_map_pool = DRW_texture_create_2D_array(
if (!sldata->shadow_depth_map_pool) {
sldata->shadow_depth_map_pool = DRW_texture_create_2D_array(
512, 512, max_ff(1, linfo->num_map), DRW_TEX_DEPTH_24,
DRW_TEX_FILTER | DRW_TEX_COMPARE, NULL);
if (fbl->shadow_map_fb) {
DRW_framebuffer_texture_attach(fbl->shadow_map_fb, txl->shadow_depth_map_pool, 0, 0);
if (sldata->shadow_map_fb) {
DRW_framebuffer_texture_attach(sldata->shadow_map_fb, sldata->shadow_depth_map_pool, 0, 0);
}
}
if (!txl->shadow_depth_cascade_pool) {
txl->shadow_depth_cascade_pool = DRW_texture_create_2D_array(
if (!sldata->shadow_depth_cascade_pool) {
sldata->shadow_depth_cascade_pool = DRW_texture_create_2D_array(
512, 512, max_ff(1, linfo->num_cascade * MAX_CASCADE_NUM), DRW_TEX_DEPTH_24,
DRW_TEX_FILTER | DRW_TEX_COMPARE, NULL);
if (fbl->shadow_cascade_fb) {
DRW_framebuffer_texture_attach(fbl->shadow_cascade_fb, txl->shadow_depth_map_pool, 0, 0);
if (sldata->shadow_cascade_fb) {
DRW_framebuffer_texture_attach(sldata->shadow_cascade_fb, sldata->shadow_depth_map_pool, 0, 0);
}
}
DRWFboTexture tex_cube_target[2] = {
{&txl->shadow_depth_cube_target, DRW_TEX_DEPTH_24, 0},
{&txl->shadow_color_cube_target, DRW_TEX_R_32, DRW_TEX_FILTER}};
DRW_framebuffer_init(&fbl->shadow_cube_target_fb, &draw_engine_eevee_type, 512, 512, tex_cube_target, 2);
{&sldata->shadow_depth_cube_target, DRW_TEX_DEPTH_24, 0},
{&sldata->shadow_color_cube_target, DRW_TEX_R_32, DRW_TEX_FILTER}};
DRW_framebuffer_init(&sldata->shadow_cube_target_fb, &draw_engine_eevee_type, 512, 512, tex_cube_target, 2);
DRWFboTexture tex_cube = {&txl->shadow_depth_cube_pool, DRW_TEX_R_32, DRW_TEX_FILTER};
DRW_framebuffer_init(&fbl->shadow_cube_fb, &draw_engine_eevee_type, 512, 512, &tex_cube, 1);
DRWFboTexture tex_cube = {&sldata->shadow_depth_cube_pool, DRW_TEX_R_32, DRW_TEX_FILTER};
DRW_framebuffer_init(&sldata->shadow_cube_fb, &draw_engine_eevee_type, 512, 512, &tex_cube, 1);
DRWFboTexture tex_cascade = {&txl->shadow_depth_cascade_pool, DRW_TEX_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
DRW_framebuffer_init(&fbl->shadow_cascade_fb, &draw_engine_eevee_type, 512, 512, &tex_cascade, 1);
DRWFboTexture tex_cascade = {&sldata->shadow_depth_cascade_pool, DRW_TEX_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
DRW_framebuffer_init(&sldata->shadow_cascade_fb, &draw_engine_eevee_type, 512, 512, &tex_cascade, 1);
}
/* Update buffer with lamp data */
@ -546,9 +546,9 @@ static void eevee_shadow_cascade_setup(Object *ob, EEVEE_LampsInfo *linfo, EEVEE
evli->shadowid = (float)(MAX_SHADOW_CUBE + MAX_SHADOW_MAP + evscp->shadow_id);
}
void EEVEE_lights_update(EEVEE_StorageList *stl)
void EEVEE_lights_update(EEVEE_SceneLayerData *sldata)
{
EEVEE_LampsInfo *linfo = stl->lamps;
EEVEE_LampsInfo *linfo = sldata->lamps;
Object *ob;
int i;
@ -572,17 +572,14 @@ void EEVEE_lights_update(EEVEE_StorageList *stl)
eevee_shadow_cascade_setup(ob, linfo, led);
}
DRW_uniformbuffer_update(stl->light_ubo, &linfo->light_data);
DRW_uniformbuffer_update(stl->shadow_ubo, &linfo->shadow_cube_data); /* Update all data at once */
DRW_uniformbuffer_update(sldata->light_ubo, &linfo->light_data);
DRW_uniformbuffer_update(sldata->shadow_ubo, &linfo->shadow_cube_data); /* Update all data at once */
}
/* this refresh lamps shadow buffers */
void EEVEE_draw_shadows(EEVEE_Data *vedata)
void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
{
EEVEE_PassList *psl = vedata->psl;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_LampsInfo *linfo = stl->lamps;
EEVEE_LampsInfo *linfo = sldata->lamps;
Object *ob;
int i;
float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
@ -599,15 +596,15 @@ void EEVEE_draw_shadows(EEVEE_Data *vedata)
for (int j = 0; j < 6; ++j) {
copy_m4_m4(srd->shadowmat[j], evscd->viewprojmat[j]);
}
DRW_uniformbuffer_update(stl->shadow_render_ubo, &linfo->shadow_render_data);
DRW_uniformbuffer_update(sldata->shadow_render_ubo, &linfo->shadow_render_data);
DRW_framebuffer_bind(fbl->shadow_cube_target_fb);
DRW_framebuffer_bind(sldata->shadow_cube_target_fb);
DRW_framebuffer_clear(true, true, false, clear_color, 1.0);
/* Render shadow cube */
DRW_draw_pass(psl->shadow_cube_pass);
/* Push it to shadowmap array */
DRW_framebuffer_bind(fbl->shadow_cube_fb);
DRW_framebuffer_bind(sldata->shadow_cube_fb);
DRW_draw_pass(psl->shadow_cube_store_pass);
}
@ -641,7 +638,7 @@ void EEVEE_draw_shadows(EEVEE_Data *vedata)
// for (int j = 0; j < MAX_CASCADE_NUM; ++j) {
// copy_m4_m4(srd->shadowmat[j], evscd->viewprojmat[j]);
// }
// DRW_uniformbuffer_update(stl->shadow_render_ubo, &linfo->shadow_render_data);
// DRW_uniformbuffer_update(sldata->shadow_render_ubo, &linfo->shadow_render_data);
// DRW_draw_pass(psl->shadow_cascade_pass);
// }
@ -651,4 +648,21 @@ void EEVEE_lights_free(void)
{
DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
DRW_SHADER_FREE_SAFE(e_data.shadow_store_sh);
}
}
void EEVEE_scene_layer_lights_free(EEVEE_SceneLayerData *sldata)
{
MEM_SAFE_FREE(sldata->lamps);
DRW_UBO_FREE_SAFE(sldata->light_ubo);
DRW_UBO_FREE_SAFE(sldata->shadow_ubo);
DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_target_fb);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_fb);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_map_fb);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_fb);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_target);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_color_cube_target);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cube_pool);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_map_pool);
DRW_TEXTURE_FREE_SAFE(sldata->shadow_depth_cascade_pool);
}

View File

@ -69,15 +69,6 @@ typedef struct EEVEE_PassList {
} EEVEE_PassList;
typedef struct EEVEE_FramebufferList {
/* Shadows */
struct GPUFrameBuffer *shadow_cube_target_fb;
struct GPUFrameBuffer *shadow_cube_fb;
struct GPUFrameBuffer *shadow_map_fb;
struct GPUFrameBuffer *shadow_cascade_fb;
/* Probes */
struct GPUFrameBuffer *probe_fb;
struct GPUFrameBuffer *probe_filter_fb;
struct GPUFrameBuffer *probe_sh_fb;
/* Effects */
struct GPUFrameBuffer *effect_fb; /* HDR */
struct GPUFrameBuffer *bloom_blit_fb; /* HDR */
@ -91,17 +82,6 @@ typedef struct EEVEE_FramebufferList {
} EEVEE_FramebufferList;
typedef struct EEVEE_TextureList {
/* Shadows */
struct GPUTexture *shadow_depth_cube_target;
struct GPUTexture *shadow_color_cube_target;
struct GPUTexture *shadow_depth_cube_pool;
struct GPUTexture *shadow_depth_map_pool;
struct GPUTexture *shadow_depth_cascade_pool;
/* Probes */
struct GPUTexture *probe_rt; /* R16_G16_B16 */
struct GPUTexture *probe_depth_rt;
struct GPUTexture *probe_pool; /* R11_G11_B10 */
struct GPUTexture *probe_sh; /* R16_G16_B16 */
/* Effects */
struct GPUTexture *color_post; /* R16_G16_B16 */
struct GPUTexture *dof_down_near; /* R16_G16_B16_A16 */
@ -117,17 +97,6 @@ typedef struct EEVEE_TextureList {
} EEVEE_TextureList;
typedef struct EEVEE_StorageList {
/* Lamps */
/* XXX this should be per-scenelayer and not per_viewport */
struct EEVEE_LampsInfo *lamps;
struct GPUUniformBuffer *light_ubo;
struct GPUUniformBuffer *shadow_ubo;
struct GPUUniformBuffer *shadow_render_ubo;
/* Probes */
struct EEVEE_ProbesInfo *probes;
struct GPUUniformBuffer *probe_ubo;
/* Effects */
struct EEVEE_EffectsInfo *effects;
@ -243,6 +212,41 @@ enum {
EFFECT_DOF = (1 << 2),
};
/* ************** SCENE LAYER DATA ************** */
typedef struct EEVEE_SceneLayerData {
/* Lamps */
struct EEVEE_LampsInfo *lamps;
struct GPUUniformBuffer *light_ubo;
struct GPUUniformBuffer *shadow_ubo;
struct GPUUniformBuffer *shadow_render_ubo;
struct GPUFrameBuffer *shadow_cube_target_fb;
struct GPUFrameBuffer *shadow_cube_fb;
struct GPUFrameBuffer *shadow_map_fb;
struct GPUFrameBuffer *shadow_cascade_fb;
struct GPUTexture *shadow_depth_cube_target;
struct GPUTexture *shadow_color_cube_target;
struct GPUTexture *shadow_depth_cube_pool;
struct GPUTexture *shadow_depth_map_pool;
struct GPUTexture *shadow_depth_cascade_pool;
/* Probes */
struct EEVEE_ProbesInfo *probes;
struct GPUUniformBuffer *probe_ubo;
struct GPUFrameBuffer *probe_fb;
struct GPUFrameBuffer *probe_filter_fb;
struct GPUFrameBuffer *probe_sh_fb;
struct GPUTexture *probe_rt;
struct GPUTexture *probe_depth_rt;
struct GPUTexture *probe_pool;
struct GPUTexture *probe_sh;
} EEVEE_SceneLayerData;
/* *********************************** */
typedef struct EEVEE_Data {
@ -268,23 +272,25 @@ typedef struct EEVEE_PrivateData {
} EEVEE_PrivateData; /* Transient data */
/* eevee_lights.c */
void EEVEE_lights_init(EEVEE_StorageList *stl);
void EEVEE_lights_cache_init(EEVEE_StorageList *stl, EEVEE_PassList *psl, EEVEE_TextureList *txl);
void EEVEE_lights_cache_add(EEVEE_StorageList *stl, struct Object *ob);
void EEVEE_lights_cache_shcaster_add(EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4]);
void EEVEE_lights_cache_finish(EEVEE_StorageList *stl, EEVEE_TextureList *txl, EEVEE_FramebufferList *fbl);
void EEVEE_lights_update(EEVEE_StorageList *stl);
void EEVEE_draw_shadows(EEVEE_Data *vedata);
void EEVEE_lights_init(EEVEE_SceneLayerData *sldata);
void EEVEE_lights_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl);
void EEVEE_lights_cache_add(EEVEE_SceneLayerData *sldata, struct Object *ob);
void EEVEE_lights_cache_shcaster_add(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, struct Batch *geom, float (*obmat)[4]);
void EEVEE_lights_cache_finish(EEVEE_SceneLayerData *sldata);
void EEVEE_lights_update(EEVEE_SceneLayerData *sldata);
void EEVEE_draw_shadows(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl);
void EEVEE_lights_free(void);
void EEVEE_scene_layer_lights_free(EEVEE_SceneLayerData *sldata);
/* eevee_probes.c */
void EEVEE_probes_init(EEVEE_Data *vedata);
void EEVEE_probes_cache_init(EEVEE_Data *vedata);
void EEVEE_probes_cache_add(EEVEE_Data *vedata, Object *ob);
void EEVEE_probes_cache_finish(EEVEE_Data *vedata);
void EEVEE_probes_update(EEVEE_Data *vedata);
void EEVEE_refresh_probe(EEVEE_Data *vedata);
void EEVEE_probes_init(EEVEE_SceneLayerData *sldata);
void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl);
void EEVEE_probes_cache_add(EEVEE_SceneLayerData *sldata, Object *ob);
void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *sldata);
void EEVEE_probes_update(EEVEE_SceneLayerData *sldata);
void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl);
void EEVEE_probes_free(void);
void EEVEE_scene_layer_probes_free(EEVEE_SceneLayerData *sldata);
/* eevee_effects.c */
void EEVEE_effects_init(EEVEE_Data *vedata);

View File

@ -91,12 +91,8 @@ static struct GPUTexture *create_hammersley_sample_texture(int samples)
return tex;
}
void EEVEE_probes_init(EEVEE_Data *vedata)
void EEVEE_probes_init(EEVEE_SceneLayerData *sldata)
{
EEVEE_StorageList *stl = vedata->stl;
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_TextureList *txl = vedata->txl;
if (!e_data.probe_filter_sh) {
char *shader_str = NULL;
@ -123,58 +119,54 @@ void EEVEE_probes_init(EEVEE_Data *vedata)
e_data.probe_spherical_harmonic_sh = DRW_shader_create_fullscreen(datatoc_probe_sh_frag_glsl, NULL);
}
if (!stl->probes) {
stl->probes = MEM_callocN(sizeof(EEVEE_ProbesInfo), "EEVEE_ProbesInfo");
if (!sldata->probes) {
sldata->probes = MEM_callocN(sizeof(EEVEE_ProbesInfo), "EEVEE_ProbesInfo");
}
if (!txl->probe_rt) {
txl->probe_rt = DRW_texture_create_cube(PROBE_CUBE_SIZE, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
txl->probe_depth_rt = DRW_texture_create_cube(PROBE_CUBE_SIZE, DRW_TEX_DEPTH_24, DRW_TEX_FILTER, NULL);
if (!sldata->probe_rt) {
sldata->probe_rt = DRW_texture_create_cube(PROBE_CUBE_SIZE, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
sldata->probe_depth_rt = DRW_texture_create_cube(PROBE_CUBE_SIZE, DRW_TEX_DEPTH_24, DRW_TEX_FILTER, NULL);
}
DRWFboTexture tex_probe[2] = {{&txl->probe_depth_rt, DRW_TEX_DEPTH_24, DRW_TEX_FILTER},
{&txl->probe_rt, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}};
DRWFboTexture tex_probe[2] = {{&sldata->probe_depth_rt, DRW_TEX_DEPTH_24, DRW_TEX_FILTER},
{&sldata->probe_rt, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}};
DRW_framebuffer_init(&fbl->probe_fb, &draw_engine_eevee_type, PROBE_CUBE_SIZE, PROBE_CUBE_SIZE, tex_probe, 2);
DRW_framebuffer_init(&sldata->probe_fb, &draw_engine_eevee_type, PROBE_CUBE_SIZE, PROBE_CUBE_SIZE, tex_probe, 2);
if (!txl->probe_pool) {
if (!sldata->probe_pool) {
/* TODO array */
txl->probe_pool = DRW_texture_create_2D(PROBE_SIZE, PROBE_SIZE, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
sldata->probe_pool = DRW_texture_create_2D(PROBE_SIZE, PROBE_SIZE, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
}
DRWFboTexture tex_filter = {&txl->probe_pool, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP};
DRWFboTexture tex_filter = {&sldata->probe_pool, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP};
DRW_framebuffer_init(&fbl->probe_filter_fb, &draw_engine_eevee_type, PROBE_SIZE, PROBE_SIZE, &tex_filter, 1);
DRW_framebuffer_init(&sldata->probe_filter_fb, &draw_engine_eevee_type, PROBE_SIZE, PROBE_SIZE, &tex_filter, 1);
/* Spherical Harmonic Buffer */
DRWFboTexture tex_sh = {&txl->probe_sh, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP};
DRWFboTexture tex_sh = {&sldata->probe_sh, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP};
DRW_framebuffer_init(&fbl->probe_sh_fb, &draw_engine_eevee_type, 9, 1, &tex_sh, 1);
DRW_framebuffer_init(&sldata->probe_sh_fb, &draw_engine_eevee_type, 9, 1, &tex_sh, 1);
}
void EEVEE_probes_cache_init(EEVEE_Data *vedata)
void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
{
EEVEE_StorageList *stl = vedata->stl;
EEVEE_TextureList *txl = vedata->txl;
EEVEE_PassList *psl = vedata->psl;
{
psl->probe_prefilter = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR);
struct Batch *geom = DRW_cache_fullscreen_quad_get();
DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.probe_filter_sh, psl->probe_prefilter, geom);
DRW_shgroup_uniform_float(grp, "sampleCount", &stl->probes->samples_ct, 1);
DRW_shgroup_uniform_float(grp, "invSampleCount", &stl->probes->invsamples_ct, 1);
DRW_shgroup_uniform_float(grp, "roughnessSquared", &stl->probes->roughness, 1);
DRW_shgroup_uniform_float(grp, "lodFactor", &stl->probes->lodfactor, 1);
DRW_shgroup_uniform_float(grp, "lodMax", &stl->probes->lodmax, 1);
DRW_shgroup_uniform_float(grp, "texelSize", &stl->probes->texel_size, 1);
DRW_shgroup_uniform_float(grp, "paddingSize", &stl->probes->padding_size, 1);
DRW_shgroup_uniform_int(grp, "Layer", &stl->probes->layer, 1);
DRW_shgroup_uniform_float(grp, "sampleCount", &sldata->probes->samples_ct, 1);
DRW_shgroup_uniform_float(grp, "invSampleCount", &sldata->probes->invsamples_ct, 1);
DRW_shgroup_uniform_float(grp, "roughnessSquared", &sldata->probes->roughness, 1);
DRW_shgroup_uniform_float(grp, "lodFactor", &sldata->probes->lodfactor, 1);
DRW_shgroup_uniform_float(grp, "lodMax", &sldata->probes->lodmax, 1);
DRW_shgroup_uniform_float(grp, "texelSize", &sldata->probes->texel_size, 1);
DRW_shgroup_uniform_float(grp, "paddingSize", &sldata->probes->padding_size, 1);
DRW_shgroup_uniform_int(grp, "Layer", &sldata->probes->layer, 1);
DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley);
// DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter);
DRW_shgroup_uniform_texture(grp, "probeHdr", txl->probe_rt);
DRW_shgroup_uniform_texture(grp, "probeHdr", sldata->probe_rt);
DRW_shgroup_call_dynamic_add_empty(grp);
}
@ -183,37 +175,33 @@ void EEVEE_probes_cache_init(EEVEE_Data *vedata)
psl->probe_sh_compute = DRW_pass_create("Probe SH Compute", DRW_STATE_WRITE_COLOR);
DRWShadingGroup *grp = DRW_shgroup_create(e_data.probe_spherical_harmonic_sh, psl->probe_sh_compute);
DRW_shgroup_uniform_int(grp, "probeSize", &stl->probes->shres, 1);
DRW_shgroup_uniform_float(grp, "lodBias", &stl->probes->lodfactor, 1);
DRW_shgroup_uniform_texture(grp, "probeHdr", txl->probe_rt);
DRW_shgroup_uniform_int(grp, "probeSize", &sldata->probes->shres, 1);
DRW_shgroup_uniform_float(grp, "lodBias", &sldata->probes->lodfactor, 1);
DRW_shgroup_uniform_texture(grp, "probeHdr", sldata->probe_rt);
struct Batch *geom = DRW_cache_fullscreen_quad_get();
DRW_shgroup_call_add(grp, geom, NULL);
}
}
void EEVEE_probes_cache_add(EEVEE_Data *UNUSED(vedata), Object *UNUSED(ob))
void EEVEE_probes_cache_add(EEVEE_SceneLayerData *UNUSED(sldata), Object *UNUSED(ob))
{
return;
}
void EEVEE_probes_cache_finish(EEVEE_Data *UNUSED(vedata))
void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *UNUSED(sldata))
{
return;
}
void EEVEE_probes_update(EEVEE_Data *UNUSED(vedata))
void EEVEE_probes_update(EEVEE_SceneLayerData *UNUSED(sldata))
{
return;
}
void EEVEE_refresh_probe(EEVEE_Data *vedata)
void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl)
{
EEVEE_FramebufferList *fbl = vedata->fbl;
EEVEE_TextureList *txl = vedata->txl;
EEVEE_PassList *psl = vedata->psl;
EEVEE_StorageList *stl = vedata->stl;
EEVEE_ProbesInfo *pinfo = stl->probes;
EEVEE_ProbesInfo *pinfo = sldata->probes;
float projmat[4][4];
@ -225,17 +213,17 @@ void EEVEE_refresh_probe(EEVEE_Data *vedata)
mul_m4_m4m4(pinfo->probemat[i], projmat, cubefacemat[i]);
}
DRW_framebuffer_bind(fbl->probe_fb);
DRW_framebuffer_bind(sldata->probe_fb);
DRW_draw_pass(psl->probe_background);
/* 2 - Let gpu create Mipmaps for Filtered Importance Sampling. */
/* Bind next framebuffer to be able to gen. mips for probe_rt. */
DRW_framebuffer_bind(fbl->probe_filter_fb);
DRW_texture_generate_mipmaps(txl->probe_rt);
DRW_framebuffer_bind(sldata->probe_filter_fb);
DRW_texture_generate_mipmaps(sldata->probe_rt);
/* 3 - Render to probe array to the specified layer, do prefiltering. */
/* Detach to rebind the right mipmap. */
DRW_framebuffer_texture_detach(txl->probe_pool);
DRW_framebuffer_texture_detach(sldata->probe_pool);
float mipsize = PROBE_SIZE;
const int maxlevel = (int)floorf(log2f(PROBE_SIZE));
const int min_lod_level = 3;
@ -279,10 +267,10 @@ void EEVEE_refresh_probe(EEVEE_Data *vedata)
pinfo->lodfactor = bias + 0.5f * log((float)(PROBE_CUBE_SIZE * PROBE_CUBE_SIZE) * pinfo->invsamples_ct) / log(2);
pinfo->lodmax = floorf(log2f(PROBE_CUBE_SIZE)) - 2.0f;
DRW_framebuffer_texture_attach(fbl->probe_filter_fb, txl->probe_pool, 0, i);
DRW_framebuffer_viewport_size(fbl->probe_filter_fb, mipsize, mipsize);
DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, i);
DRW_framebuffer_viewport_size(sldata->probe_filter_fb, mipsize, mipsize);
DRW_draw_pass(psl->probe_prefilter);
DRW_framebuffer_texture_detach(txl->probe_pool);
DRW_framebuffer_texture_detach(sldata->probe_pool);
mipsize /= 2;
CLAMP_MIN(mipsize, 1);
@ -290,13 +278,13 @@ void EEVEE_refresh_probe(EEVEE_Data *vedata)
/* For shading, save max level of the octahedron map */
pinfo->lodmax = (float)(maxlevel - min_lod_level) - 1.0f;
/* reattach to have a valid framebuffer. */
DRW_framebuffer_texture_attach(fbl->probe_filter_fb, txl->probe_pool, 0, 0);
DRW_framebuffer_texture_attach(sldata->probe_filter_fb, sldata->probe_pool, 0, 0);
/* 4 - Compute spherical harmonics */
/* Tweaking parameters to balance perf. vs precision */
pinfo->shres = 16; /* Less texture fetches & reduce branches */
pinfo->lodfactor = 4.0f; /* Improve cache reuse */
DRW_framebuffer_bind(fbl->probe_sh_fb);
DRW_framebuffer_bind(sldata->probe_sh_fb);
DRW_draw_pass(psl->probe_sh_compute);
DRW_framebuffer_read_data(0, 0, 9, 1, 3, 0, (float *)pinfo->shcoefs);
}
@ -306,4 +294,17 @@ void EEVEE_probes_free(void)
DRW_SHADER_FREE_SAFE(e_data.probe_filter_sh);
DRW_SHADER_FREE_SAFE(e_data.probe_spherical_harmonic_sh);
DRW_TEXTURE_FREE_SAFE(e_data.hammersley);
}
}
void EEVEE_scene_layer_probes_free(EEVEE_SceneLayerData *sldata)
{
MEM_SAFE_FREE(sldata->probes);
DRW_UBO_FREE_SAFE(sldata->probe_ubo);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_fb);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_filter_fb);
DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_sh_fb);
DRW_TEXTURE_FREE_SAFE(sldata->probe_rt);
DRW_TEXTURE_FREE_SAFE(sldata->probe_depth_rt);
DRW_TEXTURE_FREE_SAFE(sldata->probe_pool);
DRW_TEXTURE_FREE_SAFE(sldata->probe_sh);
}

View File

@ -175,6 +175,12 @@ void DRW_texture_free(struct GPUTexture *tex);
struct GPUUniformBuffer *DRW_uniformbuffer_create(int size, const void *data);
void DRW_uniformbuffer_update(struct GPUUniformBuffer *ubo, const void *data);
void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo);
#define DRW_UBO_FREE_SAFE(ubo) do { \
if (ubo != NULL) { \
DRW_uniformbuffer_free(ubo); \
ubo = NULL; \
} \
} while (0)
/* Buffers */
#define MAX_FBO_TEX 5
@ -188,7 +194,6 @@ typedef struct DRWFboTexture {
void DRW_framebuffer_init(
struct GPUFrameBuffer **fb, void *engine_type, int width, int height,
DRWFboTexture textures[MAX_FBO_TEX], int textures_len);
void DRW_framebuffer_free(struct GPUFrameBuffer *fb);
void DRW_framebuffer_bind(struct GPUFrameBuffer *fb);
void DRW_framebuffer_clear(bool color, bool depth, bool stencil, float clear_col[4], float clear_depth);
void DRW_framebuffer_read_data(int x, int y, int w, int h, int channels, int slot, float *data);
@ -196,6 +201,13 @@ void DRW_framebuffer_texture_attach(struct GPUFrameBuffer *fb, struct GPUTexture
void DRW_framebuffer_texture_detach(struct GPUTexture *tex);
void DRW_framebuffer_blit(struct GPUFrameBuffer *fb_read, struct GPUFrameBuffer *fb_write, bool depth);
void DRW_framebuffer_viewport_size(struct GPUFrameBuffer *UNUSED(fb_read), int w, int h);
void DRW_framebuffer_free(struct GPUFrameBuffer *fb);
#define DRW_FRAMEBUFFER_FREE_SAFE(fb) do { \
if (fb != NULL) { \
DRW_framebuffer_free(fb); \
fb = NULL; \
} \
} while (0)
void DRW_transform_to_display(struct GPUTexture *tex);