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-23 12:01:03 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-08-17 15:48:49 +0300
commit64aafef5ba6c265aecdf1c92b487418da5580944 (patch)
tree1c8d041dda14040421fb01faba51224bfd882012
parent673742001a91fd04d239987cfa982830e6b7d9d1 (diff)
DRW: Move DRWUniformChunk length and used counter to the struct itself.
This is better for code simplicity. Memory usage is not that much of a concern for uniforms.
-rw-r--r--source/blender/draw/intern/draw_manager.h5
-rw-r--r--source/blender/draw/intern/draw_manager_data.c12
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c6
3 files changed, 10 insertions, 13 deletions
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 646eb27a76e..ee8b29ae401 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -258,7 +258,6 @@ struct DRWShadingGroup {
GPUShader *shader; /* Shader to bind */
struct DRWUniformChunk *uniforms; /* Uniforms pointers */
- uint32_t uniform_count; /* Index of next uniform inside DRWUniformChunk. */
int objectinfo;
@@ -338,7 +337,9 @@ struct DRWView {
typedef struct DRWUniformChunk {
struct DRWUniformChunk *next; /* single-linked list */
- DRWUniform uniforms[5];
+ uint32_t uniform_len;
+ uint32_t uniform_used;
+ DRWUniform uniforms[10];
} DRWUniformChunk;
typedef struct DRWCommandChunk {
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index f6751ff8d88..4f1fe6a27c6 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -171,15 +171,16 @@ static DRWUniform *drw_shgroup_uniform_create_ex(DRWShadingGroup *shgroup,
int length,
int arraysize)
{
+ DRWUniformChunk *unichunk = shgroup->uniforms;
/* Happens on first uniform or if chunk is full. */
- if (shgroup->uniform_count == 0) {
- DRWUniformChunk *unichunk = BLI_memblock_alloc(DST.vmempool->uniforms);
+ if (!unichunk || unichunk->uniform_used == unichunk->uniform_len) {
+ unichunk = BLI_memblock_alloc(DST.vmempool->uniforms);
+ unichunk->uniform_len = ARRAY_SIZE(shgroup->uniforms->uniforms);
+ unichunk->uniform_used = 0;
BLI_LINKS_PREPEND(shgroup->uniforms, unichunk);
}
- DRWUniform *uni = &shgroup->uniforms->uniforms[shgroup->uniform_count];
-
- shgroup->uniform_count = (shgroup->uniform_count + 1) % ARRAY_SIZE(shgroup->uniforms->uniforms);
+ DRWUniform *uni = unichunk->uniforms + unichunk->uniform_used++;
uni->location = loc;
uni->type = type;
@@ -1008,7 +1009,6 @@ void DRW_buffer_add_entry_array(DRWCallBuffer *callbuf, const void *attr[], uint
static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
{
shgroup->uniforms = NULL;
- shgroup->uniform_count = 0;
/* TODO(fclem) make them builtin. */
int view_ubo_location = GPU_shader_get_uniform_block(shader, "viewBlock");
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index e4b482764fe..d2801b1d994 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -868,11 +868,7 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup,
{
for (DRWUniformChunk *unichunk = shgroup->uniforms; unichunk; unichunk = unichunk->next) {
DRWUniform *uni = unichunk->uniforms;
- /* shgroup->uniform_count is 0 if the first chunk is full. */
- int uniform_count = ((unichunk == shgroup->uniforms) && shgroup->uniform_count > 0) ?
- shgroup->uniform_count :
- ARRAY_SIZE(shgroup->uniforms->uniforms);
- for (int i = 0; i < uniform_count; i++, uni++) {
+ for (int i = 0; i < unichunk->uniform_used; i++, uni++) {
GPUTexture *tex;
GPUUniformBuffer *ubo;
if (uni->location == -2) {