Commit: 01244df0077c688e46e3b178cdfec00b2c27ac10
Author: Clément Foucault
Date:   Sun Feb 11 16:15:46 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB01244df0077c688e46e3b178cdfec00b2c27ac10

DRW: Refactor: Make use of the new Gawain long attrib support.

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

M       intern/gawain/gawain/gwn_batch.h
M       intern/gawain/src/gwn_batch.c
M       source/blender/draw/intern/draw_manager.c
M       source/blender/gpu/intern/gpu_compositing.c

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

diff --git a/intern/gawain/gawain/gwn_batch.h b/intern/gawain/gawain/gwn_batch.h
index b2b2f00a5a1..9564d8cd587 100644
--- a/intern/gawain/gawain/gwn_batch.h
+++ b/intern/gawain/gawain/gwn_batch.h
@@ -87,10 +87,7 @@ void GWN_batch_draw(Gwn_Batch*);
 
 // clement : temp stuff
 void GWN_batch_draw_stupid(Gwn_Batch*, int v_first, int v_count);
-void GWN_batch_draw_stupid_instanced(Gwn_Batch*, unsigned int instance_vbo, 
int instance_first, int instance_count,
-                                 int attrib_nbr, int attrib_stride, int 
attrib_loc[16], int attrib_size[16]);
-void GWN_batch_draw_stupid_instanced_with_batch(Gwn_Batch*, Gwn_Batch*);
-
+void GWN_batch_draw_stupid_instanced(Gwn_Batch*, Gwn_Batch*, int 
instance_first, int instance_count);
 
 
 
diff --git a/intern/gawain/src/gwn_batch.c b/intern/gawain/src/gwn_batch.c
index ee6de9d1126..677158e09df 100644
--- a/intern/gawain/src/gwn_batch.c
+++ b/intern/gawain/src/gwn_batch.c
@@ -194,15 +194,15 @@ static void Batch_update_program_bindings(Gwn_Batch* 
batch, unsigned int v_first
        batch->program_dirty = false;
        }
 
-static void Batch_update_program_bindings_instancing(Gwn_Batch* batch, 
Gwn_Batch* batch_instancing, unsigned int v_first)
+static void Batch_update_program_bindings_instancing(Gwn_Batch* batch, 
Gwn_Batch* batch_instancing, unsigned int instance_first)
        {
        // disable all as a precaution
        // why are we not using prev_attrib_enabled_bits?? see immediate.c
        for (unsigned a_idx = 0; a_idx < GWN_VERT_ATTR_MAX_LEN; ++a_idx)
                glDisableVertexAttribArray(a_idx);
 
-       create_bindings(batch, batch->interface, v_first, false);
-       create_bindings(batch_instancing, batch->interface, v_first, true);
+       create_bindings(batch, batch->interface, 0, false);
+       create_bindings(batch_instancing, batch->interface, instance_first, 
true);
 
        batch->program_dirty = false;
        }
@@ -346,9 +346,6 @@ void GWN_batch_draw(Gwn_Batch* batch)
        glBindVertexArray(0);
        }
 
-
-
-// clement : temp stuff
 void GWN_batch_draw_stupid(Gwn_Batch* batch, int v_first, int v_count)
        {
        if (batch->vao_id)
@@ -364,9 +361,8 @@ void GWN_batch_draw_stupid(Gwn_Batch* batch, int v_first, 
int v_count)
        //gpuBindMatrices(batch->program);
 
        // Infer lenght if vertex count is not given
-       if (v_count == 0) {
+       if (v_count == 0)
                v_count = (batch->elem) ? batch->elem->index_ct : 
batch->verts[0]->vertex_ct;
-       }
 
        if (batch->elem)
                {
@@ -388,64 +384,7 @@ void GWN_batch_draw_stupid(Gwn_Batch* batch, int v_first, 
int v_count)
        glBindVertexArray(0);
        }
 
-// clement : temp stuff
-void GWN_batch_draw_stupid_instanced(Gwn_Batch* batch, unsigned int 
instance_vbo, int instance_first, int instance_count,
-                                 int attrib_nbr, int attrib_stride, int 
attrib_size[16], int attrib_loc[16])
-       {
-       if (batch->vao_id)
-               glBindVertexArray(batch->vao_id);
-       else
-               Batch_prime(batch);
-
-       if (batch->program_dirty)
-               Batch_update_program_bindings(batch, 0);
-
-       glBindBuffer(GL_ARRAY_BUFFER, instance_vbo);
-       int ptr_ofs = instance_first * attrib_stride;
-       for (int i = 0; i < attrib_nbr; ++i)
-               {
-               int size = attrib_size[i];
-               int loc = attrib_loc[i];
-               int atr_ofs = 0;
-
-               while (size > 0)
-                       {
-                       glEnableVertexAttribArray(loc + atr_ofs);
-                       glVertexAttribPointer(loc + atr_ofs, (size > 4) ? 4 : 
size, GL_FLOAT, GL_FALSE,
-                                             sizeof(float) * attrib_stride, 
(GLvoid*)(sizeof(float) * ptr_ofs));
-                       glVertexAttribDivisor(loc + atr_ofs, 1);
-                       atr_ofs++;
-                       ptr_ofs += (size > 4) ? 4 : size;
-                       size -= 4;
-                       }
-               }
-       glBindBuffer(GL_ARRAY_BUFFER, 0);
-
-       // GWN_batch_program_use_begin(batch);
-
-       //gpuBindMatrices(batch->program);
-
-       if (batch->elem)
-               {
-               const Gwn_IndexBuf* el = batch->elem;
-#if GWN_TRACK_INDEX_RANGE
-               glDrawElementsInstancedBaseVertex(batch->gl_prim_type, 
el->index_ct, el->gl_index_type, 0, instance_count, el->base_index);
-#else
-               glDrawElementsInstanced(batch->gl_prim_type, el->index_ct, 
GL_UNSIGNED_INT, 0, instance_count);
-#endif
-               }
-       else
-               glDrawArraysInstanced(batch->gl_prim_type, 0, 
batch->verts[0]->vertex_ct, instance_count);
-
-       // Reset divisor to prevent messing the next draw
-       for (unsigned a_idx = 0; a_idx < GWN_VERT_ATTR_MAX_LEN; ++a_idx)
-               glVertexAttribDivisor(a_idx, 0);
-
-       // GWN_batch_program_use_end(batch);
-       glBindVertexArray(0);
-       }
-
-void GWN_batch_draw_stupid_instanced_with_batch(Gwn_Batch* batch_instanced, 
Gwn_Batch* batch_instancing)
+void GWN_batch_draw_stupid_instanced(Gwn_Batch* batch_instanced, Gwn_Batch* 
batch_instancing, int instance_first, int instance_count)
        {
        if (batch_instanced->vao_id)
                glBindVertexArray(batch_instanced->vao_id);
@@ -453,22 +392,25 @@ void 
GWN_batch_draw_stupid_instanced_with_batch(Gwn_Batch* batch_instanced, Gwn_
                Batch_prime(batch_instanced);
 
        if (batch_instanced->program_dirty)
-               Batch_update_program_bindings_instancing(batch_instanced, 
batch_instancing, 0);
+               Batch_update_program_bindings_instancing(batch_instanced, 
batch_instancing, instance_first);
 
        Gwn_VertBuf* verts = batch_instancing->verts[0];
 
+       if (instance_count == 0)
+               instance_count = verts->vertex_ct;
+
        if (batch_instanced->elem)
                {
                const Gwn_IndexBuf* el = batch_instanced->elem;
 
 #if GWN_TRACK_INDEX_RANGE
-               
glDrawElementsInstancedBaseVertex(batch_instanced->gl_prim_type, el->index_ct, 
el->gl_index_type, 0, verts->vertex_ct, el->base_index);
+               
glDrawElementsInstancedBaseVertex(batch_instanced->gl_prim_type, el->index_ct, 
el->gl_index_type, 0, instance_count, el->base_index);
 #else
-               glDrawElementsInstanced(batch_instanced->gl_prim_type, 
el->index_ct, GL_UNSIGNED_INT, 0, verts->vertex_ct);
+               glDrawElementsInstanced(batch_instanced->gl_prim_type, 
el->index_ct, GL_UNSIGNED_INT, 0, instance_count);
 #endif
                }
        else
-               glDrawArraysInstanced(batch_instanced->gl_prim_type, 0, 
batch_instanced->verts[0]->vertex_ct, verts->vertex_ct);
+               glDrawArraysInstanced(batch_instanced->gl_prim_type, 0, 
batch_instanced->verts[0]->vertex_ct, instance_count);
 
        glBindVertexArray(0);
        }
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 4a71cce666a..db1046039d5 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -190,10 +190,6 @@ struct DRWUniform {
 
 struct DRWInterface {
        DRWUniform *uniforms;   /* DRWUniform, single-linked list */
-       int attribs_count;
-       int attribs_stride;
-       int attribs_size[16];
-       int attribs_loc[16];
        /* matrices locations */
        int model;
        int modelinverse;
@@ -213,15 +209,16 @@ struct DRWInterface {
        int eye;
        int clipplanes;
        /* Dynamic batch */
-       Gwn_Batch *instance_batch; /* contains instances attributes */
-       GLuint instance_vbo; /* same as instance_batch but generated from 
DRWCalls */
        struct DRWInstanceData *inst_data;
 #ifdef USE_GPU_SELECT
        struct DRWInstanceData *inst_selectid;
        /* Override for single object instances. */
        int override_selectid;
 #endif
-       int instance_count;
+       unsigned int instance_count;
+       unsigned char attribs_count;
+       unsigned char attribs_stride;
+       unsigned char attribs_size[MAX_ATTRIB_COUNT];
        Gwn_VertFormat vbo_format;
 };
 
@@ -279,6 +276,7 @@ struct DRWShadingGroup {
 
        ID *instance_data;         /* Object->data to instance */
        Gwn_Batch *instance_geom;  /* Geometry to instance */
+       Gwn_Batch *instancing_geom;/* Instances attributes */
        Gwn_Batch *batch_geom;     /* Result of call batching */
 
 #ifdef USE_GPU_SELECT
@@ -294,6 +292,7 @@ enum {
        DRW_SHG_LINE_BATCH,
        DRW_SHG_TRIANGLE_BATCH,
        DRW_SHG_INSTANCE,
+       DRW_SHG_INSTANCE_EXTERNAL,
 };
 
 /* Used by DRWCall.type */
@@ -661,8 +660,6 @@ static void drw_interface_create(DRWInterface *interface, 
GPUShader *shader)
        interface->instance_count = 0;
        interface->attribs_count = 0;
        interface->attribs_stride = 0;
-       interface->instance_vbo = 0;
-       interface->instance_batch = NULL;
        interface->inst_data = NULL;
        interface->uniforms = NULL;
 #ifdef USE_GPU_SELECT
@@ -712,33 +709,16 @@ static void drw_interface_uniform(DRWShadingGroup 
*shgroup, const char *name,
 static void drw_interface_attrib(DRWShadingGroup *shgroup, const char *name, 
DRWAttribType UNUSED(type), int size, bool dummy)
 {
        unsigned int attrib_id = shgroup->interface.attribs_count;
-       GLuint program = GPU_shader_get_program(shgroup->shader);
-
-       shgroup->interface.attribs_loc[attrib_id] = 
glGetAttribLocation(program, name);
        shgroup->interface.attribs_size[attrib_id] = size;
        shgroup->interface.attribs_stride += size;
        shgroup->interface.attribs_count += 1;
 
-       if (shgroup->type != DRW_SHG_INSTANCE) {
-               BLI_assert(size <= 4); /* Matrices are not supported by Gawain. 
*/
-               GWN_vertformat_attr_add(&shgroup->interface.vbo_format, name, 
GWN_COMP_F32, size, GWN_FETCH_FLOAT);
-       }
-
+       BLI_assert(ELEM(shgroup->type, DRW_SHG_INSTANCE, DRW_SHG_POINT_BATCH, 
DRW_SHG_LINE_BATCH, DRW_SHG_TRIANGLE_BATCH));
        BLI_assert(shgroup->interface.attribs_count < MAX_ATTRIB_COUNT);
 
-/* Adding attribute even if not found for now (to keep memory alignment).
- * Should ideally take vertex format automatically from batch eventually */
-#if 0
-       if (attrib->location == -1 && !dummy) {
-               if (G.debug & G_DEBUG)
-                       fprintf(stderr, "Attribute '%s' not found!\n", name);
-               BLI_assert(0);
-               MEM_freeN(attrib);
-               return;
-       }
-#else
+       GWN_vertformat_attr_add(&shgroup->interface.vbo_format, name, 
GWN_COMP_F32, size, GWN_FETCH_FLOAT);
+
        UNUSED_VARS(dummy);
-#endif
 }
 
 /** \} */
@@ -771,6 +751,7 @@ DRWShadingGroup *DRW_shgroup_create(struct GPUShader 
*shader, DRWPass *pass)
        shgroup->state_extra_disable = ~0x0;
        shgroup->stencil_mask = 0;
        shgroup->batch_geom = NULL;
+       shgroup->instancing_geom = NULL;
        shgroup->instance_geom = NULL;
        shgroup->instance_data = NULL;
 
@@ -921,12 +902,9 @@ DRWShadingGroup *DRW_shgroup_empty_tri_batch_create(struct 
GPUShader *shader, DR
 
 void DRW_shgroup_free(struct DRWShadingGroup *shgroup)
 {
-       if (shgroup->interface.instance_vbo &&
-           (shgroup->interface.instance_batch == 0))
-       {
-               glDeleteBuffers(1, &shgroup->interface.instance_vbo);
+       if (shgroup->type != DRW_SHG_INSTANCE_EXTERNAL) {
+               GWN_BATCH_DISCARD_SAFE(shgroup->instancing_geom);
        }
-
        GWN_BATCH_DISCARD_SAFE(shgroup->batch_geom);
 }
 
@@ -942,12 +920,14 @@ void DR

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to