Rewrite PBVH draw to allocate attributes into individual VBOs. The old system tried to create a single VBO that could feed every open viewport. This required uploading every color and UV attribute to the viewport whether needed or not, often exceeding the VBO limit. This new system creates one VBO per attribute. Each attribute layout is given its own GPU batch which is cached inside the owning PBVH node. Notes: * This is a full C++ rewrite. The old code is still there; ripping it out can happen later. * PBVH nodes now have a collection of batches, PBVHBatches, that keeps track of all the batches inside the node. * Batches are built exclusively from a list of attributes. * Each attribute has its own VBO. * Overlays, workbench and EEVEE can all have different attribute layouts, each of which will get its own batch. Reviewed by: Clement Foucault Differential Revision: https://developer.blender.org/D15428 Ref D15428
59 lines
1.1 KiB
C
59 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2013 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#include "GPU_init_exit.h" /* interface */
|
|
#include "BLI_sys_types.h"
|
|
#include "GPU_batch.h"
|
|
|
|
#include "intern/gpu_codegen.h"
|
|
#include "intern/gpu_private.h"
|
|
#include "intern/gpu_shader_create_info_private.hh"
|
|
#include "intern/gpu_shader_dependency_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_shader_dependency_init();
|
|
gpu_shader_create_info_init();
|
|
|
|
gpu_codegen_init();
|
|
|
|
gpu_batch_init();
|
|
}
|
|
|
|
void GPU_exit(void)
|
|
{
|
|
gpu_batch_exit();
|
|
|
|
gpu_codegen_exit();
|
|
|
|
gpu_shader_dependency_exit();
|
|
gpu_shader_create_info_exit();
|
|
|
|
gpu_backend_delete_resources();
|
|
|
|
initialized = false;
|
|
}
|
|
|
|
bool GPU_is_init(void)
|
|
{
|
|
return initialized;
|
|
}
|