Commit: 68eeb56104ddb30a61ae992b135a7067138b73da
Author: Antonio Vazquez
Date:   Sun Apr 8 11:21:04 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB68eeb56104ddb30a61ae992b135a7067138b73da

Refactor to reduce number of textures and framebuffers used

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

M       source/blender/draw/engines/gpencil/gpencil_depth_of_field.c
M       source/blender/draw/engines/gpencil/gpencil_engine.c
M       source/blender/draw/engines/gpencil/gpencil_engine.h

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_depth_of_field.c 
b/source/blender/draw/engines/gpencil/gpencil_depth_of_field.c
index a34fb9031fe..97708ea5620 100644
--- a/source/blender/draw/engines/gpencil/gpencil_depth_of_field.c
+++ b/source/blender/draw/engines/gpencil/gpencil_depth_of_field.c
@@ -212,8 +212,8 @@ void GPENCIL_depth_of_field_cache_init(GPENCIL_e_data 
*e_data, GPENCIL_Data *ved
                psl->dof_down = DRW_pass_create("DoF Downsample", 
DRW_STATE_WRITE_COLOR);
 
                grp = DRW_shgroup_create(e_data->gpencil_dof_downsample_sh, 
psl->dof_down);
-               DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", 
&e_data->input_color_tx);
-               DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", 
&e_data->input_depth_tx);
+               DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", 
&e_data->vfx_color_tx_a);
+               DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", 
&e_data->vfx_depth_tx_a);
                DRW_shgroup_uniform_vec2(grp, "nearFar", 
stl->storage->dof_near_far, 1);
                DRW_shgroup_uniform_vec3(grp, "dofParams", 
stl->storage->dof_params, 1);
                DRW_shgroup_call_add(grp, quad, NULL);
@@ -234,10 +234,10 @@ void GPENCIL_depth_of_field_cache_init(GPENCIL_e_data 
*e_data, GPENCIL_Data *ved
                psl->dof_resolve = DRW_pass_create("DoF Resolve", 
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
 
                grp = DRW_shgroup_create(e_data->gpencil_dof_resolve_sh, 
psl->dof_resolve);
-               DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", 
&e_data->input_color_tx);
+               DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", 
&e_data->vfx_color_tx_a);
                DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", 
&e_data->gpencil_dof_near_blur);
                DRW_shgroup_uniform_texture_ref(grp, "farBuffer", 
&e_data->gpencil_dof_far_blur);
-               DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", 
&e_data->input_depth_tx);
+               DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", 
&e_data->vfx_depth_tx_a);
                DRW_shgroup_uniform_texture_ref(grp, "weightBuffer", 
&e_data->gpencil_dof_weight);
                DRW_shgroup_uniform_vec2(grp, "nearFar", 
stl->storage->dof_near_far, 1);
                DRW_shgroup_uniform_vec3(grp, "dofParams", 
stl->storage->dof_params, 1);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 3e82c99ce14..1c8c4dbb79c 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -90,18 +90,6 @@ static void GPENCIL_create_framebuffers(void *vedata)
                const float *viewport_size = DRW_viewport_size_get();
                const int size[2] = { (int)viewport_size[0], 
(int)viewport_size[1] };
 
-               /* temp framebuffer to store all stroke drawing before sending 
to default or used
-               * by vfx shaders as initial input
-               */
-               e_data.temp_depth_tx = DRW_texture_pool_query_2D(size[0], 
size[1], DRW_TEX_DEPTH_24_STENCIL_8,
-                       &draw_engine_object_type);
-               e_data.temp_color_tx = DRW_texture_pool_query_2D(size[0], 
size[1], fb_format,
-                       &draw_engine_object_type);
-               GPU_framebuffer_ensure_config(&fbl->temp_fb, {
-                       GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx),
-                       GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx)
-                       });
-
                /* vfx (ping-pong textures) */
                e_data.vfx_depth_tx_a = DRW_texture_pool_query_2D(size[0], 
size[1], DRW_TEX_DEPTH_24_STENCIL_8,
                        &draw_engine_object_type);
@@ -437,21 +425,12 @@ static void GPENCIL_cache_init(void *vedata)
                DRWShadingGroup *mix_shgrp_noblend = 
DRW_shgroup_create(e_data.gpencil_fullscreen_sh, psl->mix_pass_noblend);
                stl->g_data->tot_sh++;
                DRW_shgroup_call_add(mix_shgrp_noblend, quad_noblend, NULL);
-               DRW_shgroup_uniform_texture_ref(mix_shgrp_noblend, 
"strokeColor", &e_data.input_color_tx);
-               DRW_shgroup_uniform_texture_ref(mix_shgrp_noblend, 
"strokeDepth", &e_data.input_depth_tx);
+               DRW_shgroup_uniform_texture_ref(mix_shgrp_noblend, 
"strokeColor", &e_data.vfx_color_tx_a);
+               DRW_shgroup_uniform_texture_ref(mix_shgrp_noblend, 
"strokeDepth", &e_data.vfx_depth_tx_a);
                DRW_shgroup_uniform_int(mix_shgrp_noblend, "tonemapping", 
&stl->storage->tonemapping, 1);
 
-               /* vfx setup pass to prepare txta */
-               struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get();
-               psl->vfx_setup_pass = DRW_pass_create("GPencil VFX setup Pass", 
DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
-               DRWShadingGroup *vfx_setup_shgrp = 
DRW_shgroup_create(e_data.gpencil_simple_fullscreen_sh, psl->vfx_setup_pass);
-               stl->g_data->tot_sh++;
-               DRW_shgroup_call_add(vfx_setup_shgrp, vfxquad, NULL);
-               DRW_shgroup_uniform_texture_ref(vfx_setup_shgrp, "strokeColor", 
&e_data.temp_color_tx);
-               DRW_shgroup_uniform_texture_ref(vfx_setup_shgrp, "strokeDepth", 
&e_data.temp_depth_tx);
-               
                /* vfx copy pass from txtb to txta */
-               vfxquad = DRW_cache_fullscreen_quad_get();
+               struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get();
                psl->vfx_copy_pass = DRW_pass_create("GPencil VFX Copy b to a 
Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
                DRWShadingGroup *vfx_copy_shgrp = 
DRW_shgroup_create(e_data.gpencil_simple_fullscreen_sh, psl->vfx_copy_pass);
                stl->g_data->tot_sh++;
@@ -629,19 +608,6 @@ static int gpencil_object_cache_compare_zdepth(const void 
*a1, const void *a2)
 */
 static void gpencil_vfx_passes(void *vedata, tGPencilObjectCache *cache)
 {
-       GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
-       GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
-       GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
-
-       /* Copy the original texture to tx_a to be used by all following vfx 
modifiers.
-       * At the end of this passes, we can be sure the vfx_fbcolor_color_tx_a 
texture has 
-       * the final image.
-       */
-       float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-       GPU_framebuffer_bind(fbl->vfx_fb_a);
-       GPU_framebuffer_clear_color_depth(fbl->vfx_fb_a, clearcol, 1.0f);
-       DRW_draw_pass(psl->vfx_setup_pass);
-
        /* draw all vfx passes */
        DRW_gpencil_vfx_draw(vedata, cache);
 }
@@ -729,9 +695,6 @@ static void GPENCIL_draw_scene(void *vedata)
 
        if (DRW_state_is_fbo()) {
                /* attach temp textures */
-               GPU_framebuffer_texture_attach(fbl->temp_fb, 
e_data.temp_depth_tx, 0, 0);
-               GPU_framebuffer_texture_attach(fbl->temp_fb, 
e_data.temp_color_tx, 0, 0);
-
                GPU_framebuffer_texture_attach(fbl->vfx_fb_a, 
e_data.vfx_depth_tx_a, 0, 0);
                GPU_framebuffer_texture_attach(fbl->vfx_fb_a, 
e_data.vfx_color_tx_a, 0, 0);
 
@@ -755,8 +718,8 @@ static void GPENCIL_draw_scene(void *vedata)
                                init_grp = cache->init_grp;
                                end_grp = cache->end_grp;
                                /* Render stroke in separated framebuffer */
-                               GPU_framebuffer_bind(fbl->temp_fb);
-                               GPU_framebuffer_clear_color_depth(fbl->temp_fb, 
clearcol, 1.0f);
+                               GPU_framebuffer_bind(fbl->vfx_fb_a);
+                               
GPU_framebuffer_clear_color_depth(fbl->vfx_fb_a, clearcol, 1.0f);
 
                                /* Stroke Pass: DRW_STATE_WRITE_COLOR | 
DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH
                                 * draw only a subset that usually start with a 
fill and end with stroke because the
@@ -781,18 +744,12 @@ static void GPENCIL_draw_scene(void *vedata)
 
                                /* vfx modifiers passes */
                                if ((gpencil_object_use_vfx(ob)) && 
(!stl->storage->simplify_vfx)) {
-                                       /* add vfx passes */
                                        gpencil_vfx_passes(vedata, cache);
-
-                                       e_data.input_depth_tx = 
e_data.vfx_depth_tx_a;
-                                       e_data.input_color_tx = 
e_data.vfx_color_tx_a;
-                               }
-                               else {
-                                       e_data.input_depth_tx = 
e_data.temp_depth_tx;
-                                       e_data.input_color_tx = 
e_data.temp_color_tx;
                                }
+                               e_data.input_depth_tx = e_data.vfx_depth_tx_a;
+                               e_data.input_color_tx = e_data.vfx_color_tx_a;
 
-#if 0 /* the reult is very low quality, disable while find a solution */
+#if 0 /* the result is very low quality, disable while find a solution */
                                /* depth of field effect
                                 * send always to tx_b because other textures 
can be in use. Remap input
                                 * textures too.
@@ -832,9 +789,6 @@ static void GPENCIL_draw_scene(void *vedata)
 
        /* detach temp textures */
        if (DRW_state_is_fbo()) {
-               GPU_framebuffer_texture_detach(fbl->temp_fb, 
e_data.temp_depth_tx);
-               GPU_framebuffer_texture_detach(fbl->temp_fb, 
e_data.temp_color_tx);
-
                GPU_framebuffer_texture_detach(fbl->vfx_fb_a, 
e_data.vfx_depth_tx_a);
                GPU_framebuffer_texture_detach(fbl->vfx_fb_a, 
e_data.vfx_color_tx_a);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h 
b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 020058a5395..a592b401063 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -56,7 +56,7 @@ struct Object;
 #define MULTISAMPLE_GP_SYNC_ENABLE(dfbl, fbl) { \
        if ((U.ogl_multisamples > 0) && (dfbl->multisample_fb != NULL)) { \
                DRW_stats_query_start("GP Multisample Blit"); \
-               GPU_framebuffer_blit(fbl->temp_fb, 0, dfbl->multisample_fb, 0, 
GPU_COLOR_BIT | GPU_DEPTH_BIT); \
+               GPU_framebuffer_blit(fbl->vfx_fb_a, 0, dfbl->multisample_fb, 0, 
GPU_COLOR_BIT | GPU_DEPTH_BIT); \
                GPU_framebuffer_bind(dfbl->multisample_fb); \
                DRW_stats_query_end(); \
        } \
@@ -65,8 +65,8 @@ struct Object;
 #define MULTISAMPLE_GP_SYNC_DISABLE(dfbl, fbl) { \
        if ((U.ogl_multisamples > 0) && (dfbl->multisample_fb != NULL)) { \
                DRW_stats_query_start("GP Multisample Resolve"); \
-               GPU_framebuffer_blit(dfbl->multisample_fb, 0, fbl->temp_fb, 0, 
GPU_COLOR_BIT | GPU_DEPTH_BIT); \
-               GPU_framebuffer_bind(fbl->temp_fb); \
+               GPU_framebuffer_blit(dfbl->multisample_fb, 0, fbl->vfx_fb_a, 0, 
GPU_COLOR_BIT | GPU_DEPTH_BIT); \
+               GPU_framebuffer_bind(fbl->vfx_fb_a); \
                DRW_stats_query_end(); \
        } \
 }
@@ -208,7 +208,6 @@ typedef struct GPENCIL_PassList {
        struct DRWPass *drawing_pass;
        struct DRWPass *mix_pass;
        struct DRWPass *mix_pass_noblend;
-       struct DRWPass *vfx_setup_pass;
        struct DRWPass *vfx_copy_pass;
        struct DRWPass *vfx_wave_pass;
        struct DRWPass *vfx_blur_pass;
@@ -227,7 +226,6 @@ typedef struct GPENCIL_PassList {
 
 typedef struct GPENCIL_FramebufferList {
        struct GPUFrameBuffer *main;
-       struct GPUFrameBuffer *temp_fb;
        struct GPUFrameBuffer *vfx_fb_a;
        struct GPUFrameBuffer *vfx_fb_b;
        struct GPUFrameBuffer *painting_fb;
@@ -307,10 +305,6 @@ typedef struct GPENCIL_e_data {
        struct GPUShader *gpencil_dof_scatter_sh;
        struct GPUShader *gpencil_dof_resolve_sh;
 
-       /* temp depth

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to