From 2b2e120126b64e9dfec914074edf29bd4752b50a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 22 Jun 2019 01:01:02 +0200 Subject: DRW: Put Transform Feedback buffer into DRWUniform Since the transform feedback must be the same for the whole SHgroup, and since it is optional, put it in DRWUniform to make things cleaner. --- source/blender/draw/intern/draw_manager.h | 8 +++----- source/blender/draw/intern/draw_manager_data.c | 3 +-- source/blender/draw/intern/draw_manager_exec.c | 16 +++++++++------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 9ab8daa1b09..60d9ad3c064 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -180,6 +180,7 @@ typedef enum { DRW_UNIFORM_TEXTURE_REF, DRW_UNIFORM_BLOCK, DRW_UNIFORM_BLOCK_PERSIST, + DRW_UNIFORM_TFEEDBACK_TARGET, /** Per drawcall uniforms/UBO */ DRW_UNIFORM_BLOCK_OBMATS, DRW_UNIFORM_BLOCK_OBINFOS, @@ -202,10 +203,10 @@ struct DRWUniform { int ivalue[4]; }; int location; - uint32_t type : 4; /* DRWUniformType */ + uint32_t type : 5; /* DRWUniformType */ uint32_t length : 5; /* cannot be more than 16 */ uint32_t arraysize : 5; /* cannot be more than 16 too */ - uint32_t name_ofs : 18; /* name offset in name buffer. */ + uint32_t name_ofs : 17; /* name offset in name buffer. */ }; struct DRWShadingGroup { @@ -220,9 +221,6 @@ struct DRWShadingGroup { struct DRWCallChunk *first, *last; } calls; - /** TODO Maybe remove from here */ - struct GPUVertBuf *tfeedback_target; - /** State changes for this batch only (or'd with the pass's state) */ DRWState state_extra; /** State changes for this batch only (and'd with the pass's state) */ diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 92588e4dd5c..df89ed00c55 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -1031,7 +1031,6 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass shgroup->stencil_mask = 0; shgroup->calls.first = NULL; shgroup->calls.last = NULL; - shgroup->tfeedback_target = NULL; shgroup->pass_parent = pass; return shgroup; @@ -1133,7 +1132,7 @@ DRWShadingGroup *DRW_shgroup_transform_feedback_create(struct GPUShader *shader, BLI_assert(tf_target != NULL); DRWShadingGroup *shgroup = drw_shgroup_create_ex(shader, pass); drw_shgroup_init(shgroup, shader); - shgroup->tfeedback_target = tf_target; + drw_shgroup_uniform_create_ex(shgroup, 0, DRW_UNIFORM_TFEEDBACK_TARGET, tf_target, 0, 1); return shgroup; } diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index d61eef3e728..fde1a0e601b 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -847,7 +847,8 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup, int *chunkid_loc, int *obmat_loc, int *obinv_loc, - int *mvp_loc) + int *mvp_loc, + bool *use_tfeedback) { for (DRWUniformChunk *unichunk = shgroup->uniforms; unichunk; unichunk = unichunk->next) { DRWUniform *uni = unichunk->uniforms; @@ -924,6 +925,11 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup, *chunkid_loc = uni->location; GPU_shader_uniform_int(shgroup->shader, uni->location, 0); break; + case DRW_UNIFORM_TFEEDBACK_TARGET: + BLI_assert(data && (*use_tfeedback == false)); + *use_tfeedback = GPU_shader_transform_feedback_enable(shgroup->shader, + ((GPUVertBuf *)data)->vbo_id); + break; /* Legacy/Fallback support. */ case DRW_UNIFORM_BASE_INSTANCE: *baseinst_loc = uni->location; @@ -1226,11 +1232,6 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) DST.batch = NULL; } - if (shgroup->tfeedback_target != NULL) { - use_tfeedback = GPU_shader_transform_feedback_enable(shgroup->shader, - shgroup->tfeedback_target->vbo_id); - } - release_ubo_slots(shader_changed); release_texture_slots(shader_changed); @@ -1244,7 +1245,8 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) &chunkid_loc, &obmat_loc, &obinv_loc, - &mvp_loc); + &mvp_loc, + &use_tfeedback); /* Rendering Calls */ { -- cgit v1.2.3