diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-06-06 17:37:44 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-08-17 15:48:48 +0300 |
commit | 405460c8caba4c3bcb6e9da8c082a620e8528b5b (patch) | |
tree | eba85a1198059ee1547cb7761bbc9724e2776bd4 /source/blender/draw | |
parent | 0e7b07221e713ec7b2ca7c80ac1aea2987361d4e (diff) |
DRW: Use int instead of uint for DRWCall
This let us tag non-instancing calls by tagging them with -1
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/intern/draw_instance_data.c | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_instance_data.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.h | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_exec.c | 32 |
5 files changed, 27 insertions, 23 deletions
diff --git a/source/blender/draw/intern/draw_instance_data.c b/source/blender/draw/intern/draw_instance_data.c index 802f49d6549..8940a95b2e0 100644 --- a/source/blender/draw/intern/draw_instance_data.c +++ b/source/blender/draw/intern/draw_instance_data.c @@ -64,7 +64,7 @@ typedef struct DRWTempBufferHandle { /** Format pointer for reuse. */ GPUVertFormat *format; /** Touched vertex length for resize. */ - uint *vert_len; + int *vert_len; } DRWTempBufferHandle; static ListBase g_idatalists = {NULL, NULL}; @@ -112,7 +112,7 @@ static void instance_batch_free(GPUBatch *geom, void *UNUSED(user_data)) */ GPUVertBuf *DRW_temp_buffer_request(DRWInstanceDataList *idatalist, GPUVertFormat *format, - uint *vert_len) + int *vert_len) { BLI_assert(format != NULL); BLI_assert(vert_len != NULL); diff --git a/source/blender/draw/intern/draw_instance_data.h b/source/blender/draw/intern/draw_instance_data.h index d88de1a58e2..56133a3aa71 100644 --- a/source/blender/draw/intern/draw_instance_data.h +++ b/source/blender/draw/intern/draw_instance_data.h @@ -42,7 +42,7 @@ DRWInstanceData *DRW_instance_data_request(DRWInstanceDataList *idatalist, uint GPUVertBuf *DRW_temp_buffer_request(DRWInstanceDataList *idatalist, GPUVertFormat *format, - uint *vert_len); + int *vert_len); GPUBatch *DRW_temp_batch_instance_request(DRWInstanceDataList *idatalist, GPUVertBuf *buf, GPUBatch *geom); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 289b583b9e9..9ccc6832127 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -156,9 +156,9 @@ BLI_STATIC_ASSERT_ALIGN(DRWObjectInfos, 16) typedef struct DRWCall { GPUBatch *batch; - uint vert_first; - uint vert_count; - uint inst_count; + int vert_first; + int vert_count; + int inst_count; DRWResourceHandle handle; diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 6875628e74e..34c67f5c727 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -571,7 +571,7 @@ void DRW_shgroup_call_ex(DRWShadingGroup *shgroup, call->batch = geom; call->vert_first = v_sta; call->vert_count = v_ct; /* 0 means auto from batch. */ - call->inst_count = 0; + call->inst_count = -1; /* -1 means no instances. */ #ifdef USE_GPU_SELECT call->select_id = DST.select_id; call->inst_selectid = NULL; @@ -602,7 +602,7 @@ static void drw_shgroup_call_procedural_add_ex(DRWShadingGroup *shgroup, call->batch = geom; call->vert_first = 0; call->vert_count = vert_count; - call->inst_count = 0; + call->inst_count = -1; /* -1 means no instances. */ #ifdef USE_GPU_SELECT call->select_id = DST.select_id; call->inst_selectid = NULL; @@ -824,7 +824,7 @@ DRWCallBuffer *DRW_shgroup_call_buffer(DRWShadingGroup *shgroup, call->batch = DRW_temp_batch_request(DST.idatalist, buf, prim_type); call->vert_first = 0; call->vert_count = 0; - call->inst_count = 0; + call->inst_count = -1; /* -1 means no instances. */ #ifdef USE_GPU_SELECT if (G.f & G_FLAG_PICKSEL) { diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index a78a0033ffe..107c80d7619 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -599,12 +599,15 @@ BLI_INLINE void draw_legacy_matrix_update(DRWShadingGroup *shgroup, BLI_INLINE void draw_geometry_execute(DRWShadingGroup *shgroup, GPUBatch *geom, - uint vert_first, - uint vert_count, - uint inst_first, - uint inst_count, + int vert_first, + int vert_count, + int inst_first, + int inst_count, int baseinst_loc) { + /* inst_count can be -1. */ + inst_count = max_ii(0, inst_count); + if (baseinst_loc != -1) { /* Fallback when ARB_shader_draw_parameters is not supported. */ GPU_shader_uniform_vector_int(shgroup->shader, baseinst_loc, 1, 1, (int *)&inst_first); @@ -915,10 +918,10 @@ BLI_INLINE bool draw_select_do_call(DRWShadingGroup *shgroup, DRWCall *call, int return false; } if (call->inst_selectid != NULL) { - const bool is_instancing = (call->inst_count != 0); - uint start = 0; - uint count = 1; - uint tot = is_instancing ? call->inst_count : call->vert_count; + const bool is_instancing = (call->inst_count != -1); + int start = 0; + int count = 1; + int tot = is_instancing ? max_ii(0, call->inst_count) : call->vert_count; /* Hack : get vbo data without actually drawing. */ GPUVertBufRaw raw; GPU_vertbuf_attr_get_raw_data(call->inst_selectid, 0, &raw); @@ -986,9 +989,9 @@ static DRWCall *draw_call_iter_step(DRWCallIterator *iter) typedef struct DRWCommandsState { int callid; - uint resource_chunk; - uint base_inst; - uint inst_count; + int resource_chunk; + int base_inst; + int inst_count; GPUBatch *batch; bool neg_scale; } DRWCommandsState; @@ -1031,7 +1034,7 @@ static bool draw_call_do_batching(DRWShadingGroup *shgroup, int baseinst_loc, int chunkid_loc) { - if (call->inst_count > 0 || call->vert_first > 0 || call->vert_count > 0 || obmats_loc == -1 || + if (call->inst_count != -1 || call->vert_first > 0 || call->vert_count > 0 || obmats_loc == -1 || G.f & G_FLAG_PICKSEL) { /* Safety guard. Batching should not happen in a shgroup * where any if the above condition are true. */ @@ -1174,8 +1177,9 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) #endif /* Reset state */ - glFrontFace(GL_CCW); - + if (state.neg_scale) { + glFrontFace(GL_CCW); + } if (obmats_loc != -1) { GPU_uniformbuffer_unbind(DST.vmempool->matrices_ubo[state.resource_chunk]); } |