[Bf-blender-cvs] [63dcb04a712] greasepencil-object: Cleanup GP multisample code

Antonio Vazquez noreply at git.blender.org
Sun Jun 10 20:19:11 CEST 2018


Commit: 63dcb04a712888513f3459433ccd2b93cd03ef8f
Author: Antonio Vazquez
Date:   Sun Jun 10 20:18:53 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB63dcb04a712888513f3459433ccd2b93cd03ef8f

Cleanup GP multisample code

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

M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index e829ad25549..b6e9ae1acb1 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -75,16 +75,18 @@ static GPENCIL_e_data e_data = {NULL}; /* Engine data */
 void DRW_gpencil_multisample_ensure(GPENCIL_Data *vedata, int rect_w, int rect_h)
 {
 	GPENCIL_FramebufferList *fbl = vedata->fbl;
+	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	short samples = stl->storage->multisamples;
 
-	if (U.gpencil_multisamples > 0) {
+	if (samples > 0) {
 		if (!fbl->multisample_fb) {
 			fbl->multisample_fb = GPU_framebuffer_create();
 			if (fbl->multisample_fb) {
 				if (e_data.multisample_color == NULL) {
-					e_data.multisample_color = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_RGBA8, NULL, U.gpencil_multisamples, NULL);
+					e_data.multisample_color = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_RGBA8, NULL, samples, NULL);
 				}
 				if (e_data.multisample_depth == NULL) {
-					e_data.multisample_depth = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_DEPTH24_STENCIL8, NULL, U.gpencil_multisamples, NULL);
+					e_data.multisample_depth = GPU_texture_create_2D_multisample(rect_w, rect_h, GPU_DEPTH24_STENCIL8, NULL, samples, NULL);
 				}
 				GPU_framebuffer_ensure_config(&fbl->multisample_fb, {
 					GPU_ATTACHMENT_TEXTURE(e_data.multisample_depth),
@@ -101,6 +103,7 @@ void DRW_gpencil_multisample_ensure(GPENCIL_Data *vedata, int rect_w, int rect_h
 static void GPENCIL_create_framebuffers(void *vedata)
 {
 	GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
+	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
 
 	/* Go full 32bits for rendering */
 	GPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F;
@@ -110,7 +113,7 @@ static void GPENCIL_create_framebuffers(void *vedata)
 		const int size[2] = { (int)viewport_size[0], (int)viewport_size[1] };
 
 		/* create multiframe framebuffer for AA */
-		if (U.gpencil_multisamples > 0) {
+		if (stl->storage->multisamples > 0) {
 			DRW_gpencil_multisample_ensure(vedata, size[0], size[1]);
 		}
 
@@ -200,13 +203,6 @@ static void GPENCIL_create_shaders(void)
 void GPENCIL_engine_init(void *vedata)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
-
-	/* create framebuffers */
-	GPENCIL_create_framebuffers(vedata);
-
-	/* create shaders */
-	GPENCIL_create_shaders();
-
 	/* init storage */
 	if (!stl->storage) {
 		stl->storage = MEM_callocN(sizeof(GPENCIL_Storage), "GPENCIL_Storage");
@@ -215,6 +211,14 @@ void GPENCIL_engine_init(void *vedata)
 		unit_m4(stl->storage->unit_matrix);
 	}
 
+	stl->storage->multisamples = U.gpencil_multisamples;
+
+	/* create framebuffers */
+	GPENCIL_create_framebuffers(vedata);
+
+	/* create shaders */
+	GPENCIL_create_shaders();
+
 	/* blank texture used if no texture defined for fill shader */
 	if (!e_data.gpencil_blank_texture) {
 		float rect[16][16][4] = {{{0.0f}}};
@@ -582,28 +586,16 @@ void GPENCIL_draw_scene(void *ved)
 	if ((!is_render) && (stl->g_data->session_flag & GP_DRW_PAINT_PAINTING)) {
 		GPU_framebuffer_bind(dfbl->default_fb);
 
-		/* attach multisample textures */
-		if (U.gpencil_multisamples > 0) {
-			GPU_framebuffer_texture_attach(fbl->multisample_fb, e_data.multisample_depth, 0, 0);
-			GPU_framebuffer_texture_attach(fbl->multisample_fb, e_data.multisample_color, 0, 0);
-		}
-
-		MULTISAMPLE_GP_SYNC_ENABLE(U.gpencil_multisamples, fbl);
+		MULTISAMPLE_GP_SYNC_ENABLE(stl->storage->multisamples, fbl);
 
 		DRW_draw_pass(psl->painting_pass);
 		DRW_draw_pass(psl->drawing_pass);
 
-		MULTISAMPLE_GP_SYNC_DISABLE(U.gpencil_multisamples, fbl, dfbl->default_fb, e_data);
+		MULTISAMPLE_GP_SYNC_DISABLE(stl->storage->multisamples, fbl, dfbl->default_fb, e_data);
 
 		/* free memory */
 		gpencil_free_obj_list(stl);
 
-		/* detach multisample */
-		if (U.gpencil_multisamples > 0) {
-			GPU_framebuffer_texture_detach(fbl->multisample_fb, e_data.multisample_depth);
-			GPU_framebuffer_texture_detach(fbl->multisample_fb, e_data.multisample_color);
-		}
-
 		return;
 	}
 
@@ -615,11 +607,6 @@ void GPENCIL_draw_scene(void *ved)
 		GPU_framebuffer_texture_attach(fbl->painting_fb, e_data.painting_depth_tx, 0, 0);
 		GPU_framebuffer_texture_attach(fbl->painting_fb, e_data.painting_color_tx, 0, 0);
 
-		if (U.gpencil_multisamples > 0) {
-			GPU_framebuffer_texture_attach(fbl->multisample_fb, e_data.multisample_depth, 0, 0);
-			GPU_framebuffer_texture_attach(fbl->multisample_fb, e_data.multisample_color, 0, 0);
-		}
-
 		/* Draw all pending objects */
 		if (stl->g_data->gp_cache_used > 0) {
 
@@ -641,13 +628,13 @@ void GPENCIL_draw_scene(void *ved)
 				 * draw only a subset that usually start with a fill and end with stroke because the
 				 * shading groups are created by pairs */
 				if (end_grp >= init_grp) {
-					MULTISAMPLE_GP_SYNC_ENABLE(U.gpencil_multisamples, fbl);
+					MULTISAMPLE_GP_SYNC_ENABLE(stl->storage->multisamples, fbl);
 
 					DRW_draw_pass_subset(psl->stroke_pass,
 						stl->shgroups[init_grp].shgrps_fill != NULL ? stl->shgroups[init_grp].shgrps_fill : stl->shgroups[init_grp].shgrps_stroke,
 						stl->shgroups[end_grp].shgrps_stroke);
 
-					MULTISAMPLE_GP_SYNC_DISABLE(U.gpencil_multisamples, fbl, fbl->temp_fb_a, e_data);
+					MULTISAMPLE_GP_SYNC_DISABLE(stl->storage->multisamples, fbl, fbl->temp_fb_a, e_data);
 				}
 				/* Current buffer drawing */
 				if ((!is_render) && (gpd->sbuffer_size > 0)) {
@@ -688,11 +675,6 @@ void GPENCIL_draw_scene(void *ved)
 		GPU_framebuffer_texture_detach(fbl->painting_fb, e_data.painting_depth_tx);
 		GPU_framebuffer_texture_detach(fbl->painting_fb, e_data.painting_color_tx);
 
-		if (U.gpencil_multisamples > 0) {
-			GPU_framebuffer_texture_detach(fbl->multisample_fb, e_data.multisample_depth);
-			GPU_framebuffer_texture_detach(fbl->multisample_fb, e_data.multisample_color);
-		}
-
 		/* attach again default framebuffer after detach textures */
 		if (!is_render) {
 			GPU_framebuffer_bind(dfbl->default_fb);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 21e169a1c56..3b4a0fcf1a0 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -103,6 +103,7 @@ typedef struct GPENCIL_Storage {
 	const float *pixsize;
 	float render_pixsize;
 	int tonemapping;
+	short multisamples;
 
 	/* simplify settings*/
 	bool simplify_fill;
@@ -285,7 +286,6 @@ void GPENCIL_render_to_image(void *vedata, struct RenderEngine *engine, struct R
 	if ((lvl > 0) && (fbl->multisample_fb != NULL)) { \
 		DRW_stats_query_start("GP Multisample Blit"); \
 		GPU_framebuffer_bind(fbl->multisample_fb); \
-		/* TODO clear only depth but need to do alpha to coverage for transparencies. */ \
 		GPU_framebuffer_clear_color_depth(fbl->multisample_fb, (const float[4]){0.0f}, 1.0f); \
 		DRW_stats_query_end(); \
 	} \



More information about the Bf-blender-cvs mailing list