Revision: 38241
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38241
Author:   nicholasbishop
Date:     2011-07-08 19:58:02 +0000 (Fri, 08 Jul 2011)
Log Message:
-----------
== GPU Buffers ==

This patch attempts to clean up and document the GPU buffers
code. There are a few bug fixes as well.

Patch reviewed here: http://codereview.appspot.com/4631052/

Summary:

* Bugfix: make GPU_buffer_copy_normal convert from shorts to floats
  correctly, also fixed the use of cached face normal CustomData.

* Bugfix: changed the `mat_nr' field of GPUBufferMaterial from char to
  short.

* Changed color buffer setup to not alloc a temporary copy of color
  data, just passes the MCol data in directly.

* Changed the GPU buffer pool code to make clearer what operates
  specifically on the global pool.

* Lots of refactoring for GPU_drawobject_new; should operate mostly
  the same (except got rid of one unecessary allocation), just split
  into more functions and without macros now.

* Converted some #defines into enumerations.

* Made some stuff private, pulled out of header file.

* Deleted unused function GPU_buffer_pool_free_unused().

* Removed GPU_interleaved_setup and related #defines. (I think this
  was used for editmode VBOs, but those were disabled.)

* Added lots of comments.

* Added a few comments in the code signed `--nicholas' to note places
  where I am unsure about design or usage, would be good to address
  these better.

* Code formatting changed to be more consistent with the rest of
  Blender.

* Renamed some fields and variables to be more consistent with
  Blender's naming conventions.

* Renamed some fields and variables to use more descriptive names,
  e.g. renamed `redir' to `mat_orig_to_new'.

* Removed print outs with DEBUG_VBO -- don't feel too strongly about
  this one, just not used elsewhere in Blender, could be easily added
  back if others disagree though.

* Moved the PBVH drawing code down to the bottom of the file, before
  was sitting in the middle of the other VBO code

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/gpu/GPU_buffers.h
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c      
2011-07-08 18:09:51 UTC (rev 38240)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c      
2011-07-08 19:58:02 UTC (rev 38241)
@@ -284,8 +284,10 @@
        else {  /* use OpenGL VBOs or Vertex Arrays instead for better, faster 
rendering */
                GPU_vertex_setup(dm);
                if( !GPU_buffer_legacy(dm) ) {
-                       if(dm->drawObject->nelements)   
glDrawArrays(GL_POINTS,0, dm->drawObject->nelements);
-                       else                                                    
glDrawArrays(GL_POINTS,0, dm->drawObject->nlooseverts);
+                       if(dm->drawObject->tot_triangle_point)
+                               glDrawArrays(GL_POINTS,0, 
dm->drawObject->tot_triangle_point);
+                       else
+                               glDrawArrays(GL_POINTS,0, 
dm->drawObject->tot_loose_point);
                }
                GPU_buffer_unbind();
        }
@@ -547,9 +549,10 @@
                GPU_normal_setup( dm );
                if( !GPU_buffer_legacy(dm) ) {
                        glShadeModel(GL_SMOOTH);
-                       for( a = 0; a < dm->drawObject->nmaterials; a++ ) {
+                       for( a = 0; a < dm->drawObject->totmaterial; a++ ) {
                                if( 
setMaterial(dm->drawObject->materials[a].mat_nr+1, NULL) )
-                                       glDrawArrays(GL_TRIANGLES, 
dm->drawObject->materials[a].start, 
dm->drawObject->materials[a].end-dm->drawObject->materials[a].start);
+                                       glDrawArrays(GL_TRIANGLES, 
dm->drawObject->materials[a].start,
+                                                    
dm->drawObject->materials[a].totpoint);
                        }
                }
                GPU_buffer_unbind( );
@@ -629,13 +632,13 @@
                GPU_color_setup(dm);
                if( !GPU_buffer_legacy(dm) ) {
                        glShadeModel(GL_SMOOTH);
-                       glDrawArrays(GL_TRIANGLES, 0, 
dm->drawObject->nelements);
+                       glDrawArrays(GL_TRIANGLES, 0, 
dm->drawObject->tot_triangle_point);
 
                        if( useTwoSided ) {
                                GPU_color4_upload(dm,cp2);
                                GPU_color_setup(dm);
                                glCullFace(GL_FRONT);
-                               glDrawArrays(GL_TRIANGLES, 0, 
dm->drawObject->nelements);
+                               glDrawArrays(GL_TRIANGLES, 0, 
dm->drawObject->tot_triangle_point);
                                glCullFace(GL_BACK);
                        }
                }
@@ -787,8 +790,8 @@
                        
                        glShadeModel( GL_SMOOTH );
                        lastFlag = 0;
-                       for(i = 0; i < dm->drawObject->nelements/3; i++) {
-                               int actualFace = dm->drawObject->faceRemap[i];
+                       for(i = 0; i < dm->drawObject->tot_triangle_point/3; 
i++) {
+                               int actualFace = 
dm->drawObject->triangle_to_mface[i];
                                int flag = 1;
 
                                if(drawParams) {
@@ -819,13 +822,13 @@
                                        startFace = i;
                                }
                        }
-                       if( startFace < dm->drawObject->nelements/3 ) {
+                       if( startFace < dm->drawObject->tot_triangle_point/3 ) {
                                if( lastFlag != 0 ) { /* if the flag is 0 it 
means the face is hidden or invisible */
                                        if (lastFlag==1 && col)
                                                GPU_color_switch(1);
                                        else
                                                GPU_color_switch(0);
-                                       
glDrawArrays(GL_TRIANGLES,startFace*3,dm->drawObject->nelements-startFace*3);
+                                       glDrawArrays(GL_TRIANGLES, startFace*3, 
dm->drawObject->tot_triangle_point - startFace*3);
                                }
                        }
                }
@@ -935,7 +938,7 @@
                if( useColors && mc )
                        GPU_color_setup(dm);
                if( !GPU_buffer_legacy(dm) ) {
-                       int tottri = dm->drawObject->nelements/3;
+                       int tottri = dm->drawObject->tot_triangle_point/3;
                        glShadeModel(GL_SMOOTH);
                        
                        if(tottri == 0) {
@@ -947,17 +950,17 @@
                        }
                        else {
                                /* we need to check if the next material 
changes */
-                               int next_actualFace= 
dm->drawObject->faceRemap[0];
+                               int next_actualFace= 
dm->drawObject->triangle_to_mface[0];
                                
                                for( i = 0; i < tottri; i++ ) {
-                                       //int actualFace = 
dm->drawObject->faceRemap[i];
+                                       //int actualFace = 
dm->drawObject->triangle_to_mface[i];
                                        int actualFace = next_actualFace;
                                        MFace *mface= mf + actualFace;
                                        int drawSmooth= (mface->flag & 
ME_SMOOTH);
                                        int draw = 1;
 
                                        if(i != tottri-1)
-                                               next_actualFace= 
dm->drawObject->faceRemap[i+1];
+                                               next_actualFace= 
dm->drawObject->triangle_to_mface[i+1];
 
                                        orig= (index==NULL) ? actualFace : 
index[actualFace];
 
@@ -1129,9 +1132,9 @@
                GPU_normal_setup(dm);
 
                if( !GPU_buffer_legacy(dm) ) {
-                       for( i = 0; i < dm->drawObject->nelements/3; i++ ) {
+                       for( i = 0; i < dm->drawObject->tot_triangle_point/3; 
i++ ) {
 
-                               a = dm->drawObject->faceRemap[i];
+                               a = dm->drawObject->triangle_to_mface[i];
 
                                mface = mf + a;
                                new_matnr = mface->mat_nr + 1;
@@ -1153,7 +1156,7 @@
 
                                                        if( numdata != 0 ) {
 
-                                                               
GPU_buffer_free(buffer, NULL);
+                                                               
GPU_buffer_free(buffer);
 
                                                                buffer = NULL;
                                                        }
@@ -1193,7 +1196,7 @@
                                                }
                                                if( numdata != 0 ) {
                                                        elementsize = 
GPU_attrib_element_size( datatypes, numdata );
-                                                       buffer = 
GPU_buffer_alloc( elementsize*dm->drawObject->nelements, NULL );
+                                                       buffer = 
GPU_buffer_alloc( elementsize*dm->drawObject->tot_triangle_point);
                                                        if( buffer == NULL ) {
                                                                
GPU_buffer_unbind();
                                                                
dm->drawObject->legacy = 1;
@@ -1202,7 +1205,7 @@
                                                        varray = 
GPU_buffer_lock_stream(buffer);
                                                        if( varray == NULL ) {
                                                                
GPU_buffer_unbind();
-                                                               
GPU_buffer_free(buffer, NULL);
+                                                               
GPU_buffer_free(buffer);
                                                                
dm->drawObject->legacy = 1;
                                                                return;
                                                        }
@@ -1341,7 +1344,7 @@
                        }
                        GPU_buffer_unbind();
                }
-               GPU_buffer_free( buffer, NULL );
+               GPU_buffer_free(buffer);
        }
 
        glShadeModel(GL_FLAT);

Modified: trunk/blender/source/blender/gpu/GPU_buffers.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_buffers.h      2011-07-08 18:09:51 UTC 
(rev 38240)
+++ trunk/blender/source/blender/gpu/GPU_buffers.h      2011-07-08 19:58:02 UTC 
(rev 38241)
@@ -37,8 +37,6 @@
 #ifndef __GPU_BUFFERS_H__
 #define __GPU_BUFFERS_H__
 
-#define MAX_FREE_GPU_BUFFERS 8
-
 #ifdef _DEBUG
 /*#define DEBUG_VBO(X) printf(X)*/
 #define DEBUG_VBO(X)
@@ -46,112 +44,92 @@
 #define DEBUG_VBO(X)
 #endif
 
-#ifdef _DEBUG
-#define ERROR_VBO(X) printf(X)
-#else
-#define ERROR_VBO(X)
-#endif
-
 struct DerivedMesh;
 struct DMGridData;
 struct GHash;
 struct DMGridData;
+struct GPUVertPointLink;
 
-/* V - vertex, N - normal, T - uv, C - color
-   F - float, UB - unsigned byte */
-#define GPU_BUFFER_INTER_V3F   1
-#define GPU_BUFFER_INTER_N3F   2
-#define GPU_BUFFER_INTER_T2F   3
-#define GPU_BUFFER_INTER_C3UB  4
-#define GPU_BUFFER_INTER_C4UB  5
-#define GPU_BUFFER_INTER_END   -1
-
-typedef struct GPUBuffer
-{
+typedef struct GPUBuffer {
        int size;       /* in bytes */
        void *pointer;  /* used with vertex arrays */
        unsigned int id;        /* used with vertex buffer objects */
 } GPUBuffer;
 
-/* stores deleted buffers so that new buffers wouldn't have to 
-be recreated that often. */
-typedef struct GPUBufferPool
-{
-       int size;               /* number of allocated buffers stored */
-       int maxsize;    /* size of the array */
-       GPUBuffer **buffers;
-} GPUBufferPool;
+typedef struct GPUBufferMaterial {
+       /* range of points used for this material */
+       int start;
+       int totpoint;
 
-typedef struct GPUBufferMaterial
-{
-       int start;      /* at which vertex in the buffer the material starts */
-       int end;        /* at which vertex it ends */
-       char mat_nr;
+       /* original material index */
+       short mat_nr;
 } GPUBufferMaterial;
 
-typedef struct IndexLink {
-       int element;
-       struct IndexLink *next;
-} IndexLink;
+/* meshes are split up by material since changing materials requires
+   GL state changes that can't occur in the middle of drawing an
+   array.
 
-typedef struct GPUDrawObject
-{
-       GPUBuffer *vertices;
+   some simplifying assumptions are made:
+   * all quads are treated as two triangles.
+   * no vertex sharing is used; each triangle gets its own copy of the
+     vertices it uses (this makes it easy to deal with a vertex used
+     by faces with different properties, such as smooth/solid shading,
+     different MCols, etc.)
+
+   to avoid confusion between the original MVert vertices and the
+   arrays of OpenGL vertices, the latter are referred to here and in
+   the source as `points'. similarly, the OpenGL triangles generated
+   for MFaces are referred to as triangles rather than faces.
+ */
+typedef struct GPUDrawObject {
+       GPUBuffer *points;
        GPUBuffer *normals;
        GPUBuffer *uv;
        GPUBuffer *colors;
        GPUBuffer *edges;
        GPUBuffer *uvedges;
 
-       int     *faceRemap;                     /* at what index was the face 
originally in DerivedMesh */
-       IndexLink *indices;             /* given an index, find all elements 
using it */
-       IndexLink *indexMem;    /* for faster memory allocation/freeing */
-       int indexMemUsage;              /* how many are already allocated */
+       /* for each triangle, the original MFace index */
+       int *triangle_to_mface;
+
+       /* for each original vertex, the list of related points */
+       struct GPUVertPointLink *vert_points;
+       /* storage for the vert_points lists */
+       struct GPUVertPointLink *vert_points_mem;
+       int vert_points_usage;
+       
        int colType;
 
        GPUBufferMaterial *materials;
+       int totmaterial;
+       
+       int tot_triangle_point;
+       int tot_loose_point;
+       
+       /* caches of the original DerivedMesh values */
+       int totvert;
+       int totedge;
 
-       int nmaterials;
-       int nelements;  /* (number of faces) * 3 */
-       int nlooseverts;
-       int nedges;
-       int nindices;
-       int legacy;     /* if there was a failure allocating some buffer, use 
old rendering code */
-
+       /* if there was a failure allocating some buffer, use old
+          rendering code */
+       int legacy;
 } GPUDrawObject;
 
 /* used for GLSL materials */
-typedef struct GPUAttrib
-{
+typedef struct GPUAttrib {
        int index;
        int size;
        int type;
 } GPUAttrib;
 
-GPUBufferPool *GPU_buffer_pool_new(void);
-void GPU_buffer_pool_free( GPUBufferPool *pool );
-void GPU_buffer_pool_free_unused( GPUBufferPool *pool );
+void GPU_global_buffer_pool_free(void);
 
-GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool );
-void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool );
+GPUBuffer *GPU_buffer_alloc(int size);
+void GPU_buffer_free(GPUBuffer *buffer);
 
 GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
 void GPU_drawobject_free( struct DerivedMesh *dm );
 
-/* Buffers for non-DerivedMesh drawing */
-void *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert,
-                       struct MFace *mface, int *face_indices,
-                       int totface, int *vert_indices, int uniq_verts,
-                       int totvert);
-void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert,
-                       int *vert_indices, int totvert);
-void *GPU_build_grid_buffers(struct DMGridData **grids,
-       int *grid_indices, int totgrid, int gridsize);
-void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids,
-       int *grid_indices, int totgrid, int gridsize, int smooth);
-void GPU_draw_buffers(void *buffers);
-void GPU_free_buffers(void *buffers);
-
 /* called before drawing */

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to