[Bf-blender-cvs] [8bc8a62c57f] master: DRW: Refactor: Use DRWCall to accumulate per instance attributes

Clément Foucault noreply at git.blender.org
Tue May 14 11:01:40 CEST 2019


Commit: 8bc8a62c57f91326ab3f8850785dce5452b5d703
Author: Clément Foucault
Date:   Mon May 13 17:56:20 2019 +0200
Branches: master
https://developer.blender.org/rB8bc8a62c57f91326ab3f8850785dce5452b5d703

DRW: Refactor: Use DRWCall to accumulate per instance attributes

This is a big change that cleanup a lot of confusing code.
- The instancing/batching data buffer distribution in draw_instance_data.c.
- The selection & drawing code in draw_manager_exec.c
- Prety much every non-meshes object drawing (object_mode.c).

Most of the changes are just renaming but there still a chance a typo might
have sneek through.

The Batching/Instancing Shading groups are replace by DRWCallBuffers. This
is cleaner and conceptually more in line with what a DRWShadingGroup should
be.

There is still some little confusion in draw_common.c where some function
takes shgroup as input and some don't.

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

M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_armature.c
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_instance_data.c
M	source/blender/draw/intern/draw_instance_data.h
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
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/modes/edit_metaball_mode.c
M	source/blender/draw/modes/edit_text_mode.c
M	source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 5976a30232e..a45a29ce9cb 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -436,12 +436,12 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat
                                     {"probe_mat", DRW_ATTR_FLOAT, 16},
                                 });
 
-    DRWShadingGroup *grp = DRW_shgroup_instance_create(EEVEE_shaders_probe_planar_display_sh_get(),
-                                                       psl->probe_display,
-                                                       DRW_cache_quad_get(),
-                                                       e_data.format_probe_display_planar);
-    stl->g_data->planar_display_shgrp = grp;
+    DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_probe_planar_display_sh_get(),
+                                              psl->probe_display);
     DRW_shgroup_uniform_texture_ref(grp, "probePlanars", &txl->planar_pool);
+
+    stl->g_data->planar_display_shgrp = DRW_shgroup_call_buffer_instance_add(
+        grp, e_data.format_probe_display_planar, DRW_cache_quad_get());
   }
   else {
     stl->g_data->planar_display_shgrp = NULL;
@@ -499,9 +499,9 @@ void EEVEE_lightprobes_cache_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata
     EEVEE_lightprobes_planar_data_from_object(
         ob, &pinfo->planar_data[pinfo->num_planar], &pinfo->planar_vis_tests[pinfo->num_planar]);
     /* Debug Display */
-    DRWShadingGroup *grp = vedata->stl->g_data->planar_display_shgrp;
+    DRWCallBuffer *grp = vedata->stl->g_data->planar_display_shgrp;
     if (grp && (probe->flag & LIGHTPROBE_FLAG_SHOW_DATA)) {
-      DRW_shgroup_call_dynamic_add(grp, &pinfo->num_planar, ob->obmat);
+      DRW_buffer_add_entry(grp, &pinfo->num_planar, ob->obmat);
     }
 
     pinfo->num_planar++;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 3d243b70bd1..ca9314daa95 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -816,8 +816,7 @@ typedef struct EEVEE_PrivateData {
   struct DRWShadingGroup *refract_depth_shgrp_cull;
   struct DRWShadingGroup *refract_depth_shgrp_clip;
   struct DRWShadingGroup *refract_depth_shgrp_clip_cull;
-  struct DRWShadingGroup *cube_display_shgrp;
-  struct DRWShadingGroup *planar_display_shgrp;
+  struct DRWCallBuffer *planar_display_shgrp;
   struct GHash *material_hash;
   float background_alpha; /* TODO find a better place for this. */
   /* Chosen lightcache: can come from Lookdev or the viewlayer. */
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 1c943c18ed3..401ed50c1dc 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -44,6 +44,7 @@
 #include "DNA_world_types.h"
 
 #include "GPU_framebuffer.h"
+#include "GPU_primitive.h"
 #include "GPU_texture.h"
 #include "GPU_shader.h"
 
@@ -83,6 +84,9 @@ typedef struct DRWPass DRWPass;
 typedef struct DRWShadingGroup DRWShadingGroup;
 typedef struct DRWUniform DRWUniform;
 
+/* Opaque type to avoid usage as a DRWCall but it is exactly the same thing. */
+typedef struct DRWCallBuffer DRWCallBuffer;
+
 /* TODO Put it somewhere else? */
 typedef struct BoundSphere {
   float center[3], radius;
@@ -319,8 +323,8 @@ typedef enum {
   DRW_STATE_DEPTH_GREATER_EQUAL = (1 << 7),
   DRW_STATE_CULL_BACK = (1 << 8),
   DRW_STATE_CULL_FRONT = (1 << 9),
-  DRW_STATE_WIRE = (1 << 10),
-  DRW_STATE_POINT = (1 << 11),
+  DRW_STATE_WIRE = (1 << 10),  /* TODO remove */
+  DRW_STATE_POINT = (1 << 11), /* TODO remove */
   /** Polygon offset. Does not work with lines and points. */
   DRW_STATE_OFFSET_POSITIVE = (1 << 12),
   /** Polygon offset. Does not work with lines and points. */
@@ -374,19 +378,11 @@ struct GPUVertFormat *DRW_shgroup_instance_format_array(const DRWInstanceAttrFor
     } \
   } while (0)
 
+/* TODO(fclem): Remove the _create suffix. */
 DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
 DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup);
 DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass);
 
-DRWShadingGroup *DRW_shgroup_instance_create(struct GPUShader *shader,
-                                             DRWPass *pass,
-                                             struct GPUBatch *geom,
-                                             struct GPUVertFormat *format);
-DRWShadingGroup *DRW_shgroup_point_batch_create(struct GPUShader *shader, DRWPass *pass);
-DRWShadingGroup *DRW_shgroup_line_batch_create_with_format(struct GPUShader *shader,
-                                                           DRWPass *pass,
-                                                           struct GPUVertFormat *format);
-DRWShadingGroup *DRW_shgroup_line_batch_create(struct GPUShader *shader, DRWPass *pass);
 DRWShadingGroup *DRW_shgroup_transform_feedback_create(struct GPUShader *shader,
                                                        DRWPass *pass,
                                                        struct GPUVertBuf *tf_target);
@@ -394,20 +390,17 @@ DRWShadingGroup *DRW_shgroup_transform_feedback_create(struct GPUShader *shader,
 /* return final visibility */
 typedef bool(DRWCallVisibilityFn)(bool vis_in, void *user_data);
 
-void DRW_shgroup_instance_batch(DRWShadingGroup *shgroup, struct GPUBatch *batch);
-
-void DRW_shgroup_call_add(DRWShadingGroup *shgroup, struct GPUBatch *geom, float (*obmat)[4]);
+/* TODO(fclem): Remove the _add suffix. */
+void DRW_shgroup_call_add(DRWShadingGroup *sh, struct GPUBatch *geom, float (*obmat)[4]);
 void DRW_shgroup_call_range_add(
-    DRWShadingGroup *shgroup, struct GPUBatch *geom, float (*obmat)[4], uint v_sta, uint v_count);
-void DRW_shgroup_call_procedural_points_add(DRWShadingGroup *shgroup,
-                                            uint point_len,
-                                            float (*obmat)[4]);
-void DRW_shgroup_call_procedural_lines_add(DRWShadingGroup *shgroup,
-                                           uint line_count,
-                                           float (*obmat)[4]);
-void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup,
-                                               uint tria_count,
+    DRWShadingGroup *sh, struct GPUBatch *geom, float (*obmat)[4], uint v_sta, uint v_ct);
+
+void DRW_shgroup_call_procedural_points_add(DRWShadingGroup *sh, uint point_ct, float (*obmat)[4]);
+void DRW_shgroup_call_procedural_lines_add(DRWShadingGroup *sh, uint line_ct, float (*obmat)[4]);
+void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *sh,
+                                               uint tri_ct,
                                                float (*obmat)[4]);
+
 void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup,
                                     struct GPUBatch *geom,
                                     struct Object *ob,
@@ -422,31 +415,33 @@ void DRW_shgroup_call_object_add_with_callback(DRWShadingGroup *shgroup,
                                                DRWCallVisibilityFn *callback,
                                                void *user_data);
 
-void DRW_shgroup_call_sculpt_add(DRWShadingGroup *shading_group,
-                                 Object *object,
-                                 bool use_wire,
-                                 bool use_mask,
-                                 bool use_vert_color);
-void DRW_shgroup_call_sculpt_with_materials_add(DRWShadingGroup **shgroups,
-                                                Object *ob,
-                                                bool use_vcol);
-
-/* Used for drawing a batch with instancing without instance attributes. */
 void DRW_shgroup_call_instances_add(DRWShadingGroup *shgroup,
                                     struct GPUBatch *geom,
                                     float (*obmat)[4],
                                     uint count);
-void DRW_shgroup_call_dynamic_add_array(DRWShadingGroup *shgroup,
-                                        const void *attr[],
-                                        uint attr_len);
-#define DRW_shgroup_call_dynamic_add(shgroup, ...) \
+void DRW_shgroup_call_instances_with_attribs_add(DRWShadingGroup *shgroup,
+                                                 struct GPUBatch *geom,
+                                                 float (*obmat)[4],
+                                                 struct GPUBatch *inst_attributes);
+
+void DRW_shgroup_call_sculpt_add(DRWShadingGroup *sh, Object *ob, bool wire, bool mask, bool vcol);
+void DRW_shgroup_call_sculpt_with_materials_add(DRWShadingGroup **sh, Object *ob, bool vcol);
+
+DRWCallBuffer *DRW_shgroup_call_buffer_add(DRWShadingGroup *shading_group,
+                                           struct GPUVertFormat *format,
+                                           GPUPrimType prim_type);
+DRWCallBuffer *DRW_shgroup_call_buffer_instance_add(DRWShadingGroup *shading_group,
+                                                    struct GPUVertFormat *format,
+                                                    struct GPUBatch *geom);
+
+void DRW_buffer_add_entry_array(DRWCallBuffer *buffer, const void *attr[], uint attr_len);
+
+#define DRW_buffer_add_entry(buffer, ...) \
   do { \
     const void *array[] = {__VA_ARGS__}; \
-    DRW_shgroup_call_dynamic_add_array(shgroup, array, (sizeof(array) / sizeof(*array))); \
+    DRW_buffer_add_entry_array(buffer, array, (sizeof(array) / sizeof(*array))); \
   } while (0)
 
-uint DRW_shgroup_get_instance_count(const DRWShadingGroup *shgroup);
-
 void DRW_shgroup_state_enable(DRWShadingGroup *shgroup, DRWState state);
 void DRW_shgroup_state_disable(DRWShadingGroup *shgroup, DRWState state);
 void DRW_shgroup_stencil_mask(DRWShadingGroup *shgroup, uint mask);
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_arm

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list