[Bf-blender-cvs] [25c8b5046fa] blender2.8: Clay: Small refactoring of matcap_colors and put ubos into sldata.

Clément Foucault noreply at git.blender.org
Wed Feb 7 19:12:51 CET 2018


Commit: 25c8b5046fae3d8a2390c5e8f11a95e510150a2f
Author: Clément Foucault
Date:   Wed Feb 7 18:10:32 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB25c8b5046fae3d8a2390c5e8f11a95e510150a2f

Clay: Small refactoring of matcap_colors and put ubos into sldata.

Ubos needed to be free correctly.
Also the matcap colors are statics and does not need to be uploaded each drawcall.

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

M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/clay/shaders/clay_frag.glsl

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

diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index b9a372f802d..50c6790f817 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -116,8 +116,6 @@ typedef struct CLAY_Storage {
 
 typedef struct CLAY_StorageList {
 	struct CLAY_Storage *storage;
-	struct GPUUniformBuffer *mat_ubo;
-	struct GPUUniformBuffer *hair_mat_ubo;
 	struct CLAY_PrivateData *g_data;
 } CLAY_StorageList;
 
@@ -146,6 +144,9 @@ typedef struct CLAY_Data {
 
 typedef struct CLAY_ViewLayerData {
 	struct GPUTexture *jitter_tx;
+	struct GPUUniformBuffer *mat_ubo;
+	struct GPUUniformBuffer *matcaps_ubo;
+	struct GPUUniformBuffer *hair_mat_ubo;
 	struct GPUUniformBuffer *sampling_ubo;
 	int cached_sample_num;
 } CLAY_ViewLayerData;
@@ -162,7 +163,7 @@ static struct {
 
 	/* Matcap textures */
 	struct GPUTexture *matcap_array;
-	float matcap_colors[24][3];
+	float matcap_colors[24][4];
 
 	/* Ssao */
 	float winmat[4][4];
@@ -192,6 +193,9 @@ static void clay_view_layer_data_free(void *storage)
 {
 	CLAY_ViewLayerData *sldata = (CLAY_ViewLayerData *)storage;
 
+	DRW_UBO_FREE_SAFE(sldata->mat_ubo);
+	DRW_UBO_FREE_SAFE(sldata->matcaps_ubo);
+	DRW_UBO_FREE_SAFE(sldata->hair_mat_ubo);
 	DRW_UBO_FREE_SAFE(sldata->sampling_ubo);
 	DRW_TEXTURE_FREE_SAFE(sldata->jitter_tx);
 }
@@ -399,12 +403,16 @@ static void clay_engine_init(void *vedata)
 		stl->storage = MEM_callocN(sizeof(CLAY_Storage), "CLAY_Storage");
 	}
 
-	if (!stl->mat_ubo) {
-		stl->mat_ubo = DRW_uniformbuffer_create(sizeof(CLAY_UBO_Storage), NULL);
+	if (!sldata->mat_ubo) {
+		sldata->mat_ubo = DRW_uniformbuffer_create(sizeof(CLAY_UBO_Storage), NULL);
 	}
 
-	if (!stl->hair_mat_ubo) {
-		stl->hair_mat_ubo = DRW_uniformbuffer_create(sizeof(CLAY_HAIR_UBO_Storage), NULL);
+	if (!sldata->hair_mat_ubo) {
+		sldata->hair_mat_ubo = DRW_uniformbuffer_create(sizeof(CLAY_HAIR_UBO_Storage), NULL);
+	}
+
+	if (!sldata->matcaps_ubo) {
+		sldata->matcaps_ubo = DRW_uniformbuffer_create(sizeof(e_data.matcap_colors), e_data.matcap_colors);
 	}
 
 	if (e_data.ubo_mat_idxs[1] == 0) {
@@ -495,9 +503,8 @@ static void clay_engine_init(void *vedata)
 	}
 }
 
-static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *vedata, DRWPass *pass, int *material_id, bool use_flat)
+static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *UNUSED(vedata), DRWPass *pass, int *material_id, bool use_flat)
 {
-	CLAY_StorageList *stl = vedata->stl;
 	CLAY_ViewLayerData *sldata = CLAY_view_layer_data_get();
 	DRWShadingGroup *grp = DRW_shgroup_create(use_flat ? e_data.clay_flat_sh : e_data.clay_sh, pass);
 
@@ -507,25 +514,26 @@ static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *vedata, DRWPass *pass, in
 	DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)e_data.winmat);
 	DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)e_data.viewvecs, 3);
 	DRW_shgroup_uniform_vec4(grp, "ssao_params", e_data.ssao_params, 1);
-	DRW_shgroup_uniform_vec3(grp, "matcaps_color[0]", (float *)e_data.matcap_colors, 24);
 
 	DRW_shgroup_uniform_int(grp, "mat_id", material_id, 1);
 
 	DRW_shgroup_uniform_texture(grp, "ssao_jitter", sldata->jitter_tx);
 	DRW_shgroup_uniform_block(grp, "samples_block", sldata->sampling_ubo);
-	DRW_shgroup_uniform_block(grp, "material_block", stl->mat_ubo);
+	DRW_shgroup_uniform_block(grp, "material_block", sldata->mat_ubo);
+	DRW_shgroup_uniform_block(grp, "matcaps_block", sldata->matcaps_ubo);
 
 	return grp;
 }
 
-static DRWShadingGroup *CLAY_hair_shgroup_create(CLAY_Data *vedata, DRWPass *pass, int *material_id)
+static DRWShadingGroup *CLAY_hair_shgroup_create(CLAY_Data *UNUSED(vedata), DRWPass *pass, int *material_id)
 {
-	CLAY_StorageList *stl = vedata->stl;
+	CLAY_ViewLayerData *sldata = CLAY_view_layer_data_get();
 	DRWShadingGroup *grp = DRW_shgroup_create(e_data.hair_sh, pass);
 
 	DRW_shgroup_uniform_texture(grp, "matcaps", e_data.matcap_array);
 	DRW_shgroup_uniform_int(grp, "mat_id", material_id, 1);
-	DRW_shgroup_uniform_block(grp, "material_block", stl->mat_ubo);
+	DRW_shgroup_uniform_block(grp, "material_block", sldata->mat_ubo);
+	DRW_shgroup_uniform_block(grp, "matcaps_block", sldata->matcaps_ubo);
 
 	return grp;
 }
@@ -853,10 +861,11 @@ static void clay_cache_populate(void *vedata, Object *ob)
 
 static void clay_cache_finish(void *vedata)
 {
+	CLAY_ViewLayerData *sldata = CLAY_view_layer_data_get();
 	CLAY_StorageList *stl = ((CLAY_Data *)vedata)->stl;
 
-	DRW_uniformbuffer_update(stl->mat_ubo, &stl->storage->mat_storage);
-	DRW_uniformbuffer_update(stl->hair_mat_ubo, &stl->storage->hair_mat_storage);
+	DRW_uniformbuffer_update(sldata->mat_ubo, &stl->storage->mat_storage);
+	DRW_uniformbuffer_update(sldata->hair_mat_ubo, &stl->storage->hair_mat_storage);
 }
 
 static void clay_draw_scene(void *vedata)
diff --git a/source/blender/draw/engines/clay/shaders/clay_frag.glsl b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
index 9c8c90bd5b6..619843e2a02 100644
--- a/source/blender/draw/engines/clay/shaders/clay_frag.glsl
+++ b/source/blender/draw/engines/clay/shaders/clay_frag.glsl
@@ -4,7 +4,6 @@ uniform mat4 WinMatrix;
 
 /* Matcap */
 uniform sampler2DArray matcaps;
-uniform vec3 matcaps_color[24];
 
 /* Screen Space Occlusion */
 /* store the view space vectors for the corners of the view frustum here.
@@ -26,6 +25,10 @@ layout(std140) uniform samples_block {
 	vec4 ssao_samples[500];
 };
 
+layout(std140) uniform matcaps_block {
+	vec4 matcaps_color[24];
+};
+
 layout(std140) uniform material_block {
 	Material matcaps_param[MAX_MATERIAL];
 };
@@ -185,7 +188,7 @@ void main() {
 	float cavity, edges;
 	ssao_factors(depth, normal, position, screenco, cavity, edges);
 
-	col *= mix(vec3(1.0), matcaps_color[int(matcap_index)], cavity);
+	col *= mix(vec3(1.0), matcaps_color[int(matcap_index)].rgb, cavity);
 #endif
 
 #ifdef USE_HSV



More information about the Bf-blender-cvs mailing list