[Bf-blender-cvs] [e0a0f1cbe00] tmp-overlay-engine: DRW: Fix an issue with instanced rendering and base_instance

Clément Foucault noreply at git.blender.org
Sun Nov 24 02:02:50 CET 2019


Commit: e0a0f1cbe0052402171a8de40eef005fd8e5c957
Author: Clément Foucault
Date:   Thu Nov 21 17:23:35 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBe0a0f1cbe0052402171a8de40eef005fd8e5c957

DRW: Fix an issue with instanced rendering and base_instance

Batches that are meant to be drawn with instancing cannot use ModelMatrix
indexing and must rely on the uniform (legacy) way.

Using the BaseInstance indexing would shift the instance attributes
received by the vertex shader which is not what we want in this case.

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

M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/intern/shaders/common_view_lib.glsl

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

diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index a89ea107470..d9ef9f3a2c8 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -572,7 +572,7 @@ GPUShader *OVERLAY_shader_edit_mesh_normal(void)
                                  datatoc_edit_mesh_normal_vert_glsl,
                                  NULL},
         .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
-        .defs = (const char *[]){sh_cfg->def, "#define IN_PLACE_INSTANCES\n", NULL},
+        .defs = (const char *[]){sh_cfg->def, "#define INSTANCED_ATTRIB\n", NULL},
     });
   }
   return sh_data->edit_mesh_normals;
@@ -1117,7 +1117,7 @@ GPUShader *OVERLAY_shader_particle_shape(void)
                                  datatoc_particle_vert_glsl,
                                  NULL},
         .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
-        .defs = (const char *[]){sh_cfg->def, "#define IN_PLACE_INSTANCES\n", NULL},
+        .defs = (const char *[]){sh_cfg->def, "#define INSTANCED_ATTRIB\n", NULL},
     });
   }
   return sh_data->particle_shape;
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 069fbc2992a..3be6af22efe 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -430,11 +430,12 @@ void DRW_shgroup_call_range(DRWShadingGroup *shgroup,
 void DRW_shgroup_call_procedural_points(DRWShadingGroup *sh, Object *ob, uint point_ct);
 void DRW_shgroup_call_procedural_lines(DRWShadingGroup *sh, Object *ob, uint line_ct);
 void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *sh, Object *ob, uint tri_ct);
-
+/* Warning: Only use with Shaders that have IN_PLACE_INSTANCES defined. */
 void DRW_shgroup_call_instances(DRWShadingGroup *shgroup,
                                 Object *ob,
                                 struct GPUBatch *geom,
                                 uint count);
+/* Warning: Only use with Shaders that have INSTANCED_ATTRIB defined. */
 void DRW_shgroup_call_instances_with_attribs(DRWShadingGroup *shgroup,
                                              Object *ob,
                                              struct GPUBatch *geom,
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index ce8155dc85f..f4d830222e8 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -208,6 +208,7 @@ typedef struct DRWCommandDrawInstance {
   GPUBatch *batch;
   DRWResourceHandle handle;
   uint inst_count;
+  uint use_attribs; /* bool */
 } DRWCommandDrawInstance;
 
 typedef struct DRWCommandDrawProcedural {
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 8500fa9463c..84262b5d892 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -643,12 +643,14 @@ static void drw_command_draw_range(DRWShadingGroup *shgroup,
 static void drw_command_draw_instance(DRWShadingGroup *shgroup,
                                       GPUBatch *batch,
                                       DRWResourceHandle handle,
-                                      uint count)
+                                      uint count,
+                                      bool use_attrib)
 {
   DRWCommandDrawInstance *cmd = drw_command_create(shgroup, DRW_CMD_DRAW_INSTANCE);
   cmd->batch = batch;
   cmd->handle = handle;
   cmd->inst_count = count;
+  cmd->use_attribs = use_attrib;
 }
 
 static void drw_command_draw_procedural(DRWShadingGroup *shgroup,
@@ -788,7 +790,7 @@ void DRW_shgroup_call_instances(DRWShadingGroup *shgroup,
     drw_command_set_select_id(shgroup, NULL, DST.select_id);
   }
   DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->obmat : NULL, ob);
-  drw_command_draw_instance(shgroup, geom, handle, count);
+  drw_command_draw_instance(shgroup, geom, handle, count, false);
 }
 
 void DRW_shgroup_call_instances_with_attribs(DRWShadingGroup *shgroup,
@@ -803,7 +805,7 @@ void DRW_shgroup_call_instances_with_attribs(DRWShadingGroup *shgroup,
   }
   DRWResourceHandle handle = drw_resource_handle(shgroup, ob ? ob->obmat : NULL, ob);
   GPUBatch *batch = DRW_temp_batch_instance_request(DST.idatalist, NULL, inst_attributes, geom);
-  drw_command_draw(shgroup, batch, handle);
+  drw_command_draw_instance(shgroup, batch, handle, 0, true);
 }
 
 #define SCULPT_DEBUG_BUFFERS (G.debug_value == 889)
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 3ecf2ce1f92..d313568e2e2 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1106,7 +1106,8 @@ static void draw_call_single_do(DRWShadingGroup *shgroup,
                                 DRWResourceHandle handle,
                                 int vert_first,
                                 int vert_count,
-                                int inst_count)
+                                int inst_count,
+                                bool do_base_instance)
 {
   draw_call_batching_flush(shgroup, state);
 
@@ -1133,7 +1134,7 @@ static void draw_call_single_do(DRWShadingGroup *shgroup,
                         batch,
                         vert_first,
                         vert_count,
-                        DRW_handle_id_get(&handle),
+                        do_base_instance ? DRW_handle_id_get(&handle) : 0,
                         inst_count,
                         state->baseinst_loc);
 }
@@ -1307,7 +1308,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
         case DRW_CMD_DRAW:
           if (!USE_BATCHING || state.obmats_loc == -1 || (G.f & G_FLAG_PICKSEL) ||
               cmd->draw.batch->inst) {
-            draw_call_single_do(shgroup, &state, cmd->draw.batch, cmd->draw.handle, 0, 0, 0);
+            draw_call_single_do(shgroup, &state, cmd->draw.batch, cmd->draw.handle, 0, 0, 0, true);
           }
           else {
             draw_call_batching_do(shgroup, &state, &cmd->draw);
@@ -1320,7 +1321,8 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                               cmd->procedural.handle,
                               0,
                               cmd->procedural.vert_count,
-                              1);
+                              1,
+                              true);
           break;
         case DRW_CMD_DRAW_INSTANCE:
           draw_call_single_do(shgroup,
@@ -1329,7 +1331,8 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                               cmd->instance.handle,
                               0,
                               0,
-                              cmd->instance.inst_count);
+                              cmd->instance.inst_count,
+                              cmd->instance.use_attribs == 0);
           break;
         case DRW_CMD_DRAW_RANGE:
           draw_call_single_do(shgroup,
@@ -1338,7 +1341,8 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                               (DRWResourceHandle)0,
                               cmd->range.vert_first,
                               cmd->range.vert_count,
-                              1);
+                              1,
+                              true);
           break;
       }
     }
diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl
index 97ba6c077d9..bf72c0f4c79 100644
--- a/source/blender/draw/intern/shaders/common_view_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_view_lib.glsl
@@ -54,7 +54,7 @@ uniform int resourceChunk;
 uniform int baseInstance;
 #  endif
 
-#  ifdef IN_PLACE_INSTANCES
+#  if defined(IN_PLACE_INSTANCES) || defined(INSTANCED_ATTRIB)
 /* When drawing instances of an object at the same position. */
 #    define instanceId 0
 #  elif defined(GPU_DEPRECATED_AMD_DRIVER)
@@ -92,7 +92,8 @@ flat in int resourceIDFrag;
 #  define resource_id resourceIDFrag
 #endif
 
-#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD_DRIVER) && !defined(OS_MAC)
+#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD_DRIVER) && !defined(OS_MAC) && \
+    !defined(INSTANCED_ATTRIB)
 struct ObjectMatrices {
   mat4 drw_modelMatrix;
   mat4 drw_modelMatrixInverse;



More information about the Bf-blender-cvs mailing list