Commit: efa46d7db0e395d6b1380432e5de5bf2a628c81d
Author: Clément Foucault
Date:   Mon Jan 23 09:54:54 2017 +0100
Branches: clay-engine
https://developer.blender.org/rBefa46d7db0e395d6b1380432e5de5bf2a628c81d

Initial support of Uniform Buffer objects

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

M       source/blender/draw/engines/clay/clay.c
M       source/blender/draw/engines/clay/shaders/clay_frag.glsl
M       source/blender/draw/engines/clay/shaders/ssao_alchemy.glsl
M       source/blender/draw/engines/clay/shaders/ssao_groundtruth.glsl
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/gpu/CMakeLists.txt
M       source/blender/gpu/GPU_extensions.h
M       source/blender/gpu/GPU_shader.h
A       source/blender/gpu/GPU_uniformbuffer.h
M       source/blender/gpu/intern/gpu_extensions.c
M       source/blender/gpu/intern/gpu_shader.c
A       source/blender/gpu/intern/gpu_uniformbuffer.c

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

diff --git a/source/blender/draw/engines/clay/clay.c 
b/source/blender/draw/engines/clay/clay.c
index 48fbb435e3..14ef27fa55 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -43,11 +43,31 @@ extern char datatoc_ssao_groundtruth_glsl[];
 
 /* Storage */
 
+/* UBOs data needs to be 16 byte aligned (size of vec4) */
+/* Reminder : float, int, bool are 4 bytes */
+typedef struct CLAY_UBO_Material {
+       float ssao_params_var[4];
+       /* - 16 -*/
+       float matcap_hsv[3];
+       float matcap_id; /* even float encoding have enough precision */
+       /* - 16 -*/
+       float matcap_rot[2];
+       float pad[2]; /* ensure 16 bytes alignement */
+} CLAY_UBO_Material; /* 48 bytes */
+
+typedef struct CLAY_UBO_Storage {
+       CLAY_UBO_Material materials[512]; /* 512 = 9 bit material id */
+} CLAY_UBO_Storage;
+
 static struct CLAY_data {
        /* Depth Pre Pass */
        struct GPUShader *depth_sh;
        /* Shading Pass */
-       struct GPUShader *clay_sh[8];
+       struct GPUShader *clay_sh;
+
+       /* Materials Parameter UBO */
+       struct GPUUniformBuffer *mat_ubo;
+       CLAY_UBO_Storage mat_storage;
 
        /* Matcap textures */
        struct GPUTexture *matcap_array;
@@ -61,18 +81,6 @@ static struct CLAY_data {
        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 */
@@ -268,25 +276,18 @@ static void CLAY_engine_init(void)
                data.depth_sh = DRW_shader_create_3D_depth_only();
        }
 
+       if (!data.mat_ubo) {
+               data.mat_ubo = 
DRW_uniformbuffer_create(sizeof(CLAY_UBO_Storage), NULL);
+       }
+
        /* Shading pass */
-       if (!data.clay_sh[0]) {
+       if (!data.clay_sh) {
                DynStr *ds = BLI_dynstr_new();
-               const char *with_all =
-                       "#define USE_AO;\n"
-                       "#define USE_HSV;\n"
-                       "#define USE_ROTATION;\n";
-               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";
+               const char *max_mat =
+                       "#define MAX_MATERIAL 512\n"
+                       "#define USE_ROTATION\n"
+                       "#define USE_AO\n"
+                       "#define USE_HSV\n";
                char *matcap_with_ao;
 
                BLI_dynstr_append(ds, datatoc_clay_frag_glsl);
@@ -298,80 +299,49 @@ static void CLAY_engine_init(void)
 
                matcap_with_ao = BLI_dynstr_get_cstring(ds);
 
-               data.clay_sh[WITH_ALL] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_all);
-               data.clay_sh[WITH_HSV_ROT] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_hsv_rot);
-               data.clay_sh[WITH_AO_ROT] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_ao_rot);
-               data.clay_sh[WITH_AO_HSV] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_ao_hsv);
-               data.clay_sh[WITH_AO] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_ao);
-               data.clay_sh[WITH_ROT] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_rot);
-               data.clay_sh[WITH_HSV] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, with_hsv);
-               data.clay_sh[WITH_NONE] = 
DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, NULL);
+               data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, 
matcap_with_ao, max_mat);
 
                BLI_dynstr_free(ds);
                MEM_freeN(matcap_with_ao);
        }
 }
 
-static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *matcap_id, 
float *matcap_rot, float *matcap_hsv, float *ssao_params_var)
+static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int matcap_id, 
float matcap_rot[2], float matcap_hsv[3], float ssao_params_var[4])
 {
        const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
-       const bool use_rot = (matcap_rot[1] != 0.0f);
-       const bool use_ao = (ssao_params_var[1] != 0.0f || ssao_params_var[2] 
!= 0.0f);
-       const bool use_hsv = (matcap_hsv[0] != 0.5f || matcap_hsv[1] != 0.5f || 
matcap_hsv[2] != 0.5f);
-       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];
-       }
-
-       DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
+       CLAY_UBO_Material *mat = &data.mat_storage.materials[0];
+       DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass);
 
        DRW_shgroup_uniform_ivec2(grp, "screenres", DRW_viewport_size_get(), 1);
        DRW_shgroup_uniform_buffer(grp, "depthtex", SCENE_DEPTH, depthloc);
        DRW_shgroup_uniform_texture(grp, "matcaps", data.matcap_array, 
matcaploc);
-       DRW_shgroup_uniform_int(grp, "matcap_index", matcap_id, 1);
        DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)data.winmat);
        DRW_shgroup_uniform_vec4(grp, "viewvecs", (float *)data.viewvecs, 3);
        DRW_shgroup_uniform_vec4(grp, "ssao_params", data.ssao_params, 1);
+       DRW_shgroup_uniform_vec3(grp, "matcaps_color", (float 
*)data.matcap_colors, 24);
 
-       if (use_rot) {
-               DRW_shgroup_uniform_vec2(grp, "matcap_rotation", matcap_rot, 1);
-       }
+       mat->matcap_id = matcap_id;
+       copy_v3_v3(mat->matcap_hsv, matcap_hsv);
+       copy_v2_v2(mat->matcap_rot, matcap_rot);
+       copy_v4_v4(mat->ssao_params_var, ssao_params_var);
 
-       if (use_hsv) {
-               DRW_shgroup_uniform_vec3(grp, "matcap_hsv", matcap_hsv, 1);
-       }
+       mat = &data.mat_storage.materials[1];
+       mat->matcap_id = matcap_id + 1;
+       copy_v3_v3(mat->matcap_hsv, matcap_hsv);
+       copy_v2_v2(mat->matcap_rot, matcap_rot);
+       copy_v4_v4(mat->ssao_params_var, ssao_params_var);
+
+       mat = &data.mat_storage.materials[2];
+       mat->matcap_id = matcap_id + 2;
+       copy_v3_v3(mat->matcap_hsv, matcap_hsv);
+       copy_v2_v2(mat->matcap_rot, matcap_rot);
+       copy_v4_v4(mat->ssao_params_var, ssao_params_var);
 
-       if (use_ao) {
-               DRW_shgroup_uniform_vec3(grp, "matcaps_color", (float 
*)data.matcap_colors, 24);
-               DRW_shgroup_uniform_vec4(grp, "ssao_params_var", 
ssao_params_var, 1);
 #ifndef GTAO
-               DRW_shgroup_uniform_texture(grp, "ssao_jitter", data.jitter_tx, 
jitterloc);
-               DRW_shgroup_uniform_texture(grp, "ssao_samples", 
data.sampling_tx, sampleloc);
+       DRW_shgroup_uniform_texture(grp, "ssao_jitter", data.jitter_tx, 
jitterloc);
+       DRW_shgroup_uniform_texture(grp, "ssao_samples", data.sampling_tx, 
sampleloc);
 #endif
-       }
-
 
        return grp;
 }
@@ -411,7 +381,7 @@ static void 
CLAY_update_materials_runtime(MaterialSettingsClay *settings)
 static void CLAY_create_cache(CLAY_PassList *passes, const struct bContext *C)
 {
        SceneLayer *sl = CTX_data_scene_layer(C);
-       DRWShadingGroup *defaultbatch, *depthbatch;
+       DRWShadingGroup *default_shgrp, *depthbatch;
        Object *ob;
 
        /* Depth Pass */
@@ -432,7 +402,9 @@ static void CLAY_create_cache(CLAY_PassList *passes, const 
struct bContext *C)
                CLAY_update_materials_runtime(&settings->defsettings);
                runtime = settings->defsettings.runtime;
 
-               defaultbatch = CLAY_shgroup_create(passes->clay_pass, 
&runtime->matcap_id, runtime->matcap_rot, runtime->matcap_hsv, 
runtime->ssao_params_var);
+               default_shgrp = CLAY_shgroup_create(passes->clay_pass, 
runtime->matcap_id, runtime->matcap_rot, runtime->matcap_hsv, 
runtime->ssao_params_var);
+               DRW_shgroup_uniform_block(default_shgrp, "material_block", 
data.mat_ubo, 0);
+               DRW_uniformbuffer_update(data.mat_ubo, &data.mat_storage);
        }
 
        /* Object Mode */
@@ -447,7 +419,7 @@ static void CLAY_create_cache(CLAY_PassList *passes, const 
struct bContext *C)
                        struct Batch *geom = DRW_cache_surface_get(ob);
 
                        /* Add everything for now */
-                       DRW_shgroup_call_add(defaultbatch, geom, &ob->obmat);
+                       DRW_shgroup_call_add(default_shgrp, geom, &ob->obmat);
 
                        /* When encountering a new material :
                         * - Create new Batch
@@ -541,7 +513,7 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), 
const struct bContext *
        /* Pass 1 : Depth pre-pass */
        DRW_draw_pass(passes->depth_pass);
 
-       /* Pass 2 : Downsample Depth */
+       /* Pass 2 (Optionnal) : Separated Downsampled AO */
        DRW_framebuffer_texture_detach(textures->depth);
        /* TODO */
 
@@ -560,29 +532,8 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), 
const struct bContext *
 void clay_engine_free(void)
 {
        /* data.depth_sh Is builtin so it's automaticaly freed */
-       if (data.clay_sh[WITH_ALL]) {
-               DRW_shader_free(data.clay_sh[WITH_ALL]);
-       }
-       if (data.clay_sh[WITH_HSV_ROT]) {
-               DRW_shader_free(data.clay_sh[WITH_HSV_ROT]);
-       }
-       if (data.clay_sh[WITH_AO_ROT]) {
-               DRW_shader_free(data.clay_sh[WITH_AO_ROT]);
-       }
-       if (data.clay_sh[WITH_AO_HSV]) {
-               DRW_shader_free(data.clay_sh[WITH_AO_HSV]);
-       }
-       if (data.clay_sh[WITH_AO]) {
-               DRW_shader_free(data.clay_sh[WITH_AO]);
-       }
-       if (data.clay_sh[WITH_ROT]) {
-               DRW_shader_free(data.clay_sh[WITH_ROT]);
-       }
-       if (data.clay_sh[WITH_HSV]) {
-               DRW_shader_free(data.clay_sh[WITH_HSV]);
-       }
-       if (data.clay_sh[WITH_NONE]) {
-               DRW_shader_free(data.clay_sh[WITH_NONE]);
+       if (data.clay_sh) {
+               DRW_shader_free(data.clay_sh);
        }
 
        if (data.matcap_array) {
@@ -596,6 +547,10 @@ void clay_engine_free(void)
        if (data.sampling_tx) {
                DRW_texture_free(data.sampling_tx);
        }
+
+       if (data.mat_ubo) {
+               DRW_uniformbuffer_free(data.mat_ubo);
+       }
 }
 
 RenderEngineType viewport_clay_type = {
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl 
b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index be98895555..296736a7f9 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -5,37 +5,41 @@ uniform mat4 WinMatrix;
 /* Matcap */
 uniform sampler2DArray

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to