[Bf-blender-cvs] [05e04588b59] tmp-drw-callbatching: DRW: Port Eevee to use DRWObjectInfos ubos

Clément Foucault noreply at git.blender.org
Sat Aug 17 14:49:31 CEST 2019


Commit: 05e04588b59557004d5254009e55077ecfba037b
Author: Clément Foucault
Date:   Sat Jun 1 22:51:52 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB05e04588b59557004d5254009e55077ecfba037b

DRW: Port Eevee to use DRWObjectInfos ubos

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

M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_shader_interface.h
M	source/blender/gpu/intern/gpu_codegen.c
M	source/blender/gpu/intern/gpu_shader_interface.c
A	source/blender/gpu/shaders/gpu_shader_common_obinfos_lib.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 738745f3072..ab59e09b107 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -48,6 +48,8 @@ static struct {
   char *frag_shader_lib;
   char *vert_shader_str;
   char *vert_shadow_shader_str;
+  char *vert_background_shader_str;
+  char *vert_volume_shader_str;
   char *volume_shader_lib;
 
   struct GPUShader *default_prepass_sh;
@@ -602,6 +604,12 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
     e_data.vert_shadow_shader_str = BLI_string_joinN(
         datatoc_common_view_lib_glsl, datatoc_common_hair_lib_glsl, datatoc_shadow_vert_glsl);
 
+    e_data.vert_background_shader_str = BLI_string_joinN(datatoc_common_view_lib_glsl,
+                                                         datatoc_background_vert_glsl);
+
+    e_data.vert_volume_shader_str = BLI_string_joinN(datatoc_common_view_lib_glsl,
+                                                     datatoc_volumetric_vert_glsl);
+
     e_data.default_background = DRW_shader_create_with_lib(datatoc_background_vert_glsl,
                                                            NULL,
                                                            datatoc_default_world_frag_glsl,
@@ -675,7 +683,7 @@ struct GPUMaterial *EEVEE_material_world_lightprobe_get(struct Scene *scene, Wor
                                       wo,
                                       engine,
                                       options,
-                                      datatoc_background_vert_glsl,
+                                      e_data.vert_background_shader_str,
                                       NULL,
                                       e_data.frag_shader_lib,
                                       SHADER_DEFINES "#define PROBE_CAPTURE\n",
@@ -695,7 +703,7 @@ struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, Wor
                                       wo,
                                       engine,
                                       options,
-                                      datatoc_background_vert_glsl,
+                                      e_data.vert_background_shader_str,
                                       NULL,
                                       e_data.frag_shader_lib,
                                       SHADER_DEFINES "#define WORLD_BACKGROUND\n",
@@ -718,7 +726,7 @@ struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *
                                      wo,
                                      engine,
                                      options,
-                                     datatoc_volumetric_vert_glsl,
+                                     e_data.vert_volume_shader_str,
                                      datatoc_volumetric_geom_glsl,
                                      e_data.volume_shader_lib,
                                      defines,
@@ -786,7 +794,7 @@ struct GPUMaterial *EEVEE_material_mesh_volume_get(struct Scene *scene, Material
                                         ma,
                                         engine,
                                         options,
-                                        datatoc_volumetric_vert_glsl,
+                                        e_data.vert_volume_shader_str,
                                         datatoc_volumetric_geom_glsl,
                                         e_data.volume_shader_lib,
                                         defines,
@@ -1810,6 +1818,8 @@ void EEVEE_materials_free(void)
   MEM_SAFE_FREE(e_data.frag_shader_lib);
   MEM_SAFE_FREE(e_data.vert_shader_str);
   MEM_SAFE_FREE(e_data.vert_shadow_shader_str);
+  MEM_SAFE_FREE(e_data.vert_background_shader_str);
+  MEM_SAFE_FREE(e_data.vert_volume_shader_str);
   MEM_SAFE_FREE(e_data.volume_shader_lib);
   DRW_SHADER_FREE_SAFE(e_data.default_hair_prepass_sh);
   DRW_SHADER_FREE_SAFE(e_data.default_hair_prepass_clip_sh);
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 6ff3e709df3..53ca496b4e5 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -890,12 +890,13 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
         shgroup, info_ubo_location, DRW_UNIFORM_BLOCK_OBINFOS, NULL, 0, 1);
 
     shgroup->orcotexfac = -1;
-    shgroup->objectinfo = -1;
+    /* Abusing this loc. */
+    shgroup->objectinfo = 1;
   }
   else {
     /* TODO remove */
     shgroup->orcotexfac = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_ORCO);
-    shgroup->objectinfo = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_OBJECT_INFO);
+    shgroup->objectinfo = -1;
   }
 
   if (view_ubo_location != -1) {
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 19bfd3d6e16..30d07eec0cb 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -574,11 +574,8 @@ static void draw_compute_culling(DRWView *view)
 /** \name Draw (DRW_draw)
  * \{ */
 
-BLI_INLINE void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call)
+BLI_INLINE void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWResourceHandle handle)
 {
-  BLI_assert(call);
-  DRWResourceHandle handle = call->handle;
-
   if (shgroup->model != -1 || shgroup->modelinverse != -1 || shgroup->modelviewprojection != -1) {
     DRWObjectMatrix *ob_mats = BLI_memblock_elem_get(
         DST.vmempool->obmats, handle.chunk, handle.id);
@@ -995,10 +992,17 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
         prev_neg_scale = neg_scale;
       }
 
-      if ((obmats_loc != -1) && (resource_chunk != handle.chunk)) {
-        GPU_uniformbuffer_unbind(DST.vmempool->matrices_ubo[resource_chunk]);
-        GPU_uniformbuffer_bind(DST.vmempool->matrices_ubo[handle.chunk], 0);
-        resource_chunk = handle.chunk;
+      if (resource_chunk != handle.chunk) {
+        if (obmats_loc != -1) {
+          GPU_uniformbuffer_unbind(DST.vmempool->matrices_ubo[resource_chunk]);
+          GPU_uniformbuffer_bind(DST.vmempool->matrices_ubo[handle.chunk], 0);
+          resource_chunk = handle.chunk;
+        }
+        if (obinfos_loc != -1) {
+          GPU_uniformbuffer_unbind(DST.vmempool->obinfos_ubo[resource_chunk]);
+          GPU_uniformbuffer_bind(DST.vmempool->obinfos_ubo[handle.chunk], 0);
+          resource_chunk = handle.chunk;
+        }
       }
 
       if (baseinst_loc != -1) {
@@ -1016,7 +1020,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
 
       if (obmats_loc == -1 || obinfos_loc == -1) {
         /* TODO This is Legacy. Need to be removed. */
-        draw_geometry_prepare(shgroup, call);
+        draw_geometry_prepare(shgroup, handle);
       }
 
       if (draw_select_do_call(shgroup, call, base_inst)) {
@@ -1032,6 +1036,9 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
     if (obmats_loc != -1) {
       GPU_uniformbuffer_unbind(DST.vmempool->matrices_ubo[resource_chunk]);
     }
+    if (obinfos_loc != -1) {
+      GPU_uniformbuffer_unbind(DST.vmempool->obinfos_ubo[resource_chunk]);
+    }
   }
 
   if (use_tfeedback) {
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index fb7d3c1ace8..5757a867b35 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -242,6 +242,8 @@ data_to_c_simple(shaders/gpu_shader_gpencil_fill_frag.glsl SRC)
 
 data_to_c_simple(shaders/gpu_shader_cfg_world_clip_lib.glsl SRC)
 
+data_to_c_simple(shaders/gpu_shader_common_obinfos_lib.glsl SRC)
+
 
 if(WITH_MOD_SMOKE)
   add_definitions(-DWITH_SMOKE)
diff --git a/source/blender/gpu/GPU_shader_interface.h b/source/blender/gpu/GPU_shader_interface.h
index 36c4875105d..a98a56e1f3e 100644
--- a/source/blender/gpu/GPU_shader_interface.h
+++ b/source/blender/gpu/GPU_shader_interface.h
@@ -51,7 +51,6 @@ typedef enum {
   GPU_UNIFORM_COLOR,         /* vec4 color */
   GPU_UNIFORM_CALLID,        /* int callId */
   GPU_UNIFORM_BASE_INSTANCE, /* int baseInstance */
-  GPU_UNIFORM_OBJECT_INFO,   /* vec3 objectInfo */
 
   GPU_UNIFORM_CUSTOM, /* custom uniform, not one of the above built-ins */
 
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 6e9ba4ca567..b8d89b9d0fd 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -58,6 +58,8 @@
 extern char datatoc_gpu_shader_material_glsl[];
 extern char datatoc_gpu_shader_geometry_glsl[];
 
+extern char datatoc_gpu_shader_common_obinfos_lib_glsl[];
+
 static char *glsl_material_library = NULL;
 
 /* -------------------- GPUPass Cache ------------------ */
@@ -790,6 +792,9 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
         else if (input->builtin == GPU_OBJECT_MATRIX) {
           BLI_dynstr_append(ds, "objmat");
         }
+        else if (input->builtin == GPU_OBJECT_INFO) {
+          BLI_dynstr_append(ds, "ObjectInfo");
+        }
         else if (input->builtin == GPU_INVERSE_OBJECT_MATRIX) {
           BLI_dynstr_append(ds, "objinv");
         }
@@ -852,6 +857,10 @@ static char *code_generate_fragment(GPUMaterial *material,
   codegen_set_unique_ids(nodes);
   *rbuiltins = builtins = codegen_process_uniforms_functions(material, ds, nodes);
 
+  if (builtins & GPU_OBJECT_INFO) {
+    BLI_dynstr_append(ds, datatoc_gpu_shader_common_obinfos_lib_glsl);
+  }
+
   if (builtins & GPU_BARYCENTRIC_TEXCO) {
     BLI_dynstr_append(ds, "in vec2 barycentricTexCo;\n");
   }
@@ -1000,7 +1009,7 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
         /* NOTE : Replicate changes to mesh_render_data_create() in draw_cache_impl_mesh.c */
         if (input->attr_type == CD_ORCO) {
           /* OPTI : orco is computed from local positions, but only if no modifier is present. */
-          BLI_dynstr_append(ds, "uniform vec4 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list