Fix no longer being possible to display a suzanne with 8 levels of
authorAntony Riakiotakis <kalast@gmail.com>
Fri, 17 Jul 2015 10:25:05 +0000 (12:25 +0200)
committerAntony Riakiotakis <kalast@gmail.com>
Fri, 17 Jul 2015 10:25:44 +0000 (12:25 +0200)
subdivision.

Classic integet overflow/size_t substitution case. Machines are getting
powerful enough to easily expose these kinds of error now.

source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/gpu/GPU_buffers.h
source/blender/gpu/intern/gpu_buffers.c

index 5f53fa6dca17d32f6d847bbf72c7d49ecff6955e..69e69bf1b92db3b6d4672e9b07ac6930a0f65168 100644 (file)
@@ -945,7 +945,7 @@ static void cdDM_drawMappedFacesGLSL(
                int tot_active_mat;
                GPUBuffer *buffer = NULL;
                char *varray;
-               int max_element_size = 0;
+               size_t max_element_size = 0;
                int tot_loops = 0;
 
                GPU_vertex_setup(dm);
index 12e66264661858c96dde0d03f6f776657080bdb6..779521aa00cd555a4599a56740d7fe48d51943d3 100644 (file)
@@ -39,6 +39,8 @@
 #  define DEBUG_VBO(X)
 #endif
 
+#include <stddef.h>
+
 struct BMesh;
 struct CCGElem;
 struct CCGKey;
@@ -50,7 +52,7 @@ struct PBVH;
 struct MVert;
 
 typedef struct GPUBuffer {
-       int size;        /* in bytes */
+       size_t size;        /* in bytes */
        void *pointer;   /* used with vertex arrays */
        unsigned int id; /* used with vertex buffer objects */
        bool use_vbo;    /* true for VBOs, false for vertex arrays */
@@ -58,12 +60,12 @@ typedef struct GPUBuffer {
 
 typedef struct GPUBufferMaterial {
        /* range of points used for this material */
-       int start;
-       int totelements;
-       int totloops;
-       int *polys; /* array of polygons for this material */
-       int totpolys; /* total polygons in polys */
-       int counter; /* general purpose counter, initialize first! */
+       unsigned int start;
+       unsigned int totelements;
+       unsigned int totloops;
+       unsigned int *polys; /* array of polygons for this material */
+       unsigned int totpolys; /* total polygons in polys */
+       unsigned int counter; /* general purpose counter, initialize first! */
 
        /* original material index */
        short mat_nr;
@@ -106,23 +108,22 @@ typedef struct GPUDrawObject {
 #endif
        
        int colType;
-       int index_setup; /* how indices are setup, starting from start of buffer or start of material */
 
        GPUBufferMaterial *materials;
        int totmaterial;
        
-       int tot_triangle_point;
-       int tot_loose_point;
+       unsigned int tot_triangle_point;
+       unsigned int tot_loose_point;
        /* different than total loops since ngons get tesselated still */
-       int tot_loop_verts;
+       unsigned int tot_loop_verts;
        
        /* caches of the original DerivedMesh values */
-       int totvert;
-       int totedge;
+       unsigned int totvert;
+       unsigned int totedge;
 
-       int loose_edge_offset;
-       int tot_loose_edge_drawn;
-       int tot_edge_drawn;
+       unsigned int loose_edge_offset;
+       unsigned int tot_loose_edge_drawn;
+       unsigned int tot_edge_drawn;
 } GPUDrawObject;
 
 /* currently unused */
index cd3a5d6d72584482d35a1351281ef4511c931e17..e86ca0fba94fffa274e5df78d49d2c0471c40859 100644 (file)
@@ -75,7 +75,7 @@ typedef struct {
 } GPUBufferTypeSettings;
 
 
-static int gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type);
+static size_t gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type);
 
 const GPUBufferTypeSettings gpu_buffer_type_settings[] = {
     /* vertex */
@@ -471,7 +471,7 @@ void GPU_drawobject_free(DerivedMesh *dm)
        dm->drawObject = NULL;
 }
 
-static GPUBuffer *gpu_try_realloc(GPUBufferPool *pool, GPUBuffer *buffer, int size, bool use_VBOs)
+static GPUBuffer *gpu_try_realloc(GPUBufferPool *pool, GPUBuffer *buffer, size_t size, bool use_VBOs)
 {
        gpu_buffer_free_intern(buffer);
        gpu_buffer_pool_delete_last(pool);
@@ -498,7 +498,7 @@ static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
        const GPUBufferTypeSettings *ts = &gpu_buffer_type_settings[type];
        GLenum target = ts->gl_buffer_type;
        int num_components = ts->num_components;
-       int size = gpu_buffer_size_from_type(dm, type);
+       size_t size = gpu_buffer_size_from_type(dm, type);
        bool use_VBOs = (GLEW_ARB_vertex_buffer_object) && !(U.gameflags & USER_DISABLE_VBO);
        GLboolean uploaded;
 
@@ -607,7 +607,7 @@ static GPUBuffer **gpu_drawobject_buffer_from_type(GPUDrawObject *gdo, GPUBuffer
 }
 
 /* get the amount of space to allocate for a buffer of a particular type */
-static int gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type)
+static size_t gpu_buffer_size_from_type(DerivedMesh *dm, GPUBufferType type)
 {
        switch (type) {
                case GPU_BUFFER_VERTEX: