DRW: Do not update the view ubo for each pass
authorClément Foucault <foucault.clem@gmail.com>
Tue, 21 May 2019 20:11:53 +0000 (22:11 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Wed, 22 May 2019 11:29:05 +0000 (13:29 +0200)
Only update if the view changes.

source/blender/draw/intern/draw_manager.c
source/blender/draw/intern/draw_manager.h
source/blender/draw/intern/draw_manager_exec.c

index a86b8e9..c7256dd 100644 (file)
@@ -662,6 +662,7 @@ static void drw_viewport_var_init(void)
     }
 
     DST.view_active = DST.view_default;
+    DST.view_previous = NULL;
   }
   else {
     zero_v3(DST.screenvecs[0]);
@@ -670,6 +671,7 @@ static void drw_viewport_var_init(void)
     DST.pixsize = 1.0f;
     DST.view_default = NULL;
     DST.view_active = NULL;
+    DST.view_previous = NULL;
   }
 
   /* fclem: Is this still needed ? */
index 0ccffce..665cc6e 100644 (file)
@@ -323,6 +323,7 @@ typedef struct DRWManager {
 
   DRWView *view_default;
   DRWView *view_active;
+  DRWView *view_previous;
   uint primary_view_ct;
   /** TODO(fclem) Remove this. Only here to support
    * shaders without common_view_lib.glsl */
index 2687d0e..addd450 100644 (file)
@@ -981,7 +981,11 @@ static void drw_draw_pass_ex(DRWPass *pass,
   BLI_assert(DST.buffer_finish_called &&
              "DRW_render_instance_buffer_finish had not been called before drawing");
 
-  drw_update_view();
+  if (DST.view_previous != DST.view_active || DST.view_active->is_dirty) {
+    drw_update_view();
+    DST.view_active->is_dirty = false;
+    DST.view_previous = DST.view_active;
+  }
 
   /* GPU_framebuffer_clear calls can change the state outside the DRW module.
    * Force reset the affected states to avoid problems later. */