GPencil: Create blank texture only once by engine

This texture is used for missing textures as replace.

Differential Revision: https://developer.blender.org/D5845
This commit is contained in:
Antonio Vazquez 2019-09-18 17:56:23 +02:00
parent e7fde3a0f3
commit 6f7a64b57f
3 changed files with 30 additions and 21 deletions

View File

@ -414,7 +414,8 @@ static void set_wireframe_color(Object *ob,
}
/* create shading group for filling */
static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_Data *vedata,
static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_e_data *e_data,
GPENCIL_Data *vedata,
DRWPass *pass,
GPUShader *shader,
Object *ob,
@ -543,7 +544,7 @@ static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_Data *vedata,
}
else {
/* if no texture defined, need a blank texture to avoid errors in draw manager */
DRW_shgroup_uniform_texture(grp, "myTexture", stl->g_data->gpencil_blank_texture);
DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
stl->shgroups[id].texture_clamp = 0;
DRW_shgroup_uniform_int(grp, "texture_clamp", &stl->shgroups[id].texture_clamp, 1);
}
@ -563,7 +564,8 @@ bool gpencil_onion_active(bGPdata *gpd)
}
/* create shading group for strokes */
DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_Data *vedata,
DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_e_data *e_data,
GPENCIL_Data *vedata,
DRWPass *pass,
GPUShader *shader,
Object *ob,
@ -722,14 +724,15 @@ DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_Data *vedata,
}
else {
/* if no texture defined, need a blank texture to avoid errors in draw manager */
DRW_shgroup_uniform_texture(grp, "myTexture", stl->g_data->gpencil_blank_texture);
DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
}
return grp;
}
/* create shading group for points */
static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_Data *vedata,
static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_e_data *e_data,
GPENCIL_Data *vedata,
DRWPass *pass,
GPUShader *shader,
Object *ob,
@ -894,7 +897,7 @@ static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_Data *vedata,
}
else {
/* if no texture defined, need a blank texture to avoid errors in draw manager */
DRW_shgroup_uniform_texture(grp, "myTexture", stl->g_data->gpencil_blank_texture);
DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
}
return grp;
@ -1588,6 +1591,7 @@ void gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data,
if (gpd->runtime.sbuffer_used > 1) {
if ((gp_style) && (gp_style->mode == GP_STYLE_MODE_LINE)) {
stl->g_data->shgrps_drawing_stroke = gpencil_shgroup_stroke_create(
e_data,
vedata,
psl->drawing_pass,
e_data->gpencil_stroke_sh,
@ -1613,6 +1617,7 @@ void gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data,
}
else {
stl->g_data->shgrps_drawing_stroke = gpencil_shgroup_point_create(
e_data,
vedata,
psl->drawing_pass,
e_data->gpencil_point_sh,
@ -1800,7 +1805,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
case eGpencilBatchGroupType_Stroke: {
const int len = elm->vertex_idx - start_stroke;
shgrp = gpencil_shgroup_stroke_create(vedata,
shgrp = gpencil_shgroup_stroke_create(e_data,
vedata,
stroke_pass,
e_data->gpencil_stroke_sh,
ob,
@ -1838,7 +1844,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
case eGpencilBatchGroupType_Point: {
const int len = elm->vertex_idx - start_point;
shgrp = gpencil_shgroup_point_create(vedata,
shgrp = gpencil_shgroup_point_create(e_data,
vedata,
stroke_pass,
e_data->gpencil_point_sh,
ob,
@ -1865,7 +1872,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
case eGpencilBatchGroupType_Fill: {
const int len = elm->vertex_idx - start_fill;
shgrp = gpencil_shgroup_fill_create(vedata,
shgrp = gpencil_shgroup_fill_create(e_data,
vedata,
stroke_pass,
e_data->gpencil_fill_sh,
ob,

View File

@ -178,6 +178,12 @@ static void GPENCIL_create_framebuffers(void *vedata)
static void GPENCIL_create_shaders(void)
{
/* blank texture used if no texture defined for fill shader */
if (!e_data.gpencil_blank_texture) {
float rect[1][1][4] = {{{0.0f}}};
e_data.gpencil_blank_texture = DRW_texture_create_2d(
1, 1, GPU_RGBA8, DRW_TEX_FILTER, (float *)rect);
}
/* normal fill shader */
if (!e_data.gpencil_fill_sh) {
e_data.gpencil_fill_sh = GPU_shader_create_from_arrays({
@ -293,6 +299,8 @@ static void GPENCIL_engine_free(void)
DRW_SHADER_FREE_SAFE(e_data.gpencil_background_sh);
DRW_SHADER_FREE_SAFE(e_data.gpencil_paper_sh);
DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
/* effects */
GPENCIL_delete_fx_shaders(&e_data);
}
@ -338,17 +346,11 @@ void GPENCIL_cache_init(void *vedata)
stl->g_data->shgrps_edit_point = NULL;
/* reset textures */
stl->g_data->gpencil_blank_texture = NULL;
stl->g_data->batch_buffer_stroke = NULL;
stl->g_data->batch_buffer_fill = NULL;
stl->g_data->batch_buffer_ctrlpoint = NULL;
stl->g_data->batch_grid = NULL;
/* blank texture used if no texture defined for fill shader */
float rect[1][1][4] = {{{0.0f}}};
stl->g_data->gpencil_blank_texture = DRW_texture_create_2d(
1, 1, GPU_RGBA8, DRW_TEX_FILTER, (float *)rect);
if (!stl->shgroups) {
/* Alloc maximum size because count strokes is very slow and can be very complex due onion
* skinning.
@ -789,8 +791,6 @@ void DRW_gpencil_free_runtime_data(void *ved)
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
/* free gpu data */
DRW_TEXTURE_FREE_SAFE(stl->g_data->gpencil_blank_texture);
GPU_BATCH_DISCARD_SAFE(stl->g_data->batch_buffer_stroke);
MEM_SAFE_FREE(stl->g_data->batch_buffer_stroke);

View File

@ -265,9 +265,6 @@ typedef struct g_data {
/* grid geometry */
GPUBatch *batch_grid;
/* textures */
struct GPUTexture *gpencil_blank_texture;
/* runtime pointers texture */
struct GPUTexture *input_depth_tx;
struct GPUTexture *input_color_tx;
@ -297,6 +294,9 @@ typedef enum eGPsession_Flag {
} eGPsession_Flag;
typedef struct GPENCIL_e_data {
/* textures */
struct GPUTexture *gpencil_blank_texture;
/* general drawing shaders */
struct GPUShader *gpencil_fill_sh;
struct GPUShader *gpencil_stroke_sh;
@ -386,7 +386,8 @@ typedef struct GpencilBatchCache {
} GpencilBatchCache;
/* general drawing functions */
struct DRWShadingGroup *gpencil_shgroup_stroke_create(struct GPENCIL_Data *vedata,
struct DRWShadingGroup *gpencil_shgroup_stroke_create(struct GPENCIL_e_data *e_data,
struct GPENCIL_Data *vedata,
struct DRWPass *pass,
struct GPUShader *shader,
struct Object *ob,