[Bf-blender-cvs] [7cdd5ed7bd2] master: DRW: Add unit_state to avoid lots of DRWCallState duplication

Clément Foucault noreply at git.blender.org
Thu May 30 13:45:55 CEST 2019


Commit: 7cdd5ed7bd228d46b5eecc3355b01d00f26d1ca2
Author: Clément Foucault
Date:   Thu May 30 00:36:54 2019 +0200
Branches: master
https://developer.blender.org/rB7cdd5ed7bd228d46b5eecc3355b01d00f26d1ca2

DRW: Add unit_state to avoid lots of DRWCallState duplication

A lot of drawcalls don't use the object's properties and don't
need a dedicated DRWCallState. We allocate a unique one at
the begining and use it for all calls that uses the default
unit matrix.

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

M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c

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

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 8897d14c5fd..bfb38a12fa9 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -587,6 +587,29 @@ static void drw_context_state_init(void)
   }
 }
 
+static DRWCallState *draw_unit_state_create(void)
+{
+  DRWCallState *state = BLI_memblock_alloc(DST.vmempool->states);
+  state->flag = 0;
+  state->matflag = 0;
+
+  unit_m4(state->model);
+  unit_m4(state->modelinverse);
+
+  copy_v3_fl(state->orcotexfac[0], 0.0f);
+  copy_v3_fl(state->orcotexfac[1], 1.0f);
+
+  state->ob_index = 0;
+  state->ob_random = 0.0f;
+
+  /* TODO(fclem) get rid of this. */
+  state->culling = BLI_memblock_alloc(DST.vmempool->cullstates);
+  state->culling->bsphere.radius = -1.0f;
+  state->culling->user_data = NULL;
+
+  return state;
+}
+
 /* It also stores viewport variable to an immutable place: DST
  * This is because a cache uniform only store reference
  * to its value. And we don't want to invalidate the cache
@@ -634,6 +657,9 @@ static void drw_viewport_var_init(void)
       DST.vmempool->images = BLI_memblock_create(sizeof(GPUTexture *));
     }
 
+    /* Alloc default unit state */
+    DST.unit_state = draw_unit_state_create();
+
     DST.idatalist = GPU_viewport_instance_data_list_get(DST.viewport);
     DRW_instance_data_list_reset(DST.idatalist);
   }
@@ -646,6 +672,8 @@ static void drw_viewport_var_init(void)
 
     DST.default_framebuffer = NULL;
     DST.vmempool = NULL;
+
+    DST.unit_state = NULL;
   }
 
   DST.primary_view_ct = 0;
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 6cf70f555eb..867d7132c20 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -283,6 +283,8 @@ typedef struct DRWManager {
   ViewportMemoryPool *vmempool;
   DRWInstanceDataList *idatalist;
   DRWInstanceData *object_instance_data[MAX_INSTANCE_DATA_SIZE];
+  /* Default Unit model matrix state without culling. */
+  DRWCallState *unit_state;
   /* State of the object being evaluated if already allocated. */
   DRWCallState *ob_state;
   struct DupliObject *dupli_source;
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 5aec14a3100..7ac7fdf1ff2 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -396,15 +396,10 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm
   state->matflag = 0;
 
   /* Matrices */
-  if (obmat != NULL) {
-    copy_m4_m4(state->model, obmat);
+  copy_m4_m4(state->model, obmat);
 
-    if (ob && (ob->transflag & OB_NEG_SCALE)) {
-      state->flag |= DRW_CALL_NEGSCALE;
-    }
-  }
-  else {
-    unit_m4(state->model);
+  if (ob && (ob->transflag & OB_NEG_SCALE)) {
+    state->flag |= DRW_CALL_NEGSCALE;
   }
 
   drw_call_state_update_matflag(state, shgroup, ob);
@@ -435,8 +430,8 @@ static DRWCallState *drw_call_state_object(DRWShadingGroup *shgroup, float (*obm
 {
   if (ob == NULL) {
     if (obmat == NULL) {
-      /* TODO return unitmat state. */
-      return drw_call_state_create(shgroup, obmat, ob);
+      BLI_assert(DST.unit_state);
+      return DST.unit_state;
     }
     else {
       return drw_call_state_create(shgroup, obmat, ob);



More information about the Bf-blender-cvs mailing list