[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