Commit: c2bd260122c5d05d92a843fb5c3a8b60c7425b73
Author: Antony Riakiotakis
Date:   Sat Jan 2 19:55:15 2016 +0100
Branches: master
https://developer.blender.org/rBc2bd260122c5d05d92a843fb5c3a8b60c7425b73

GPU buffers: Add update functionality for existing buffers.

Only used for color for now, but we need this for any kind of buffer
updates actually.

This should get rid of some allocation/deallocation, making
vertex painting a bit faster.

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

M       source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/gpu/intern/gpu_buffers.c 
b/source/blender/gpu/intern/gpu_buffers.c
index 3c44811..a2a604f 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -483,10 +483,9 @@ static GPUBuffer *gpu_try_realloc(GPUBufferPool *pool, 
GPUBuffer *buffer, size_t
 }
 
 static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
-                                   int type, void *user)
+                                   int type, void *user, GPUBuffer *buffer)
 {
        GPUBufferPool *pool;
-       GPUBuffer *buffer;
        float *varray;
        int *mat_orig_to_new;
        int i;
@@ -500,9 +499,11 @@ static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, 
GPUDrawObject *object,
        BLI_mutex_lock(&buffer_mutex);
 
        /* alloc a GPUBuffer; fall back to legacy mode on failure */
-       if (!(buffer = gpu_buffer_alloc_intern(size))) {
-               BLI_mutex_unlock(&buffer_mutex);
-               return NULL;
+       if (!buffer) {
+               if (!(buffer = gpu_buffer_alloc_intern(size))) {
+                       BLI_mutex_unlock(&buffer_mutex);
+                       return NULL;
+               }
        }
 
        mat_orig_to_new = MEM_mallocN(sizeof(*mat_orig_to_new) * dm->totmat,
@@ -601,10 +602,9 @@ static size_t gpu_buffer_size_from_type(DerivedMesh *dm, 
GPUBufferType type)
 }
 
 /* call gpu_buffer_setup with settings for a particular type of buffer */
-static GPUBuffer *gpu_buffer_setup_type(DerivedMesh *dm, GPUBufferType type)
+static GPUBuffer *gpu_buffer_setup_type(DerivedMesh *dm, GPUBufferType type, 
GPUBuffer *buf)
 {
        void *user_data = NULL;
-       GPUBuffer *buf;
 
        /* special handling for MCol and UV buffers */
        if (type == GPU_BUFFER_COLOR) {
@@ -616,14 +616,14 @@ static GPUBuffer *gpu_buffer_setup_type(DerivedMesh *dm, 
GPUBufferType type)
                        return NULL;
        }
 
-       buf = gpu_buffer_setup(dm, dm->drawObject, type, user_data);
+       buf = gpu_buffer_setup(dm, dm->drawObject, type, user_data, buf);
 
        return buf;
 }
 
 /* get the buffer of `type', initializing the GPUDrawObject and
  * buffer if needed */
-static GPUBuffer *gpu_buffer_setup_common(DerivedMesh *dm, GPUBufferType type)
+static GPUBuffer *gpu_buffer_setup_common(DerivedMesh *dm, GPUBufferType type, 
bool update)
 {
        GPUBuffer **buf;
 
@@ -632,14 +632,16 @@ static GPUBuffer *gpu_buffer_setup_common(DerivedMesh 
*dm, GPUBufferType type)
 
        buf = gpu_drawobject_buffer_from_type(dm->drawObject, type);
        if (!(*buf))
-               *buf = gpu_buffer_setup_type(dm, type);
+               *buf = gpu_buffer_setup_type(dm, type, NULL);
+       else if (update)
+               *buf = gpu_buffer_setup_type(dm, type, *buf);
 
        return *buf;
 }
 
 void GPU_vertex_setup(DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_VERTEX))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_VERTEX, false))
                return;
 
        glEnableClientState(GL_VERTEX_ARRAY);
@@ -651,7 +653,7 @@ void GPU_vertex_setup(DerivedMesh *dm)
 
 void GPU_normal_setup(DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_NORMAL))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_NORMAL, false))
                return;
 
        glEnableClientState(GL_NORMAL_ARRAY);
@@ -663,7 +665,7 @@ void GPU_normal_setup(DerivedMesh *dm)
 
 void GPU_uv_setup(DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_UV))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_UV, false))
                return;
 
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -675,7 +677,7 @@ void GPU_uv_setup(DerivedMesh *dm)
 
 void GPU_texpaint_uv_setup(DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_UV_TEXPAINT))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_UV_TEXPAINT, false))
                return;
 
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -692,6 +694,8 @@ void GPU_texpaint_uv_setup(DerivedMesh *dm)
 
 void GPU_color_setup(DerivedMesh *dm, int colType)
 {
+       bool update = false;
+
        if (!dm->drawObject) {
                /* XXX Not really nice, but we need a valid gpu draw object to 
set the colType...
                 *     Else we would have to add a new param to 
gpu_buffer_setup_common. */
@@ -702,17 +706,12 @@ void GPU_color_setup(DerivedMesh *dm, int colType)
        /* In paint mode, dm may stay the same during stroke, however we still 
want to update colors!
         * Also check in case we changed color type (i.e. which MCol cdlayer we 
use). */
        else if ((dm->dirty & DM_DIRTY_MCOL_UPDATE_DRAW) || (colType != 
dm->drawObject->colType)) {
-               GPUBuffer **buf = 
gpu_drawobject_buffer_from_type(dm->drawObject, GPU_BUFFER_COLOR);
-               /* XXX Freeing this buffer is a bit stupid, as geometry has not 
changed, size should remain the same.
-                *     Not sure though it would be worth defining a sort of 
gpu_buffer_update func - nor whether
-                *     it is even possible ! */
-               GPU_buffer_free(*buf);
-               *buf = NULL;
+               update = true;
                dm->dirty &= ~DM_DIRTY_MCOL_UPDATE_DRAW;
                dm->drawObject->colType = colType;
        }
 
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_COLOR))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_COLOR, update))
                return;
 
        glEnableClientState(GL_COLOR_ARRAY);
@@ -734,10 +733,10 @@ void GPU_buffer_bind_as_color(GPUBuffer *buffer)
 
 void GPU_edge_setup(DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_EDGE))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_EDGE, false))
                return;
 
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_VERTEX))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_VERTEX, false))
                return;
 
        glEnableClientState(GL_VERTEX_ARRAY);
@@ -751,7 +750,7 @@ void GPU_edge_setup(DerivedMesh *dm)
 
 void GPU_uvedge_setup(DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_UVEDGE))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_UVEDGE, false))
                return;
 
        glEnableClientState(GL_VERTEX_ARRAY);
@@ -763,7 +762,7 @@ void GPU_uvedge_setup(DerivedMesh *dm)
 
 void GPU_triangle_setup(struct DerivedMesh *dm)
 {
-       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_TRIANGLES))
+       if (!gpu_buffer_setup_common(dm, GPU_BUFFER_TRIANGLES, false))
                return;
 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dm->drawObject->triangles->id);

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

Reply via email to