[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