diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_effects.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_effects.c | 142 |
1 files changed, 65 insertions, 77 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 1030fe1ce3a..d7fa9e76370 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -105,6 +105,7 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_TextureList *txl = vedata->txl; EEVEE_EffectsInfo *effects; + DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); ViewLayer *view_layer = draw_ctx->view_layer; @@ -141,31 +142,45 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object * Ping Pong buffer */ if ((effects->enabled_effects & EFFECT_POST_BUFFER) != 0) { - DRWFboTexture tex = {&txl->color_post, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}; - DRW_framebuffer_init(&fbl->effect_fb, &draw_engine_eevee_type, - (int)viewport_size[0], (int)viewport_size[1], - &tex, 1); + DRW_texture_ensure_fullscreen_2D(&txl->color_post, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP); + + GPU_framebuffer_ensure_config(&fbl->effect_fb, { + GPU_ATTACHMENT_TEXTURE(dtxl->depth), + GPU_ATTACHMENT_TEXTURE(txl->color_post), + }); + + GPU_framebuffer_ensure_config(&fbl->effect_color_fb, { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->color_post), + }); } else { /* Cleanup to release memory */ DRW_TEXTURE_FREE_SAFE(txl->color_post); - DRW_FRAMEBUFFER_FREE_SAFE(fbl->effect_fb); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->effect_fb); } /** * MinMax Pyramid */ - DRWFboTexture texmax = {&txl->maxzbuffer, DRW_TEX_DEPTH_24, DRW_TEX_MIPMAP}; + int size[2] = {(int)viewport_size[0], (int)viewport_size[1]}; + size[0] = max_ii(size[0] / 2, 1); + size[1] = max_ii(size[1] / 2, 1); if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) { /* Intel gpu seems to have problem rendering to only depth format */ - texmax.format = DRW_TEX_R_32; + DRW_texture_ensure_2D(&txl->maxzbuffer, size[0], size[1], DRW_TEX_R_32, DRW_TEX_MIPMAP); + GPU_framebuffer_ensure_config(&fbl->downsample_fb, { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->maxzbuffer) + }); + } + else { + DRW_texture_ensure_2D(&txl->maxzbuffer, size[0], size[1], DRW_TEX_DEPTH_24, DRW_TEX_MIPMAP); + GPU_framebuffer_ensure_config(&fbl->downsample_fb, { + GPU_ATTACHMENT_TEXTURE(txl->maxzbuffer) + }); } - - DRW_framebuffer_init(&fbl->downsample_fb, &draw_engine_eevee_type, - max_ii((int)viewport_size[0] / 2, 1), max_ii((int)viewport_size[1] / 2, 1), - &texmax, 1); - /** * Compute Mipmap texel alignement. @@ -185,34 +200,37 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object * Normal buffer for deferred passes. */ if ((effects->enabled_effects & EFFECT_NORMAL_BUFFER) != 0) { - if (txl->ssr_normal_input == NULL) { - DRWTextureFormat nor_format = DRW_TEX_RG_16; - txl->ssr_normal_input = DRW_texture_create_2D((int)viewport_size[0], (int)viewport_size[1], nor_format, 0, NULL); - } + int size_fs[2] = {(int)viewport_size[0], (int)viewport_size[1]}; + + effects->ssr_normal_input = DRW_texture_pool_query_2D(size_fs[0], size_fs[1], DRW_TEX_RG_16, + &draw_engine_eevee_type); - /* Reattach textures to the right buffer (because we are alternating between buffers) */ - /* TODO multiple FBO per texture!!!! */ - DRW_framebuffer_texture_detach(txl->ssr_normal_input); - DRW_framebuffer_texture_attach(fbl->main, txl->ssr_normal_input, 1, 0); + GPU_framebuffer_texture_attach(fbl->main_fb, effects->ssr_normal_input, 1, 0); } else { - /* Cleanup to release memory */ - DRW_TEXTURE_FREE_SAFE(txl->ssr_normal_input); + effects->ssr_normal_input = NULL; } /** * Setup double buffer so we can access last frame as it was before post processes. */ if ((effects->enabled_effects & EFFECT_DOUBLE_BUFFER) != 0) { - DRWFboTexture tex_double_buffer = {&txl->color_double_buffer, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}; - DRW_framebuffer_init(&fbl->double_buffer, &draw_engine_eevee_type, - (int)viewport_size[0], (int)viewport_size[1], - &tex_double_buffer, 1); + DRW_texture_ensure_fullscreen_2D(&txl->color_double_buffer, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP); + + GPU_framebuffer_ensure_config(&fbl->double_buffer_fb, { + GPU_ATTACHMENT_TEXTURE(dtxl->depth), + GPU_ATTACHMENT_TEXTURE(txl->color_double_buffer) + }); + + GPU_framebuffer_ensure_config(&fbl->double_buffer_color_fb, { + GPU_ATTACHMENT_NONE, + GPU_ATTACHMENT_TEXTURE(txl->color_double_buffer) + }); } else { /* Cleanup to release memory */ DRW_TEXTURE_FREE_SAFE(txl->color_double_buffer); - DRW_FRAMEBUFFER_FREE_SAFE(fbl->double_buffer); + GPU_FRAMEBUFFER_FREE_SAFE(fbl->double_buffer_fb); } } @@ -253,53 +271,24 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) /* Perform min/max downsample */ DRWShadingGroup *grp; -#if 0 /* Not used for now */ - psl->minz_downlevel_ps = DRW_pass_create("HiZ Min Down Level", downsample_write | DRW_STATE_DEPTH_ALWAYS); - grp = DRW_shgroup_create(e_data.minz_downlevel_sh, psl->minz_downlevel_ps); - DRW_shgroup_uniform_buffer(grp, "depthBuffer", &stl->g_data->minzbuffer); - DRW_shgroup_call_add(grp, quad, NULL); -#endif - psl->maxz_downlevel_ps = DRW_pass_create("HiZ Max Down Level", downsample_write | DRW_STATE_DEPTH_ALWAYS); grp = DRW_shgroup_create(e_data.maxz_downlevel_sh, psl->maxz_downlevel_ps); DRW_shgroup_uniform_buffer(grp, "depthBuffer", &txl->maxzbuffer); DRW_shgroup_call_add(grp, quad, NULL); /* Copy depth buffer to halfres top level of HiZ */ -#if 0 /* Not used for now */ - psl->minz_downdepth_ps = DRW_pass_create("HiZ Min Copy Depth Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS); - grp = DRW_shgroup_create(e_data.minz_downdepth_sh, psl->minz_downdepth_ps); - DRW_shgroup_uniform_buffer(grp, "depthBuffer", &e_data.depth_src); - DRW_shgroup_call_add(grp, quad, NULL); -#endif psl->maxz_downdepth_ps = DRW_pass_create("HiZ Max Copy Depth Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS); grp = DRW_shgroup_create(e_data.maxz_downdepth_sh, psl->maxz_downdepth_ps); DRW_shgroup_uniform_buffer(grp, "depthBuffer", &e_data.depth_src); DRW_shgroup_call_add(grp, quad, NULL); -#if 0 /* Not used for now */ - psl->minz_downdepth_layer_ps = DRW_pass_create("HiZ Min Copy DepthLayer Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS); - grp = DRW_shgroup_create(e_data.minz_downdepth_layer_sh, psl->minz_downdepth_layer_ps); - DRW_shgroup_uniform_buffer(grp, "depthBuffer", &e_data.depth_src); - DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1); - DRW_shgroup_call_add(grp, quad, NULL); -#endif - psl->maxz_downdepth_layer_ps = DRW_pass_create("HiZ Max Copy DepthLayer Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS); grp = DRW_shgroup_create(e_data.maxz_downdepth_layer_sh, psl->maxz_downdepth_layer_ps); DRW_shgroup_uniform_buffer(grp, "depthBuffer", &e_data.depth_src); DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1); DRW_shgroup_call_add(grp, quad, NULL); - /* Copy depth buffer to halfres top level of HiZ */ -#if 0 /* Not used for now */ - psl->minz_copydepth_ps = DRW_pass_create("HiZ Min Copy Depth Fullres", downsample_write | DRW_STATE_DEPTH_ALWAYS); - grp = DRW_shgroup_create(e_data.minz_copydepth_sh, psl->minz_copydepth_ps); - DRW_shgroup_uniform_buffer(grp, "depthBuffer", &e_data.depth_src); - DRW_shgroup_call_add(grp, quad, NULL); -#endif - psl->maxz_copydepth_ps = DRW_pass_create("HiZ Max Copy Depth Fullres", downsample_write | DRW_STATE_DEPTH_ALWAYS); grp = DRW_shgroup_create(e_data.maxz_copydepth_sh, psl->maxz_copydepth_ps); DRW_shgroup_uniform_buffer(grp, "depthBuffer", &e_data.depth_src); @@ -346,64 +335,67 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int l #if 0 /* Not required for now */ DRW_stats_group_start("Min buffer"); /* Copy depth buffer to min texture top level */ - DRW_framebuffer_texture_attach(fbl->downsample_fb, stl->g_data->minzbuffer, 0, 0); - DRW_framebuffer_bind(fbl->downsample_fb); + GPU_framebuffer_texture_attach(fbl->downsample_fb, stl->g_data->minzbuffer, 0, 0); + GPU_framebuffer_bind(fbl->downsample_fb); if (layer >= 0) { DRW_draw_pass(psl->minz_downdepth_layer_ps); } else { DRW_draw_pass(psl->minz_downdepth_ps); } - DRW_framebuffer_texture_detach(stl->g_data->minzbuffer); + GPU_framebuffer_texture_detach(stl->g_data->minzbuffer); /* Create lower levels */ - DRW_framebuffer_recursive_downsample(fbl->downsample_fb, stl->g_data->minzbuffer, 8, &min_downsample_cb, vedata); + GPU_framebuffer_recursive_downsample(fbl->downsample_fb, stl->g_data->minzbuffer, 8, &min_downsample_cb, vedata); DRW_stats_group_end(); #endif DRW_stats_group_start("Max buffer"); /* Copy depth buffer to max texture top level */ - DRW_framebuffer_texture_attach(fbl->downsample_fb, txl->maxzbuffer, 0, 0); - DRW_framebuffer_bind(fbl->downsample_fb); + GPU_framebuffer_texture_attach(fbl->downsample_fb, txl->maxzbuffer, 0, 0); + GPU_framebuffer_bind(fbl->downsample_fb); if (layer >= 0) { DRW_draw_pass(psl->maxz_downdepth_layer_ps); } else { DRW_draw_pass(psl->maxz_downdepth_ps); } - DRW_framebuffer_texture_detach(txl->maxzbuffer); /* Create lower levels */ - DRW_framebuffer_recursive_downsample(fbl->downsample_fb, txl->maxzbuffer, 8, &max_downsample_cb, vedata); + GPU_framebuffer_recursive_downsample(fbl->downsample_fb, 8, &max_downsample_cb, vedata); DRW_stats_group_end(); /* Restore */ - DRW_framebuffer_bind(fbl->main); + GPU_framebuffer_bind(fbl->main_fb); } /** * Simple downsampling algorithm. Reconstruct mip chain up to mip level. **/ -void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUFrameBuffer *fb_src, GPUTexture *texture_src, int level) +void EEVEE_downsample_buffer(EEVEE_Data *vedata, GPUTexture *texture_src, int level) { + EEVEE_FramebufferList *fbl = vedata->fbl; e_data.color_src = texture_src; - DRW_stats_group_start("Downsample buffer"); /* Create lower levels */ - DRW_framebuffer_recursive_downsample(fb_src, texture_src, level, &simple_downsample_cb, vedata); + DRW_stats_group_start("Downsample buffer"); + GPU_framebuffer_texture_attach(fbl->downsample_fb, texture_src, 0, 0); + GPU_framebuffer_recursive_downsample(fbl->downsample_fb, level, &simple_downsample_cb, vedata); DRW_stats_group_end(); } /** * Simple downsampling algorithm for cubemap. Reconstruct mip chain up to mip level. **/ -void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUFrameBuffer *fb_src, GPUTexture *texture_src, int level) +void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, GPUTexture *texture_src, int level) { + EEVEE_FramebufferList *fbl = vedata->fbl; e_data.color_src = texture_src; - DRW_stats_group_start("Downsample Cube buffer"); /* Create lower levels */ - DRW_framebuffer_recursive_downsample(fb_src, texture_src, level, &simple_downsample_cube_cb, vedata); + DRW_stats_group_start("Downsample Cube buffer"); + GPU_framebuffer_texture_attach(fbl->downsample_fb, texture_src, 0, 0); + GPU_framebuffer_recursive_downsample(fbl->downsample_fb, level, &simple_downsample_cube_cb, vedata); DRW_stats_group_end(); } @@ -413,21 +405,17 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_StorageList *stl = vedata->stl; EEVEE_EffectsInfo *effects = stl->effects; - DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); /* only once per frame after the first post process */ effects->swap_double_buffer = ((effects->enabled_effects & EFFECT_DOUBLE_BUFFER) != 0); /* Init pointers */ effects->source_buffer = txl->color; /* latest updated texture */ - effects->target_buffer = fbl->effect_fb; /* next target to render to */ + effects->target_buffer = fbl->effect_color_fb; /* next target to render to */ /* Temporal Anti-Aliasing MUST come first */ EEVEE_temporal_sampling_draw(vedata); - /* Detach depth for effects to use it */ - DRW_framebuffer_texture_detach(dtxl->depth); - /* Post process stack (order matters) */ EEVEE_motion_blur_draw(vedata); EEVEE_depth_of_field_draw(vedata); @@ -435,7 +423,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) /* Save the final texture and framebuffer for final transformation or read. */ effects->final_tx = effects->source_buffer; - effects->final_fb = (effects->target_buffer != fbl->main) ? fbl->main : fbl->effect_fb; + effects->final_fb = (effects->target_buffer != fbl->main_fb) ? fbl->main_fb : fbl->effect_fb; /* If no post processes is enabled, buffers are still not swapped, do it now. */ SWAP_DOUBLE_BUFFERS(); |