[Bf-blender-cvs] [fd7f78d89f] clay-engine: Introduce Batch storage.

Clément Foucault noreply at git.blender.org
Wed Jan 11 16:34:57 CET 2017


Commit: fd7f78d89f0a6404115306912c5e6e88a9ea106b
Author: Clément Foucault
Date:   Wed Jan 11 16:34:02 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBfd7f78d89f0a6404115306912c5e6e88a9ea106b

Introduce Batch storage.

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

M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 6320479a6d..cb8bd24445 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -40,31 +40,46 @@ extern char datatoc_clay_vert_glsl[];
 
 /* Storage */
 
+typedef struct CLAY_BatchStorage {
+	float matcap_rot[2];
+	int matcap_id;
+	float matcap_hsv[3];
+	float ssao_params_var[4];
+} CLAY_BatchStorage;
+
 static struct CLAY_data {
 	/* Depth Pre Pass */
 	struct GPUShader *depth_sh;
 	struct DRWInterface *depth_itf;
 	/* Shading Pass */
-	struct GPUShader *clay_sh;
+	struct GPUShader *clay_sh[8];
 	struct DRWInterface *clay_itf;
 
 	/* Matcap textures */
 	struct GPUTexture *matcap_array;
 	float matcap_colors[24][3];
-	float matcap_rot[2];
-	float matcap_hsv[3];
-	int matcap_id;
 
 	/* Ssao */
 	float dfdyfac[2];
 	float winmat[4][4];
 	float viewvecs[3][4];
-	float ssao_params_var[4];
 	float ssao_params[4];
 	struct GPUTexture *jitter_tx;
 	struct GPUTexture *sampling_tx;
 } data = {NULL};
 
+/* Shaders */
+#define WITH_ALL 0
+#define WITH_HSV_ROT 1
+#define WITH_AO_ROT 2
+#define WITH_AO_HSV 3
+#define WITH_AO 4
+#define WITH_ROT 5
+#define WITH_HSV 6
+#define WITH_NONE 7
+
+/* for clarity follow the same layout as CLAY_TextureList */
+
 /* keep it under MAX_BUFFERS */
 typedef struct CLAY_FramebufferList{
 	/* default */
@@ -252,118 +267,151 @@ static void clay_engine_init(void)
 	}
 
 	/* Shading pass */
-	if (!data.clay_sh) {
-		const char *defines =
+	if (!data.clay_sh[0]) {
+		const char *with_all =
 		        "#define USE_AO;\n"
 		        "#define USE_HSV;\n"
 		        "#define USE_ROTATION;\n";
-
-		/* TODO Optimisation : Create shader combinations and bind the right 
-		 * shader depending on the material settings */
-		data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, defines);
+		const char *with_hsv_rot =
+		        "#define USE_HSV;\n"
+		        "#define USE_ROTATION;\n";
+		const char *with_ao_rot =
+		        "#define USE_AO;\n"
+		        "#define USE_ROTATION;\n";
+		const char *with_ao_hsv =
+		        "#define USE_AO;\n"
+		        "#define USE_HSV;\n";
+		const char *with_ao ="#define USE_AO;\n";
+		const char *with_rot ="#define USE_ROTATION;\n";
+		const char *with_hsv ="#define USE_HSV;\n";
+
+		data.clay_sh[WITH_ALL] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_all);
+		data.clay_sh[WITH_HSV_ROT] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_hsv_rot);
+		data.clay_sh[WITH_AO_ROT] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_ao_rot);
+		data.clay_sh[WITH_AO_HSV] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_ao_hsv);
+		data.clay_sh[WITH_AO] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_ao);
+		data.clay_sh[WITH_ROT] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_rot);
+		data.clay_sh[WITH_HSV] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, with_hsv);
+		data.clay_sh[WITH_NONE] = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, NULL);
 	}
 }
 
-#if 0
-static void clay_init_view(CLAY_FramebufferList *buffers, CLAY_TextureList *textures)
+static DRWBatch *clay_batch_create(DRWPass *pass, CLAY_BatchStorage *storage)
 {
-	int *viewsize = DRW_viewport_size_get();
-
-	DRWFboTexture depth = {&textures->depth_low, DRW_BUF_R_16};
+	const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
+	const bool use_rot = (storage->matcap_rot[1] == 0);
+	const bool use_ao = (storage->ssao_params_var[1] == 0 && storage->ssao_params_var[2] == 0);
+	const bool use_hsv = (storage->matcap_hsv[0] == 0);
+	struct GPUShader *sh;
+
+	if (use_rot && use_ao && use_hsv) {
+		sh = data.clay_sh[WITH_ALL];
+	}
+	else if (use_hsv && use_rot) {
+		sh = data.clay_sh[WITH_HSV_ROT];
+	}
+	else if (use_ao && use_hsv) {
+		sh = data.clay_sh[WITH_AO_HSV];
+	}
+	else if (use_ao && use_rot) {
+		sh = data.clay_sh[WITH_AO_ROT];
+	}
+	else if (use_rot) {
+		sh = data.clay_sh[WITH_ROT];
+	}
+	else if (use_ao) {
+		sh = data.clay_sh[WITH_AO];
+	}
+	else if (use_hsv) {
+		sh = data.clay_sh[WITH_HSV];
+	}
+	else {
+		sh = data.clay_sh[WITH_NONE];
+	}
 
-	DRW_framebuffer_init(&buffers->downsample_depth, viewsize[0]/2, viewsize[1]/2, &depth, 1);
+	DRWBatch *batch = DRW_batch_create(sh, pass, storage);
+
+	DRW_batch_uniform_ivec2(batch, "screenres", DRW_viewport_size_get(), 1);
+	DRW_batch_uniform_buffer(batch, "depthtex", SCENE_DEPTH, depthloc);
+	DRW_batch_uniform_texture(batch, "matcaps", data.matcap_array, matcaploc);
+	DRW_batch_uniform_vec3(batch, "matcaps_color", (float *)data.matcap_colors, 24);
+	DRW_batch_uniform_vec2(batch, "matcap_rotation", (float *)storage->matcap_rot, 1);
+	DRW_batch_uniform_int(batch, "matcap_index", &storage->matcap_id, 1);
+	DRW_batch_uniform_vec3(batch, "matcap_hsv", (float *)storage->matcap_hsv, 1);
+
+	/* SSAO */
+	DRW_batch_uniform_mat4(batch, "WinMatrix", (float *)data.winmat);
+	DRW_batch_uniform_vec4(batch, "viewvecs", (float *)data.viewvecs, 3);
+	DRW_batch_uniform_vec4(batch, "ssao_params_var", storage->ssao_params_var, 1);
+	DRW_batch_uniform_vec4(batch, "ssao_params", data.ssao_params, 1);
+	DRW_batch_uniform_texture(batch, "ssao_jitter", data.jitter_tx, jitterloc);
+	DRW_batch_uniform_texture(batch, "ssao_samples", data.sampling_tx, sampleloc);
+
+	return batch;
 }
-#endif
 
 static void clay_populate_passes(CLAY_PassList *passes, const struct bContext *C)
 {
 	SceneLayer *sl = CTX_data_scene_layer(C);
-	DRWBatch *matcapbatch, *depthbatch;
-	bool pop_depth = false;
-	bool pop_clay = false;
+	DRWBatch *defaultbatch, *depthbatch;
+	Object *ob;
 
-	if (!passes->depth_pass) {
-		passes->depth_pass = DRW_pass_create("Clay Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+	/* Depth Pass */
+	{
+		passes->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
 
-		depthbatch = DRW_batch_create(data.depth_sh, passes->depth_pass);
-		pop_depth = true;
+		depthbatch = DRW_batch_create(data.depth_sh, passes->depth_pass, NULL);
 	}
 
-	if (!passes->clay_pass) {
-		DRWBatch *batch;
-		const int depthloc = 0;
-		const int matcaploc = 1;
-		const int jitterloc = 2;
-		const int sampleloc = 3;
-
+	/* Clay Pass */
+	{
 		passes->clay_pass = DRW_pass_create("Clay Pass", DRW_STATE_WRITE_COLOR);
 
-		batch = DRW_batch_create(data.clay_sh, passes->clay_pass);
-
-		DRW_batch_uniform_ivec2(batch, "screenres", DRW_viewport_size_get(), 1);
-		DRW_batch_uniform_buffer(batch, "depthtex", SCENE_DEPTH, depthloc);
-		DRW_batch_uniform_texture(batch, "matcaps", data.matcap_array, matcaploc);
-		DRW_batch_uniform_vec3(batch, "matcaps_color", (float *)data.matcap_colors, 24);
-		DRW_batch_uniform_vec2(batch, "matcap_rotation", (float *)data.matcap_rot, 1);
-		DRW_batch_uniform_int(batch, "matcap_index", &data.matcap_id, 1);
-		DRW_batch_uniform_vec3(batch, "matcap_hsv", (float *)data.matcap_hsv, 1);
-
-		/* SSAO */
-		DRW_batch_uniform_mat4(batch, "WinMatrix", (float *)data.winmat);
-		DRW_batch_uniform_vec4(batch, "viewvecs", (float *)data.viewvecs, 3);
-		DRW_batch_uniform_vec4(batch, "ssao_params_var", data.ssao_params_var, 1);
-		DRW_batch_uniform_vec4(batch, "ssao_params", data.ssao_params, 1);
-		DRW_batch_uniform_texture(batch, "ssao_jitter", data.jitter_tx, jitterloc);
-		DRW_batch_uniform_texture(batch, "ssao_samples", data.sampling_tx, sampleloc);
-
-		matcapbatch = batch;
-		pop_clay = true;
-	}
-
-	/* Update default material */
-	{
 		EngineDataClay *settings = DRW_render_settings();
+		CLAY_BatchStorage *storage = MEM_callocN(sizeof(CLAY_BatchStorage), "Clay BatchStorage");
 
-		data.matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
-		data.matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
+		/* Update default material */
+		storage->matcap_rot[0] = cosf(settings->matcap_rot * 3.14159f * 2.0f);
+		storage->matcap_rot[1] = sinf(settings->matcap_rot * 3.14159f * 2.0f);
 
-		data.matcap_hsv[0] = settings->matcap_hue;
-		data.matcap_hsv[1] = 1.0f;
-		data.matcap_hsv[2] = 1.0f;
+		storage->matcap_hsv[0] = settings->matcap_hue;
+		storage->matcap_hsv[1] = 1.0f;
+		storage->matcap_hsv[2] = 1.0f;
 
-		data.ssao_params_var[0] = settings->ssao_distance;
-		data.ssao_params_var[1] = settings->ssao_factor_cavity;
-		data.ssao_params_var[2] = settings->ssao_factor_edge;
-		data.ssao_params_var[3] = settings->ssao_attenuation;
-	}
+		storage->ssao_params_var[0] = settings->ssao_distance;
+		storage->ssao_params_var[1] = settings->ssao_factor_cavity;
+		storage->ssao_params_var[2] = settings->ssao_factor_edge;
+		storage->ssao_params_var[3] = settings->ssao_attenuation;
 
-	static bool first = true;
-	if (first) {
-		first = false;
+		if (settings->matcap_icon < ICON_MATCAP_01 ||
+		    settings->matcap_icon > ICON_MATCAP_24)
+		{
+			settings->matcap_icon = ICON_MATCAP_01;
+		}
 
-		/* TODO Why this is crashing? we want to start from an empty list
-		 * Seems like ob genericNode (see below) is freed two times */
-		// DRW_batch_surface_clear(matcapbatch);
-		// DRW_batch_surface_clear(depthbatch);
+		storage->matcap_id = matcap_to_index(settings->matcap_icon);
 
-		Object *ob;
-		FOREACH_OBJECT(sl, ob)
-		{
-			/* Create hash table of batch based on material id*/
+		defaultbatch = clay_batch_create(passes->clay_pass, storage);
+	}
+
+	/* TODO Create hash table of batch based on material id*/
+	FOREACH_OBJECT(sl, ob)
+	{
+		/* Add everything for now */
+		DRW_batch_surface_add(defaultbatch, ob);
 
-			/* Add everything for now */
-			if (pop_clay) {
-				DRW_batch_surface_add(matcapbatch, ob);
-			}
+		/* When encountering a new material :
+		 * - Create new Batch
+		 * - Initialize Batch
+		 * - Push it to the hash table
+		 * - The pass takes care of inserting it
+		 * next to the same shader calls */
 
-			if (pop_depth) {
-				DRW_batch_surface_add(depthbatch, ob);
-			}
+		DRW_batch_surface_add(depthbatch, ob);
 
-			/* Free hash table */
-		}
-		FOREACH_OBJECT_END
+		/* Free hash table */
 	}
+	FOREACH_OBJECT_END
 }
 
 static void clay_ssao_setup(void)
@@ 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list