[Bf-blender-cvs] [6f7a64b57fc] master: GPencil: Create blank texture only once by engine

Antonio Vazquez noreply at git.blender.org
Wed Sep 18 20:56:24 CEST 2019


Commit: 6f7a64b57fcb235461146b6953ed7a30166c4a56
Author: Antonio Vazquez
Date:   Wed Sep 18 17:56:23 2019 +0200
Branches: master
https://developer.blender.org/rB6f7a64b57fcb235461146b6953ed7a30166c4a56

GPencil: Create blank texture only once by engine

This texture is used for missing textures as replace.

Differential Revision: https://developer.blender.org/D5845

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

M	source/blender/draw/engines/gpencil/gpencil_draw_utils.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_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index 19a28031ce0..4ff613b2714 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -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,
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index b2e8cef1db2..2c89b8fcdee 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -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);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 27d537c9a20..b014717e6f5 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -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,



More information about the Bf-blender-cvs mailing list