Commit: 42677fa937c3567aab42181d4a4dbd7fab0b2a31
Author: Mike Erwin
Date:   Sun Oct 16 23:50:18 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB42677fa937c3567aab42181d4a4dbd7fab0b2a31

Gawain: tweak tracking of unassigned attributes (no API change)

Hoping for a small performance win.

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

M       source/blender/gpu/gawain/immediate.c

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

diff --git a/source/blender/gpu/gawain/immediate.c 
b/source/blender/gpu/gawain/immediate.c
index a382240..2287950 100644
--- a/source/blender/gpu/gawain/immediate.c
+++ b/source/blender/gpu/gawain/immediate.c
@@ -33,7 +33,7 @@ typedef struct {
        // current vertex
        unsigned vertex_idx;
        GLubyte* vertex_data;
-       unsigned short attrib_value_bits; // which attributes of current vertex 
have been given values?
+       uint16_t unassigned_attrib_bits; // which attributes of current vertex 
have not been given values?
 
        GLuint vbo_id;
        GLuint vao_id;
@@ -175,6 +175,8 @@ void immBegin(GLenum primitive, unsigned vertex_ct)
 
        imm.primitive = primitive;
        imm.vertex_ct = vertex_ct;
+       imm.vertex_idx = 0;
+       imm.unassigned_attrib_bits = imm.attrib_binding.enabled_bits;
 
        // how many bytes do we need for this draw call?
        const unsigned bytes_needed = vertex_buffer_size(&imm.vertex_format, 
vertex_ct);
@@ -245,6 +247,8 @@ Batch* immBeginBatch(GLenum prim_type, unsigned vertex_ct)
 
        imm.primitive = prim_type;
        imm.vertex_ct = vertex_ct;
+       imm.vertex_idx = 0;
+       imm.unassigned_attrib_bits = imm.attrib_binding.enabled_bits;
 
        VertexBuffer* verts = 
VertexBuffer_create_with_format(&imm.vertex_format);
        VertexBuffer_allocate_data(verts, vertex_ct);
@@ -403,19 +407,17 @@ void immEnd()
        // prep for next immBegin
        imm.primitive = PRIM_NONE;
        imm.strict_vertex_ct = true;
-       imm.vertex_idx = 0;
-       imm.attrib_value_bits = 0;
        }
 
 static void setAttribValueBit(unsigned attrib_id)
        {
-       unsigned short mask = 1 << attrib_id;
+       uint16_t mask = 1 << attrib_id;
 
 #if TRUST_NO_ONE
-       assert((imm.attrib_value_bits & mask) == 0); // not already set
+       assert(imm.unassigned_attrib_bits & mask); // not already set
 #endif
 
-       imm.attrib_value_bits |= mask;
+       imm.unassigned_attrib_bits &= ~mask;
        }
 
 
@@ -612,8 +614,7 @@ static void immEndVertex(void) // and move on to the next 
vertex
 
        // have all attribs been assigned values?
        // if not, copy value from previous vertex
-       const unsigned short all_bits = ~(0xFFFFU << 
imm.vertex_format.attrib_ct);
-       if (imm.attrib_value_bits != all_bits)
+       if (imm.unassigned_attrib_bits)
                {
 #if TRUST_NO_ONE
                assert(imm.vertex_idx > 0); // first vertex must have all 
attribs specified
@@ -621,8 +622,7 @@ static void immEndVertex(void) // and move on to the next 
vertex
 
                for (unsigned a_idx = 0; a_idx < imm.vertex_format.attrib_ct; 
++a_idx)
                        {
-                       const uint16_t mask = 1 << a_idx;
-                       if ((imm.attrib_value_bits & mask) == 0)
+                       if ((imm.unassigned_attrib_bits >> a_idx) & 1)
                                {
                                const Attrib* a = imm.vertex_format.attribs + 
a_idx;
 
@@ -637,7 +637,7 @@ static void immEndVertex(void) // and move on to the next 
vertex
 
        imm.vertex_idx++;
        imm.vertex_data += imm.vertex_format.stride;
-       imm.attrib_value_bits = 0;
+       imm.unassigned_attrib_bits = imm.attrib_binding.enabled_bits;
        }
 
 void immVertex2f(unsigned attrib_id, float x, float y)

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

Reply via email to