[Bf-blender-cvs] [80e199cf4da] tmp-drw-callbatching: GPU: Make Eevee shader pass resourceID to the fragment shader

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


Commit: 80e199cf4da305fd0a00c8b2c0c4d0e9d721f9ea
Author: Clément Foucault
Date:   Sun Jun 2 21:13:28 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB80e199cf4da305fd0a00c8b2c0c4d0e9d721f9ea

GPU: Make Eevee shader pass resourceID to the fragment shader

this way we don't need a fallback uniform and the overcome the
impossibility to do draw call merging with these shaders.

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

M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/modes/shaders/common_view_lib.glsl
M	source/blender/gpu/intern/gpu_codegen.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index ab59e09b107..11b201949c1 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -50,6 +50,7 @@ static struct {
   char *vert_shadow_shader_str;
   char *vert_background_shader_str;
   char *vert_volume_shader_str;
+  char *geom_volume_shader_str;
   char *volume_shader_lib;
 
   struct GPUShader *default_prepass_sh;
@@ -610,6 +611,9 @@ void EEVEE_materials_init(EEVEE_ViewLayerData *sldata,
     e_data.vert_volume_shader_str = BLI_string_joinN(datatoc_common_view_lib_glsl,
                                                      datatoc_volumetric_vert_glsl);
 
+    e_data.geom_volume_shader_str = BLI_string_joinN(datatoc_common_view_lib_glsl,
+                                                     datatoc_volumetric_geom_glsl);
+
     e_data.default_background = DRW_shader_create_with_lib(datatoc_background_vert_glsl,
                                                            NULL,
                                                            datatoc_default_world_frag_glsl,
@@ -727,7 +731,7 @@ struct GPUMaterial *EEVEE_material_world_volume_get(struct Scene *scene, World *
                                      engine,
                                      options,
                                      e_data.vert_volume_shader_str,
-                                     datatoc_volumetric_geom_glsl,
+                                     e_data.geom_volume_shader_str,
                                      e_data.volume_shader_lib,
                                      defines,
                                      true);
@@ -795,7 +799,7 @@ struct GPUMaterial *EEVEE_material_mesh_volume_get(struct Scene *scene, Material
                                         engine,
                                         options,
                                         e_data.vert_volume_shader_str,
-                                        datatoc_volumetric_geom_glsl,
+                                        e_data.geom_volume_shader_str,
                                         e_data.volume_shader_lib,
                                         defines,
                                         true);
@@ -1820,6 +1824,7 @@ void EEVEE_materials_free(void)
   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.geom_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/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 7eb12dbdeb9..682f64e7c99 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -91,9 +91,11 @@ void main()
 #endif
 
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
-  normal_viewport = normal_object_to_view(nor);
 #  ifndef HAIR_SHADER
+  normal_viewport = normal_object_to_view(nor);
   normal_viewport = normalize(normal_viewport);
+#  else
+  normal_viewport = normal_world_to_view(nor);
 #  endif
 #endif
 
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 09de805cfc5..f7b74502110 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1037,9 +1037,6 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
         /* Fallback when ARB_shader_draw_parameters is not supported. */
         int id = handle.id;
         GPU_shader_uniform_vector_int(shgroup->shader, baseinst_loc, 1, 1, &id);
-      }
-
-      if (!GLEW_ARB_shader_draw_parameters) {
         base_inst = 0;
       }
       else {
diff --git a/source/blender/draw/modes/shaders/common_view_lib.glsl b/source/blender/draw/modes/shaders/common_view_lib.glsl
index df51cf98b0d..f27468492c3 100644
--- a/source/blender/draw/modes/shaders/common_view_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_view_lib.glsl
@@ -24,18 +24,37 @@ layout(std140) uniform viewBlock
     _world_clip_planes_calc_clip_distance(p, clipPlanes)
 #endif
 
-#if defined(GL_ARB_shader_draw_parameters) && defined(GPU_VERTEX_SHADER)
-#  define resource_id (gl_BaseInstanceARB + gl_InstanceID)
-#else
+#ifdef GPU_VERTEX_SHADER
+#  ifdef GL_ARB_shader_draw_parameters
+#    define resource_id (gl_BaseInstanceARB + gl_InstanceID)
+
+#  else /* no ARB_shader_draw_parameters */
 uniform int baseInstance = 0;
-#  ifdef GPU_VERTEX_SHADER
 #    define resource_id (baseInstance + gl_InstanceID)
-#  else
-/* This is a fallback when using it in a fragement/geometry shader.
- * In this case, we cannot do drawcall merging and we must disable
- * it explicitly in the shading group. */
-#    define resource_id baseInstance
+
 #  endif
+/* Use this to declare and pass the value if
+ * the fragment shader uses the resource_id. */
+#  define RESOURCE_ID_VARYING flat out int resourceIDFrag;
+#  define RESOURCE_ID_VARYING_GEOM flat out int resourceIDGeom;
+#  define PASS_RESOURCE_ID resourceIDFrag = resource_id;
+#  define PASS_RESOURCE_ID_GEOM resourceIDGeom = resource_id;
+#endif
+
+/* If used in a fragment / geometry shader, we pass
+ * resource_id as varying. */
+#ifdef GPU_GEOMETRY_SHADER
+#  define RESOURCE_ID_VARYING \
+    flat out int resourceIDFrag; \
+    flat in int resourceIDGeom[];
+
+#  define resource_id resourceIDGeom
+#  define PASS_RESOURCE_ID(i) resourceIDFrag = resource_id[i];
+#endif
+
+#ifdef GPU_FRAGMENT_SHADER
+flat in int resourceIDFrag;
+#  define resource_id resourceIDFrag
 #endif
 
 struct ObjectMatrices {
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index b8d89b9d0fd..c102c0a5398 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -59,6 +59,7 @@ extern char datatoc_gpu_shader_material_glsl[];
 extern char datatoc_gpu_shader_geometry_glsl[];
 
 extern char datatoc_gpu_shader_common_obinfos_lib_glsl[];
+extern char datatoc_common_view_lib_glsl[];
 
 static char *glsl_material_library = NULL;
 
@@ -1091,6 +1092,8 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
 
   BLI_dynstr_append(ds, "\n");
 
+  BLI_dynstr_append(ds, use_geom ? "RESOURCE_ID_VARYING_GEOM\n" : "RESOURCE_ID_VARYING\n");
+
   BLI_dynstr_append(ds,
                     "#define USE_ATTR\n"
                     "vec3 srgb_to_linear_attr(vec3 c) {\n"
@@ -1111,6 +1114,8 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u
 
   BLI_dynstr_append(ds, "void pass_attr(in vec3 position) {\n");
 
+  BLI_dynstr_append(ds, use_geom ? "\tPASS_RESOURCE_ID_GEOM\n" : "\tPASS_RESOURCE_ID\n");
+
   BLI_dynstr_append(ds, "#ifdef HAIR_SHADER\n");
 
   if (builtins & GPU_BARYCENTRIC_TEXCO) {
@@ -1309,6 +1314,8 @@ static char *code_generate_geometry(ListBase *nodes, const char *geom_code, cons
       BLI_dynstr_append(ds, "out vec3 worldNormal;\n");
       BLI_dynstr_append(ds, "out vec3 viewNormal;\n");
 
+      BLI_dynstr_append(ds, datatoc_common_view_lib_glsl);
+
       BLI_dynstr_append(ds, "void main(){\n");
 
       if (builtins & GPU_BARYCENTRIC_DIST) {
@@ -1353,9 +1360,13 @@ static char *code_generate_geometry(ListBase *nodes, const char *geom_code, cons
     BLI_dynstr_append(ds, "}\n");
   }
 
+  BLI_dynstr_append(ds, "RESOURCE_ID_VARYING\n");
+
   /* Generate varying assignments. */
   BLI_dynstr_append(ds, "void pass_attr(in int vert) {\n");
 
+  BLI_dynstr_append(ds, "\tPASS_RESOURCE_ID(vert)\n");
+
   /* XXX HACK: Eevee specific. */
   if (geom_code == NULL) {
     BLI_dynstr_append(ds, "\tworldPosition = worldPositiong[vert];\n");



More information about the Bf-blender-cvs mailing list