[Bf-blender-cvs] [efa46d7db0] clay-engine: Initial support of Uniform Buffer objects
Clément Foucault
noreply at git.blender.org
Mon Jan 23 09:55:54 CET 2017
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. @@
More information about the Bf-blender-cvs
mailing list