[Bf-blender-cvs] [141c2cf1501] soc-2018-npr: Multisample implementing, f 12 won't work either.

Nick Wu noreply at git.blender.org
Fri Jun 29 06:02:18 CEST 2018


Commit: 141c2cf1501a9607c2fb01da58a72dcdbb1d596b
Author: Nick Wu
Date:   Fri Jun 29 12:01:12 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB141c2cf1501a9607c2fb01da58a72dcdbb1d596b

Multisample implementing, f 12 won't work either.

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/lanpr_snake.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 82a7d355c81..ecfe1770629 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -122,6 +122,12 @@ typedef struct LANPR_FramebufferList {
 	struct GPUFrameBuffer *dpix_transform;
 	struct GPUFrameBuffer *dpix_preview;
 
+	/* Software */
+	struct GPUFrameBuffer *software_ms;
+
+	/* MS Resolve */
+	struct GPUFrameBuffer *ms_resolve;
+
 } LANPR_FramebufferList;
 
 typedef struct LANPR_TextureList {
@@ -141,6 +147,10 @@ typedef struct LANPR_TextureList {
 	struct GPUTexture *dpix_out_pr;
 	struct GPUTexture *dpix_out_length;
 
+	/* multisample resolve */
+	struct GPUTexture *ms_resolve_depth;
+	struct GPUTexture *ms_resolve_color;
+
 } LANPR_TextureList;
 
 typedef struct LANPR_PrivateData {
@@ -763,9 +773,8 @@ int lanpr_feed_atlas_data_obj(void *vedata,
                               Object *ob, int BeginIndex);
 int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, int BeginIndex);
 
-void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr);
-
+//DPIX
+void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB);
 
 //snake
-
-void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr);
+void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB);
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 1ee7e995338..10a3fd20486 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -268,14 +268,11 @@ int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, int BeginInde
 }
 
 
-void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr){
+void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB) {
 	float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 	float clear_depth = 1.0f;
 	uint clear_stencil = 0xFF;
 
-	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-
 	int texw = GPU_texture_width(txl->edge_intermediate), texh = GPU_texture_height(txl->edge_intermediate);;
 	int tsize = texw * texh;
 
@@ -310,7 +307,7 @@ void lanpr_dpix_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, L
 	GPU_framebuffer_clear(fbl->dpix_preview, clear_bits, lanpr->background_color, clear_depth, clear_stencil);
 	DRW_draw_pass(psl->dpix_preview_pass);
 
-	GPU_framebuffer_bind(dfbl->default_fb);
-	GPU_framebuffer_clear(dfbl->default_fb, clear_bits, lanpr->background_color, clear_depth, clear_stencil);
+	GPU_framebuffer_bind(DefaultFB);
+	GPU_framebuffer_clear(DefaultFB, clear_bits, lanpr->background_color, clear_depth, clear_stencil);
 	DRW_multisamples_resolve(txl->depth, txl->color);
 }
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 84522c971e3..ab5f9686535 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -2,6 +2,7 @@
 #include "DRW_render.h"
 #include "BLI_listbase.h"
 #include "BLI_linklist.h"
+#include "BLI_math_matrix.h"
 #include "lanpr_all.h"
 #include "DRW_render.h"
 #include "BKE_object.h"
@@ -171,6 +172,16 @@ static void lanpr_engine_init(void *ved){
 				NULL, NULL);
 	}
 
+	GPU_framebuffer_ensure_config(&fbl->software_ms, {
+		GPU_ATTACHMENT_TEXTURE(txl->depth),
+		GPU_ATTACHMENT_TEXTURE(txl->color),
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE
+	});
+
 }
 static void lanpr_engine_free(void){
 	void *ved = OneTime.ved;
@@ -323,7 +334,7 @@ static void lanpr_cache_init(void *vedata){
 			BLI_mempool_clear(pd->mp_batch_list);
 		}
 	}elif(lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE) {
-		psl->software_pass = DRW_pass_create("Software Render Preview", DRW_STATE_WRITE_COLOR);
+		psl->software_pass = DRW_pass_create("Software Render Preview",  DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS);
 		LANPR_LineLayer* ll;
 		for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
 			ll->shgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
@@ -403,7 +414,7 @@ static void lanpr_cache_finish(void *vedata){
 	}
 }
 
-static void lanpr_draw_scene(void *vedata) {
+static void lanpr_draw_scene_exec(void *vedata, GPUFrameBuffer* dfb) {
 	LANPR_PassList *psl = ((LANPR_Data *)vedata)->psl;
 	LANPR_TextureList *txl = ((LANPR_Data *)vedata)->txl;
 	LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
@@ -413,15 +424,10 @@ static void lanpr_draw_scene(void *vedata) {
 	float clear_depth = 1.0f;
 	uint clear_stencil = 0xFF;
 
-	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-
 	GPU_framebuffer_bind(fbl->passes);
 	GPUFrameBufferBits clear_bits = GPU_DEPTH_BIT | GPU_COLOR_BIT;
 	GPU_framebuffer_clear(fbl->passes, clear_bits, clear_col, clear_depth, clear_stencil);
 
-	DRW_draw_pass(psl->color_pass);
-
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	Scene *scene = DEG_get_evaluated_scene(draw_ctx->depsgraph);
 	SceneLANPR *lanpr = &scene->lanpr;
@@ -436,17 +442,28 @@ static void lanpr_draw_scene(void *vedata) {
 	}
 
 	if (lanpr->master_mode == LANPR_MASTER_MODE_DPIX) {
-		lanpr_dpix_draw_scene(txl, fbl, psl, stl->g_data, lanpr);
+		DRW_draw_pass(psl->color_pass);
+		lanpr_dpix_draw_scene(txl, fbl, psl, stl->g_data, lanpr, dfb);
 	}
 	elif(lanpr->master_mode == LANPR_MASTER_MODE_SNAKE) {
-		lanpr_snake_draw_scene(txl, fbl, psl, stl->g_data, lanpr);
+		DRW_draw_pass(psl->color_pass);
+		lanpr_snake_draw_scene(txl, fbl, psl, stl->g_data, lanpr, dfb);
 	}
 	elif(lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE) {
-		GPU_framebuffer_bind(dfbl->default_fb);
+		GPU_framebuffer_bind(dfb);
+
+		DRW_draw_pass(psl->color_pass);
+
 		DRW_draw_pass(psl->software_pass);
+
 	}
 }
 
+static void lanpr_draw_scene(void *vedata) {
+	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+	lanpr_draw_scene_exec(vedata, dfbl->default_fb);
+}
+
 void LANPR_render_cache(
 	void *vedata, struct Object *ob,
 	struct RenderEngine *engine, struct Depsgraph *UNUSED(depsgraph)){
@@ -471,18 +488,18 @@ static void lanpr_render_to_image(LANPR_Data *vedata, RenderEngine *engine, stru
 	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
-	/* TODO 32 bit depth */
-	DRW_texture_ensure_fullscreen_2D(&dtxl->depth, GPU_DEPTH_COMPONENT32F, 0);
-	DRW_texture_ensure_fullscreen_2D(&dtxl->color, GPU_RGBA32F, DRW_TEX_FILTER | DRW_TEX_MIPMAP);
+	DRW_texture_ensure_fullscreen_2D(&txl->ms_resolve_depth, GPU_DEPTH_COMPONENT32F, 0);
+	DRW_texture_ensure_fullscreen_2D(&txl->ms_resolve_color, GPU_RGBA32F, 0);
 
-	GPU_framebuffer_ensure_config(&dfbl->default_fb, {
-		GPU_ATTACHMENT_TEXTURE(dtxl->depth),
-		GPU_ATTACHMENT_TEXTURE(dtxl->color),
+	GPU_framebuffer_ensure_config(&fbl->ms_resolve, {
+		GPU_ATTACHMENT_TEXTURE(txl->ms_resolve_depth),
+		GPU_ATTACHMENT_TEXTURE(txl->ms_resolve_color),
+		GPU_ATTACHMENT_LEAVE,
+		GPU_ATTACHMENT_LEAVE,
 		GPU_ATTACHMENT_LEAVE,
 		GPU_ATTACHMENT_LEAVE,
 		GPU_ATTACHMENT_LEAVE
 	});
-
 	scene->lanpr.reloaded = 1;
 
 	lanpr_engine_init(vedata);
@@ -490,14 +507,13 @@ static void lanpr_render_to_image(LANPR_Data *vedata, RenderEngine *engine, stru
 	DRW_render_object_iter(vedata, engine, draw_ctx->depsgraph, LANPR_render_cache);
 	lanpr_cache_finish(vedata);
 
-	lanpr_draw_scene(vedata);
-
+	lanpr_draw_scene_exec(vedata, fbl->ms_resolve);
 
 	// read it back so we can again display and save it.
 	const char *viewname = RE_GetActiveRenderView(engine->re);
 	RenderPass *rp = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname);
-	GPU_framebuffer_bind(dfbl->default_fb);
-	GPU_framebuffer_read_color(dfbl->default_fb,
+	GPU_framebuffer_bind(fbl->ms_resolve);
+	GPU_framebuffer_read_color(fbl->ms_resolve,
 	                           rect->xmin, rect->ymin,
 	                           BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
 	                           4, 0, rp->rect);
diff --git a/source/blender/draw/engines/lanpr/lanpr_snake.c b/source/blender/draw/engines/lanpr/lanpr_snake.c
index 0455f27d263..72ba4218d98 100644
--- a/source/blender/draw/engines/lanpr/lanpr_snake.c
+++ b/source/blender/draw/engines/lanpr/lanpr_snake.c
@@ -302,15 +302,12 @@ Gwn_Batch *lanpr_get_snake_batch(LANPR_PrivateData *pd){
 	return GWN_batch_create_ex(GWN_PRIM_LINES_ADJ, vbo, GWN_indexbuf_build(&elb), GWN_USAGE_STATIC | GWN_BATCH_OWNS_VBO);
 }
 
-void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr){
+void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl, LANPR_PassList *psl, LANPR_PrivateData *pd, SceneLANPR *lanpr, GPUFrameBuffer* DefaultFB){
 	GPUFrameBufferBits clear_bits = GPU_COLOR_BIT | GPU_DEPTH_BIT;
 	float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
 	float clear_depth = 1.0f;
 	uint clear_stencil = 0xFF;
 
-	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	Scene *scene = DEG_get_evaluated_scene(draw_ctx->depsgraph);
 	View3D *v3d = draw_ctx->v3d;
@@ -334,7 +331,7 @@ void lanpr_snake_draw_scene(LANPR_TextureList *txl, LANPR_FramebufferList *fbl,
 	DRW_draw_pass(psl->edge_intermediate);
 
 	if ((!lanpr->enable_vector_trace) && (!lanpr-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list