[Bf-blender-cvs] [fe0df0a] clay-engine: Beginning Clay Viewport Engine : - Added temporary draw_mesh function to render edit mesh - DRW_draw_batch_list allows to render a list of objects with optimal state change - All viewport rendering is done offscreen for the moment

Clément Foucault noreply at git.blender.org
Tue Jan 3 11:58:35 CET 2017


Commit: fe0df0a9729bbb43d9603672ca7aab927a800579
Author: Clément Foucault
Date:   Tue Jan 3 10:44:24 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBfe0df0a9729bbb43d9603672ca7aab927a800579

Beginning Clay Viewport Engine :
- Added temporary draw_mesh function to render edit mesh
- DRW_draw_batch_list allows to render a list of objects with optimal state change
- All viewport rendering is done offscreen for the moment

Signed-off-by: Clément Foucault <foucault.clem at gmail.com>

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

M	build_files/cmake/macros.cmake
M	source/blender/CMakeLists.txt
M	source/blender/draw/CMakeLists.txt
A	source/blender/draw/DRW_engine.h
D	source/blender/draw/DRW_engines.h
A	source/blender/draw/engines/clay/clay.c
R086	source/blender/draw/DRW_defines.h	source/blender/draw/engines/clay/clay.h
A	source/blender/draw/engines/clay/shaders/clay_debug_frag.glsl
A	source/blender/draw/engines/clay/shaders/clay_downsample_depth_frag.glsl
A	source/blender/draw/engines/clay/shaders/clay_frag.glsl
A	source/blender/draw/engines/clay/shaders/clay_vert.glsl
A	source/blender/draw/intern/DRW_render.h
A	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/gpu/GPU_framebuffer.h
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/GPU_viewport.h
M	source/blender/gpu/gawain/batch.c
M	source/blender/gpu/gawain/batch.h
M	source/blender/gpu/intern/gpu_framebuffer.c
M	source/blender/gpu/intern/gpu_shader.c
M	source/blender/gpu/intern/gpu_viewport.c
M	source/blender/render/CMakeLists.txt
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c

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

diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 2e3a190..8bb989f 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -604,6 +604,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
 		bf_modifiers
 		bf_bmesh
 		bf_gpu
+		bf_draw
 		bf_blenloader
 		bf_blenkernel
 		bf_physics
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index d49ceb1..057789b 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -98,6 +98,7 @@ add_subdirectory(windowmanager)
 add_subdirectory(blenkernel)
 add_subdirectory(blenlib)
 add_subdirectory(bmesh)
+add_subdirectory(draw)
 add_subdirectory(render)
 add_subdirectory(blenfont)
 add_subdirectory(blentranslation)
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 60449eb..dceb487 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -26,23 +26,23 @@
 set(INC
 	.
 	intern
-	nodes
-	operations
+	engines/clay
+
 	../blenkernel
 	../blenlib
 	../blentranslation
 	../imbuf
+	../depsgraph
 	../makesdna
 	../makesrna
-	../windowmanager
-	../nodes
-	../nodes/composite
-	../nodes/intern
+	../gpu
+	../editors/include
+	../editors/space_view3d
 	../render/extern/include
 	../render/intern/include
-	../../../extern/clew/include
+
+	../../../intern/glew-mx
 	../../../intern/guardedalloc
-	../../../intern/atomic
 )
 
 set(INC_SYS
@@ -50,13 +50,21 @@ set(INC_SYS
 )
 
 set(SRC
-	DRW_defines.h
+	intern/draw_manager.c
+	engines/clay/clay.c
+
+	intern/DRW_render.h
+	engines/clay/clay.h
 
+	./DRW_engine.h
 )
 
+data_to_c_simple(engines/clay/shaders/clay_frag.glsl SRC)
+data_to_c_simple(engines/clay/shaders/clay_vert.glsl SRC)
+data_to_c_simple(engines/clay/shaders/clay_downsample_depth_frag.glsl SRC)
+data_to_c_simple(engines/clay/shaders/clay_debug_frag.glsl SRC)
+
 list(APPEND INC
 )
 
-endif()
-
 blender_add_lib(bf_draw "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/draw/DRW_defines.h b/source/blender/draw/DRW_engine.h
similarity index 55%
copy from source/blender/draw/DRW_defines.h
copy to source/blender/draw/DRW_engine.h
index 212c39e..a35c5df 100644
--- a/source/blender/draw/DRW_defines.h
+++ b/source/blender/draw/DRW_engine.h
@@ -19,7 +19,41 @@
  *
  */
 
-#ifndef __DRW_DEFINES_H__
-#define __DRW_DEFINES_H__
+/** \file DRW_engine.h
+ *  \ingroup draw
+ */
+
+#ifndef __DRW_ENGINE_H__
+#define __DRW_ENGINE_H__
+
+typedef enum {
+	DRW_UNIFORM_INT,
+	DRW_UNIFORM_FLOAT,
+	DRW_UNIFORM_TEXTURE,
+	DRW_UNIFORM_BUFFER,
+	DRW_UNIFORM_MAT3,
+	DRW_UNIFORM_MAT4
+} DRWUniformType;
+
+typedef struct DRWUniform {
+	struct DRWUniform *next, *prev;
+	DRWUniformType type;
+	int location;
+	int length;
+	int arraysize;
+	int bindloc;
+	const void *value;
+} DRWUniform;
+
+typedef struct DRWInterface {
+	ListBase uniforms;
+	/* matrices */
+	int modelview;
+	int projection;
+	int modelviewprojection;
+	int normal;
+} DRWInterface;
+
+void DRW_viewport_engine_init(void);
 
-#endif  /* __DRW_DEFINES_H__ */
+#endif /* __DRW_ENGINE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/DRW_engines.h b/source/blender/draw/DRW_engines.h
deleted file mode 100644
index e69de29..0000000
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
new file mode 100644
index 0000000..aab9a85
--- /dev/null
+++ b/source/blender/draw/engines/clay/clay.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2016, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Blender Institute
+ *
+ */
+
+#include "DRW_render.h"
+
+#include "clay.h"
+
+/* Shaders */
+
+extern char datatoc_clay_frag_glsl[];
+extern char datatoc_clay_vert_glsl[];
+extern char datatoc_clay_downsample_depth_frag_glsl[];
+extern char datatoc_clay_debug_frag_glsl[];
+
+
+/* Storage */
+
+static struct CLAY_data {
+	/* Depth Pre Pass */
+	struct DRWPass *depth_pass;
+	struct GPUShader *depth_shader;
+	struct DRWInterface *depth_interface;
+	/* Depth Downsample Pass */
+	struct DRWPass *downsample_pass;
+	struct GPUShader *downsample_shader;
+	struct DRWInterface *downsample_interface;
+	/* Shading Pass */
+	struct DRWPass *clay_pass;
+	struct GPUShader *clay_shader;
+	struct DRWInterface *clay_interface;
+
+	/* Debug Pass */
+	struct DRWPass *debug_pass;
+	struct GPUShader *debug_shader;
+	struct DRWInterface *debug_interface;
+} data = {NULL};
+
+/* keep it under MAX_BUFFERS */
+typedef struct CLAY_FramebufferList{
+	/* default */
+	struct GPUFrameBuffer *default_fb;
+	/* engine specific */
+	struct GPUFrameBuffer *downsample_depth;
+} CLAY_FramebufferList;
+
+/* keep it under MAX_TEXTURES */
+typedef struct CLAY_TextureList{
+	/* default */
+	struct GPUTexture *color;
+	struct GPUTexture *depth;
+	/* engine specific */
+	struct GPUTexture *depth_low;
+} CLAY_TextureList;
+
+/* for clarity follow the same layout as TextureList */
+#define SCENE_COLOR 0
+#define SCENE_DEPTH 1
+#define SCENE_DEPTH_LOW 2
+
+/* Functions */
+
+static void clay_init_engine(void)
+{
+	DRWBatch *batch;
+
+	/* Depth prepass */
+	{
+		data.depth_shader = DRW_shader_create_3D_depth_only();
+		data.depth_interface = DRW_interface_create(data.depth_shader);
+
+		data.depth_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass depth_pass");
+		data.depth_pass->state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
+
+		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+		batch->shader = data.depth_shader;
+		batch->interface = data.depth_interface;
+		BLI_addtail(&data.depth_pass->batches, batch);
+	}
+
+	/* Downsample pass */
+	{
+		data.downsample_shader = DRW_shader_create_2D(datatoc_clay_downsample_depth_frag_glsl, NULL);
+		data.downsample_interface = DRW_interface_create(data.downsample_shader);
+		DRW_interface_uniform_int(data.downsample_shader, data.downsample_interface, "screenres", DRW_get_viewport_size(), 2);
+		DRW_interface_uniform_buffer(data.downsample_shader, data.downsample_interface, "depthtex", SCENE_DEPTH, 0);
+
+		data.downsample_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass downsample_pass");
+		data.downsample_pass->state = DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR;
+
+		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+		batch->shader = data.downsample_shader;
+		batch->interface = data.downsample_interface;		
+		BLI_addtail(&data.downsample_pass->batches, batch);		
+	}
+
+	/* Shading pass */
+	{
+		data.clay_shader = DRW_shader_create(datatoc_clay_vert_glsl, NULL, datatoc_clay_frag_glsl, NULL);
+		data.clay_interface = DRW_interface_create(data.clay_shader);
+		//DRW_interface_uniform_int(data.clay_shader, data.clay_interface, "screenres", DRW_get_viewport_size(), 2);
+		//DRW_interface_uniform_float(data.clay_shader, data.clay_interface, "color", col, 4);
+
+		data.clay_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass clay_pass");
+		data.clay_pass->state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL;
+
+		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+		batch->shader = data.clay_shader;
+		batch->interface = data.clay_interface;
+		BLI_addtail(&data.clay_pass->batches, batch);		
+	}
+
+	/* Debug */
+	{
+		data.debug_shader = DRW_shader_create_2D(datatoc_clay_debug_frag_glsl, NULL);
+		data.debug_interface = DRW_interface_create(data.debug_shader);
+		DRW_interface_uniform_int(data.debug_shader, data.debug_interface, "screenres", DRW_get_viewport_size(), 2);
+		DRW_interface_uniform_buffer(data.debug_shader, data.debug_interface, "depthtex", SCENE_DEPTH_LOW, 0);
+
+		data.debug_pass = (DRWPass *)MEM_callocN(sizeof(DRWPass), "DRWPass debug_pass");
+		data.debug_pass->state = DRW_STATE_WRITE_COLOR;
+
+		batch = (DRWBatch *)MEM_callocN(sizeof(DRWBatch), "DRWBatch");
+		batch->shader = data.debug_shader;
+		batch->interface = data.debug_interface;
+		BLI_addtail(&data.debug_pass->batches, batch);		
+	}
+}
+
+static void clay_init_view(CLAY_FramebufferList *buffers, CLAY_TextureList *textures)
+{
+	int *viewsize = DRW_get_viewport_size();
+
+	DRWFboTexture depth = {&textures->depth_low, DRW_BUF_R_16};
+
+	DRW_framebuffer_init(&buffers->downsample_depth, viewsize[0]/2, viewsize[1]/2, &depth, 1);
+}
+
+static void clay_populate_batch(const struct bContext *C)
+{
+	Scene *scene = CTX_data_scene(C);
+	Scene *sce_iter;
+	Base *base;
+	DRWBatch *matcapbatch = data.clay_pass->batches.first;
+	DRWBatch *depthbatch = data.depth_pass->batches.first;
+
+	for (SETLOOPER(scene, sce_iter, base)) {
+		/* Add everything for now */
+		BLI_addtail(&matcapbatch->objects, base);
+		BLI_addtail(&depthbatch->objects, base);
+	}
+}
+
+static void clay_view_draw(RenderEngine *UNUSED(engine), const struct bContext *context)
+{
+	/* This function may run for multiple viewports
+	 * so get the current viewport buffers */
+	CLAY_FramebufferList *buffers = NULL;
+	CLAY_TextureList *textures = NULL;
+
+	DRW_init_viewport(context, (void **)&buffers, (void **)&textures);
+	
+	if (!data.clay_shader)
+		clay_init_engine();
+
+	clay_init_view(buffers, textures);
+
+	/* TODO : tag to refresh by the deps graph */
+	/* ideally only refresh when objects are added/removed */
+	/* or render properties / materials change */
+	static bool first = true;
+	if (first) {
+		first = false;
+		clay_populate_batch(context);
+	}
+
+	DRW_draw_background();
+
+	/* Step 1 : Depth pre-pass */
+	DRW_draw_pass(data.depth_pass, context);
+
+	/* Step 2 : downsample the depth buffer to a new buffer */
+	DRW_framebuffer_bind(buffers->downsample_depth);
+	DRW_draw_pa

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list