GP: Create Framebuffer textures only if needed

Now, if there aren't grease pencil objects, the textures and framebuffers are not created. This unload GPU Memory when not using GP.
This commit is contained in:
Antonio Vazquez 2018-12-13 11:51:17 +01:00
parent 715ab529f1
commit 6c39ea27c8
2 changed files with 76 additions and 49 deletions

View File

@ -115,59 +115,66 @@ static void GPENCIL_create_framebuffers(void *vedata)
const int size[2] = { (int)viewport_size[0], (int)viewport_size[1] };
/* create multiframe framebuffer for AA */
if (stl->storage->multisamples > 0) {
if ((stl->storage->framebuffer_flag & GP_FRAMEBUFFER_MULTISAMPLE) &&
(stl->storage->multisamples > 0))
{
DRW_gpencil_multisample_ensure(vedata, size[0], size[1]);
}
/* temp textures */
e_data.temp_depth_tx_a = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.temp_color_tx_a = DRW_texture_pool_query_2D(size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->temp_fb_a, {
GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_a),
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_a)
});
/* Framebufers for basic object drawing */
if (stl->storage->framebuffer_flag & GP_FRAMEBUFFER_BASIC) {
/* temp textures for ping-pong buffers */
e_data.temp_depth_tx_a = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.temp_color_tx_a = DRW_texture_pool_query_2D(size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->temp_fb_a, {
GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_a),
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_a)
});
e_data.temp_depth_tx_b = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.temp_color_tx_b = DRW_texture_pool_query_2D(
size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->temp_fb_b, {
GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_b),
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_b)
});
e_data.temp_depth_tx_b = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.temp_color_tx_b = DRW_texture_pool_query_2D(
size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->temp_fb_b, {
GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_b),
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_b)
});
/* used for rim and shadow FX effects */
e_data.temp_depth_tx_fx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.temp_color_tx_fx = DRW_texture_pool_query_2D(
size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->temp_fb_fx, {
GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_fx),
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_fx),
});
/* used for FX effects and Layer blending */
e_data.temp_depth_tx_fx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.temp_color_tx_fx = DRW_texture_pool_query_2D(
size[0], size[1], fb_format,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->temp_fb_fx, {
GPU_ATTACHMENT_TEXTURE(e_data.temp_depth_tx_fx),
GPU_ATTACHMENT_TEXTURE(e_data.temp_color_tx_fx),
});
}
/* background framebuffer to speed up drawing process (always 16 bits) */
e_data.background_depth_tx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.background_color_tx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_RGBA32F,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->background_fb, {
GPU_ATTACHMENT_TEXTURE(e_data.background_depth_tx),
GPU_ATTACHMENT_TEXTURE(e_data.background_color_tx)
});
if (stl->storage->framebuffer_flag & GP_FRAMEBUFFER_DRAW) {
e_data.background_depth_tx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_DEPTH_COMPONENT24,
&draw_engine_gpencil_type);
e_data.background_color_tx = DRW_texture_pool_query_2D(
size[0], size[1], GPU_RGBA32F,
&draw_engine_gpencil_type);
GPU_framebuffer_ensure_config(
&fbl->background_fb, {
GPU_ATTACHMENT_TEXTURE(e_data.background_depth_tx),
GPU_ATTACHMENT_TEXTURE(e_data.background_color_tx)
});
}
}
}
@ -250,9 +257,6 @@ void GPENCIL_engine_init(void *vedata)
stl->storage->multisamples = U.gpencil_multisamples;
/* create framebuffers */
GPENCIL_create_framebuffers(vedata);
/* create shaders */
GPENCIL_create_shaders();
GPENCIL_create_fx_shaders(&e_data);
@ -564,6 +568,10 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
if (ob->type == OB_GPENCIL && ob->data) {
bGPdata *gpd = (bGPdata *)ob->data;
/* enable multisample and basic framebuffer creation */
stl->storage->framebuffer_flag |= GP_FRAMEBUFFER_MULTISAMPLE;
stl->storage->framebuffer_flag |= GP_FRAMEBUFFER_BASIC;
/* when start/stop animation the cache must be set as dirty to reset all data */
if (stl->storage->reset_cache) {
gpd->flag |= GP_DATA_CACHE_IS_DIRTY;
@ -622,7 +630,18 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
void GPENCIL_cache_finish(void *vedata)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
/* draw particles */
DRW_gpencil_populate_particles(&e_data, vedata);
if (stl->g_data->session_flag & (GP_DRW_PAINT_IDLE | GP_DRW_PAINT_FILLING)) {
stl->storage->framebuffer_flag |= GP_FRAMEBUFFER_DRAW;
}
/* create framebuffers */
GPENCIL_create_framebuffers(vedata);
}
/* helper function to sort inverse gpencil objects using qsort */

View File

@ -138,6 +138,8 @@ typedef struct GPENCIL_Storage {
int tonemapping;
short multisamples;
short framebuffer_flag; /* flag what framebuffer need to create */
int blend_mode;
int clamp_layer;
float blend_opacity;
@ -159,6 +161,12 @@ typedef struct GPENCIL_Storage {
Object *camera; /* camera pointer for render mode */
} GPENCIL_Storage;
typedef enum eGpencilFramebuffer_Flag {
GP_FRAMEBUFFER_MULTISAMPLE = (1 << 0),
GP_FRAMEBUFFER_BASIC = (1 << 1),
GP_FRAMEBUFFER_DRAW = (1 << 2),
} eGpencilFramebuffer_Flag;
typedef struct GPENCIL_StorageList {
struct GPENCIL_Storage *storage;
struct g_data *g_data;