Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-06-06 17:37:44 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-08-17 15:48:48 +0300
commit405460c8caba4c3bcb6e9da8c082a620e8528b5b (patch)
treeeba85a1198059ee1547cb7761bbc9724e2776bd4 /source/blender/draw
parent0e7b07221e713ec7b2ca7c80ac1aea2987361d4e (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.c4
-rw-r--r--source/blender/draw/intern/draw_instance_data.h2
-rw-r--r--source/blender/draw/intern/draw_manager.h6
-rw-r--r--source/blender/draw/intern/draw_manager_data.c6
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c32
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]);
}