[Bf-blender-cvs] [f05b9dba266] master: DRW: Only change VAO if geometry changes

Clément Foucault noreply at git.blender.org
Wed May 22 13:31:01 CEST 2019


Commit: f05b9dba26607c319fa2246ec915490f10ca86e6
Author: Clément Foucault
Date:   Wed May 22 13:27:43 2019 +0200
Branches: master
https://developer.blender.org/rBf05b9dba26607c319fa2246ec915490f10ca86e6

DRW: Only change VAO if geometry changes

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

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

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

diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 69de4485b5c..6cf70f555eb 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -293,6 +293,7 @@ typedef struct DRWManager {
 
   /* Rendering state */
   GPUShader *shader;
+  GPUBatch *batch;
 
   /* Managed by `DRW_state_set`, `DRW_state_reset` */
   DRWState state;
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 05356740041..7c53d8f4fff 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -587,18 +587,22 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call)
   }
 }
 
-static void draw_geometry_execute(DRWShadingGroup *shgroup,
-                                  GPUBatch *geom,
-                                  uint vert_first,
-                                  uint vert_count,
-                                  uint inst_first,
-                                  uint inst_count)
+BLI_INLINE void draw_geometry_execute(DRWShadingGroup *shgroup,
+                                      GPUBatch *geom,
+                                      uint vert_first,
+                                      uint vert_count,
+                                      uint inst_first,
+                                      uint inst_count)
 {
   /* bind vertex array */
-  GPU_batch_program_set_no_use(
-      geom, GPU_shader_get_program(shgroup->shader), GPU_shader_get_interface(shgroup->shader));
+  if (DST.batch != geom) {
+    DST.batch = geom;
 
-  GPU_batch_bind(geom);
+    GPU_batch_program_set_no_use(
+        geom, GPU_shader_get_program(shgroup->shader), GPU_shader_get_interface(shgroup->shader));
+
+    GPU_batch_bind(geom);
+  }
 
   /* XXX hacking gawain. we don't want to call glUseProgram! (huge performance loss) */
   geom->program_in_use = true;
@@ -898,6 +902,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
     }
     GPU_shader_bind(shgroup->shader);
     DST.shader = shgroup->shader;
+    DST.batch = NULL;
   }
 
   if (shgroup->tfeedback_target != NULL) {



More information about the Bf-blender-cvs mailing list