[Bf-blender-cvs] [707756d2770] blender2.8: Draw Manager: Extend simplification to UBOs & fix a context error.

Clément Foucault noreply at git.blender.org
Wed May 10 01:12:14 CEST 2017


Commit: 707756d2770afbd8fad0702409d145b7ca990459
Author: Clément Foucault
Date:   Tue May 9 23:55:02 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB707756d2770afbd8fad0702409d145b7ca990459

Draw Manager: Extend simplification to UBOs & fix a context error.

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

M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index 87e205bdd23..6486c87337d 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -529,7 +529,7 @@ static DRWShadingGroup *CLAY_object_shgrp_get(CLAY_Data *vedata, Object *ob, CLA
 		shgrps[id] = CLAY_shgroup_create(vedata, psl->clay_pass, &e_data.ubo_mat_idxs[id]);
 		/* if it's the first shgrp, pass bind the material UBO */
 		if (stl->storage->ubo_current_id == 1) {
-			DRW_shgroup_uniform_block(shgrps[0], "material_block", stl->mat_ubo, 0);
+			DRW_shgroup_uniform_block(shgrps[0], "material_block", stl->mat_ubo);
 		}
 	}
 
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 6c4dec05b10..5e6c10ef3f5 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -335,7 +335,7 @@ static DRWShadingGroup *eevee_cube_shadow_shgroup(
         EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4])
 {
 	DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cube_pass, geom);
-	DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo, 0);
+	DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
 	DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
 
 	for (int i = 0; i < 6; ++i)
@@ -348,7 +348,7 @@ static DRWShadingGroup *eevee_cascade_shadow_shgroup(
         EEVEE_PassList *psl, EEVEE_StorageList *stl, struct Batch *geom, float (*obmat)[4])
 {
 	DRWShadingGroup *grp = DRW_shgroup_instance_create(e_data.shadow_sh, psl->shadow_cascade_pass, geom);
-	DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo, 0);
+	DRW_shgroup_uniform_block(grp, "shadow_render_block", stl->shadow_render_ubo);
 	DRW_shgroup_uniform_mat4(grp, "ShadowModelMatrix", (float *)obmat);
 
 	for (int i = 0; i < MAX_CASCADE_NUM; ++i)
@@ -523,8 +523,8 @@ static void EEVEE_cache_init(void *vedata)
 		psl->default_pass = DRW_pass_create("Default Shader Pass", state);
 
 		stl->g_data->default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->default_pass);
-		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->light_ubo, 0);
-		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "shadow_block", stl->shadow_ubo, 1);
+		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->light_ubo);
+		DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "shadow_block", stl->shadow_ubo);
 		DRW_shgroup_uniform_int(stl->g_data->default_lit_grp, "light_count", &stl->lamps->num_light, 1);
 		DRW_shgroup_uniform_float(stl->g_data->default_lit_grp, "lodMax", &stl->probes->lodmax, 1);
 		DRW_shgroup_uniform_vec3(stl->g_data->default_lit_grp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
@@ -587,8 +587,8 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
 					if (shgrp) {
 						DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
 
-						DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo, 0);
-						DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo, 1);
+						DRW_shgroup_uniform_block(shgrp, "light_block", stl->light_ubo);
+						DRW_shgroup_uniform_block(shgrp, "shadow_block", stl->shadow_ubo);
 						DRW_shgroup_uniform_int(shgrp, "light_count", &stl->lamps->num_light, 1);
 						DRW_shgroup_uniform_float(shgrp, "lodMax", &stl->probes->lodmax, 1);
 						DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)stl->probes->shcoefs, 9);
@@ -606,6 +606,9 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
 						DRW_shgroup_uniform_vec3(shgrp, "diffuse_col", col, 1);
 						DRW_shgroup_uniform_vec3(shgrp, "specular_col", spec, 1);
 						DRW_shgroup_uniform_short(shgrp, "hardness", &hardness, 1);
+						DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "ltcMat", e_data.ltc_mat);
+						DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "brdfLut", e_data.brdf_lut);
+						DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "probeFiltered", txl->probe_pool);
 						DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
 					}
 				}
@@ -614,6 +617,9 @@ static void EEVEE_cache_populate(void *vedata, Object *ob)
 					DRW_shgroup_uniform_vec3(shgrp, "diffuse_col", &ma->r, 1);
 					DRW_shgroup_uniform_vec3(shgrp, "specular_col", &ma->specr, 1);
 					DRW_shgroup_uniform_short(shgrp, "hardness", &ma->har, 1);
+					DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "ltcMat", e_data.ltc_mat);
+					DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "brdfLut", e_data.brdf_lut);
+					DRW_shgroup_uniform_texture(stl->g_data->default_lit_grp, "probeFiltered", txl->probe_pool);
 					DRW_shgroup_call_add(shgrp, mat_geom[i], ob->obmat);
 				}
 
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 61074400a0d..1cdb213d86f 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -278,7 +278,7 @@ void DRW_shgroup_attrib_int(DRWShadingGroup *shgroup, const char *name, int size
 void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int size);
 
 void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const struct GPUTexture *tex);
-void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const struct GPUUniformBuffer *ubo, int loc);
+void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const struct GPUUniformBuffer *ubo);
 void DRW_shgroup_uniform_buffer(DRWShadingGroup *shgroup, const char *name, struct GPUTexture **tex);
 void DRW_shgroup_uniform_bool(DRWShadingGroup *shgroup, const char *name, const bool *value, int arraysize);
 void DRW_shgroup_uniform_float(DRWShadingGroup *shgroup, const char *name, const float *value, int arraysize);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 35050a06abb..f8883c9930c 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -163,7 +163,9 @@ struct DRWInterface {
 	int camtexfac;
 	int eye;
 	/* Textures */
-	int next_bind; /* next texture binding point */
+	int tex_bind; /* next texture binding point */
+	/* UBO */
+	int ubo_bind; /* next ubo binding point */
 	/* Dynamic batch */
 	GLuint instance_vbo;
 	int instance_count;
@@ -538,7 +540,8 @@ static DRWInterface *DRW_interface_create(GPUShader *shader)
 	interface->attribs_count = 0;
 	interface->attribs_stride = 0;
 	interface->instance_vbo = 0;
-	interface->next_bind = GPU_max_textures() - 1;
+	interface->tex_bind = GPU_max_textures() - 1;
+	interface->ubo_bind = GPU_max_ubo_binds() - 1;
 
 	memset(&interface->vbo_format, 0, sizeof(VertexFormat));
 
@@ -856,30 +859,41 @@ void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int si
 void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
 {
 	DRWInterface *interface = shgroup->interface;
-	if (interface->next_bind < 0) {
+
+	if (interface->tex_bind < 0) {
 		/* TODO alert user */
 		printf("Not enough texture slot for %s\n", name);
+		return;
 	}
-	else {
-		DRW_interface_uniform(shgroup, name, DRW_UNIFORM_TEXTURE, tex, 0, 1, interface->next_bind--);
-	}
+
+	DRW_interface_uniform(shgroup, name, DRW_UNIFORM_TEXTURE, tex, 0, 1, interface->tex_bind--);
 }
 
-void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const GPUUniformBuffer *ubo, int loc)
+void DRW_shgroup_uniform_block(DRWShadingGroup *shgroup, const char *name, const GPUUniformBuffer *ubo)
 {
-	DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BLOCK, ubo, 0, 1, loc);
+	DRWInterface *interface = shgroup->interface;
+
+	/* Be carefull: there is also a limit per shader stage. Usually 1/3 of normal limit. */
+	if (interface->ubo_bind < 0) {
+		/* TODO alert user */
+		printf("Not enough ubo slots for %s\n", name);
+		return;
+	}
+
+	DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BLOCK, ubo, 0, 1, interface->ubo_bind--);
 }
 
 void DRW_shgroup_uniform_buffer(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
 {
 	DRWInterface *interface = shgroup->interface;
-	if (interface->next_bind < 0) {
+
+	if (interface->tex_bind < 0) {
 		/* TODO alert user */
 		printf("Not enough texture slot for %s\n", name);
+		return;
 	}
-	else {
-		DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BUFFER, tex, 0, 1, interface->next_bind--);
-	}
+
+	DRW_interface_uniform(shgroup, name, DRW_UNIFORM_BUFFER, tex, 0, 1, interface->tex_bind--);
 }
 
 void DRW_shgroup_uniform_bool(DRWShadingGroup *shgroup, const char *name, const bool *value, int arraysize)
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index f107ea095e4..f51274b8fee 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -268,7 +268,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
 	        DRW_STATE_WRITE_COLOR | DRW_STATE_POINT | statemod);
 
 	*r_face_shgrp = DRW_shgroup_create(tri_sh, pass);
-	DRW_shgroup_uniform_block(*r_face_shgrp, "globalsBlock", globals_ubo, 0);
+	DRW_shgroup_uniform_block(*r_face_shgrp, "globalsBlock", globals_ubo);
 	DRW_shgroup_uniform_vec2(*r_face_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
 	DRW_shgroup_uniform_float(*r_face_shgrp, "faceAlphaMod", faceAlpha, 1);
 
@@ -371,7 +371,7 @@ static void EDIT_MESH_cache_init(void *vedata)
 		        "Front Face Color",
 		        DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND);
 		stl->g_data->facefill_occluded_shgrp = DRW_shgroup_create(e_data.overlay_facefill_sh, psl->facefill_occlude);
-		DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo, 0);
+		DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo);
 
 		/* we need a full screen pass to combine the result */
 		struct Batch *quad = DRW_cache_fullscreen_quad_get();
diff --git a/source/blender/draw/modes/object_m

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list