That was a nice and funny hunt, albeit rather time consumming! To summarize, so far code was using a static global gpu_buffer for pbvh vbo drawing of 'grid' types (multires mostly?). There were two issues here: 1) Global gpu buffer was assigned to GPU_PBVH_Buffers->index_buf, but then nearly no check was done when freeing that buffer, to ensure we were not freeing the global one (not totally sure this one was actually causing any issue, but was bad and unsafe anyway). Was solved by adding a flag to GPU_PBVH_Buffers to indicate when we are using some 'common' buffer here, which freeing is handled separately. 2) Main issue: if several multires objects in sculpt mode with different grid size were present simultaneously, the global gpu buffer had to be resized for each object draw (i.e., freed and re-allocated), but then the pbvh nodes from other objects storing freed reference to that global buffer had no way to know that it had been freed, which was causing the segfault & crash. Was solved by getting rid of that global buffer, and instead allocating one 'grid_commmon_gpu_buffer' per pbvh. Told ya baby, globals are *PURE EVIL*!
79 lines
1.9 KiB
C
79 lines
1.9 KiB
C
/*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2013 Blender Foundation.
|
|
* All rights reserved.
|
|
*
|
|
* The Original Code is: all of this file.
|
|
*
|
|
* Contributor(s): Jason Wilkins
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
/** \file source/blender/gpu/intern/gpu_init_exit.c
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#include "BKE_DerivedMesh.h"
|
|
|
|
#include "BLI_sys_types.h"
|
|
#include "GPU_init_exit.h" /* interface */
|
|
#include "GPU_buffers.h"
|
|
|
|
#include "BKE_global.h"
|
|
|
|
#include "intern/gpu_codegen.h"
|
|
#include "intern/gpu_private.h"
|
|
|
|
/**
|
|
* although the order of initialization and shutdown should not matter
|
|
* (except for the extensions), I chose alphabetical and reverse alphabetical order
|
|
*/
|
|
|
|
static bool initialized = false;
|
|
|
|
void GPU_init(void)
|
|
{
|
|
/* can't avoid calling this multiple times, see wm_window_ghostwindow_add */
|
|
if (initialized)
|
|
return;
|
|
|
|
initialized = true;
|
|
|
|
gpu_extensions_init(); /* must come first */
|
|
|
|
gpu_codegen_init();
|
|
|
|
if (G.debug & G_DEBUG_GPU)
|
|
gpu_debug_init();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GPU_exit(void)
|
|
{
|
|
if (G.debug & G_DEBUG_GPU)
|
|
gpu_debug_exit();
|
|
gpu_codegen_exit();
|
|
|
|
gpu_extensions_exit(); /* must come last */
|
|
|
|
initialized = false;
|
|
}
|