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