Blender
V3.3
|
#include "draw_instance_data.h"
#include "draw_manager.h"
#include "DRW_engine.h"
#include "DRW_render.h"
#include "GPU_material.h"
#include "DNA_particle_types.h"
#include "BKE_duplilist.h"
#include "RNA_access.h"
#include "RNA_path.h"
#include "BLI_bitmap.h"
#include "BLI_memblock.h"
#include "BLI_mempool.h"
#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
Go to the source code of this file.
Classes | |
struct | DRWInstanceData |
struct | DRWInstanceDataList |
struct | DRWTempBufferHandle |
struct | DRWTempInstancingHandle |
struct | DRWSparseUniformBuf |
struct | DRWUniformAttrBuf |
Typedefs | |
typedef struct DRWTempBufferHandle | DRWTempBufferHandle |
typedef struct DRWTempInstancingHandle | DRWTempInstancingHandle |
Variables | |
static ListBase | g_idatalists = {NULL, NULL} |
Sparse Uniform Buffer | |
#define | CHUNK_LIST_STEP (1 << 4) |
typedef struct DRWSparseUniformBuf | DRWSparseUniformBuf |
static void | drw_sparse_uniform_buffer_init (DRWSparseUniformBuf *buffer, unsigned int item_size, unsigned int chunk_size) |
DRWSparseUniformBuf * | DRW_sparse_uniform_buffer_new (unsigned int item_size, unsigned int chunk_size) |
void | DRW_sparse_uniform_buffer_flush (DRWSparseUniformBuf *buffer) |
void | DRW_sparse_uniform_buffer_clear (DRWSparseUniformBuf *buffer, bool free_all) |
void | DRW_sparse_uniform_buffer_free (DRWSparseUniformBuf *buffer) |
bool | DRW_sparse_uniform_buffer_is_empty (DRWSparseUniformBuf *buffer) |
static GPUUniformBuf * | drw_sparse_uniform_buffer_get_ubo (DRWSparseUniformBuf *buffer, int chunk) |
void | DRW_sparse_uniform_buffer_bind (DRWSparseUniformBuf *buffer, int chunk, int location) |
void | DRW_sparse_uniform_buffer_unbind (DRWSparseUniformBuf *buffer, int chunk) |
void * | DRW_sparse_uniform_buffer_ensure_item (DRWSparseUniformBuf *buffer, int chunk, int item) |
Uniform Attribute Buffers | |
typedef struct DRWUniformAttrBuf | DRWUniformAttrBuf |
static DRWUniformAttrBuf * | drw_uniform_attrs_pool_ensure (GHash *table, GPUUniformAttrList *key) |
static bool | drw_uniform_property_lookup (ID *id, const char *name, float r_data[4]) |
static void | drw_uniform_attribute_lookup (GPUUniformAttr *attr, Object *ob, Object *dupli_parent, DupliObject *dupli_source, float r_data[4]) |
void | drw_uniform_attrs_pool_update (GHash *table, GPUUniformAttrList *key, DRWResourceHandle *handle, Object *ob, Object *dupli_parent, DupliObject *dupli_source) |
DRWSparseUniformBuf * | DRW_uniform_attrs_pool_find_ubo (GHash *table, struct GPUUniformAttrList *key) |
GHash * | DRW_uniform_attrs_pool_new () |
void | DRW_uniform_attrs_pool_flush_all (GHash *table) |
static void | drw_uniform_attrs_pool_free_cb (void *ptr) |
void | DRW_uniform_attrs_pool_clear_all (GHash *table) |
void | DRW_uniform_attrs_pool_free (GHash *table) |
#define CHUNK_LIST_STEP (1 << 4) |
Definition at line 401 of file draw_instance_data.c.
typedef struct DRWSparseUniformBuf DRWSparseUniformBuf |
A chunked UBO manager that doesn't actually allocate unneeded chunks.
typedef struct DRWTempBufferHandle DRWTempBufferHandle |
typedef struct DRWTempInstancingHandle DRWTempInstancingHandle |
typedef struct DRWUniformAttrBuf DRWUniformAttrBuf |
Sparse UBO buffer for a specific uniform attribute list.
void DRW_instance_buffer_finish | ( | DRWInstanceDataList * | idatalist | ) |
Upload all instance data to the GPU as soon as possible.
Definition at line 200 of file draw_instance_data.c.
References DRWTempInstancingHandle::batch, batch, BLI_memblock_clear(), BLI_memblock_iternew(), BLI_memblock_iterstep(), DRWTempBufferHandle::buf, DRWTempInstancingHandle::buf, DRW_BUFFER_VERTS_CHUNK, DRWTempInstancingHandle::geom, GPU_BATCH_BUILDING, GPU_batch_copy(), GPU_BATCH_INST_VBO_MAX_LEN, GPU_batch_instbuf_add_ex(), GPU_vertbuf_data_len_set(), GPU_vertbuf_data_resize(), GPU_vertbuf_get_vertex_alloc(), GPU_vertbuf_use(), GPUBatch, DRWTempInstancingHandle::instancer, instancing_batch_references_add(), NULL, DRWInstanceDataList::pool_batching, DRWInstanceDataList::pool_buffers, DRWInstanceDataList::pool_instancing, temp_batch_free(), temp_buffer_handle_free(), temp_instancing_handle_free(), and DRWTempBufferHandle::vert_len.
Referenced by DRW_render_instance_buffer_finish().
|
static |
Definition at line 252 of file draw_instance_data.c.
References attr_size(), BLI_assert, BLI_mempool_create(), DRWInstanceData::data_size, DRWInstanceDataList::idata_head, DRWInstanceDataList::idata_tail, MEM_callocN, DRWInstanceData::mempool, DRWInstanceData::next, NULL, and DRWInstanceData::used.
Referenced by DRW_instance_data_request().
|
static |
Definition at line 274 of file draw_instance_data.c.
References BLI_mempool_destroy(), and DRWInstanceData::mempool.
Referenced by DRW_instance_data_list_free(), and DRW_instance_data_list_free_unused().
DRWInstanceDataList* DRW_instance_data_list_create | ( | void | ) |
This is here because GPUViewport needs it.
Definition at line 307 of file draw_instance_data.c.
References BLI_addtail(), BLI_memblock_create, g_idatalists, GPUBatch, MEM_callocN, DRWInstanceDataList::pool_batching, DRWInstanceDataList::pool_buffers, and DRWInstanceDataList::pool_instancing.
Referenced by DRW_viewport_data_create().
void DRW_instance_data_list_free | ( | DRWInstanceDataList * | idatalist | ) |
Definition at line 320 of file draw_instance_data.c.
References BLI_memblock_destroy(), BLI_remlink(), DRW_instance_data_free(), g_idatalists, DRWInstanceDataList::idata_head, DRWInstanceDataList::idata_tail, MAX_INSTANCE_DATA_SIZE, MEM_freeN, DRWInstanceData::next, NULL, DRWInstanceDataList::pool_batching, DRWInstanceDataList::pool_buffers, DRWInstanceDataList::pool_instancing, temp_batch_free(), temp_buffer_handle_free(), and temp_instancing_handle_free().
Referenced by DRW_viewport_data_free().
void DRW_instance_data_list_free_unused | ( | DRWInstanceDataList * | idatalist | ) |
Definition at line 354 of file draw_instance_data.c.
References DRW_instance_data_free(), DRWInstanceDataList::idata_head, DRWInstanceDataList::idata_tail, MAX_INSTANCE_DATA_SIZE, MEM_freeN, DRWInstanceData::next, NULL, and DRWInstanceData::used.
Referenced by drw_viewport_data_reset().
void DRW_instance_data_list_reset | ( | DRWInstanceDataList * | idatalist | ) |
Definition at line 343 of file draw_instance_data.c.
References DRWInstanceDataList::idata_head, MAX_INSTANCE_DATA_SIZE, DRWInstanceData::next, and DRWInstanceData::used.
Referenced by drw_viewport_data_reset().
void DRW_instance_data_list_resize | ( | DRWInstanceDataList * | idatalist | ) |
Definition at line 384 of file draw_instance_data.c.
References BLI_mempool_clear_ex(), BLI_mempool_len(), DRWInstanceDataList::idata_head, MAX_INSTANCE_DATA_SIZE, DRWInstanceData::mempool, and DRWInstanceData::next.
Referenced by drw_viewport_data_reset().
void* DRW_instance_data_next | ( | DRWInstanceData * | idata | ) |
Return a pointer to the next instance data space.
Definition at line 279 of file draw_instance_data.c.
References BLI_mempool_alloc(), and DRWInstanceData::mempool.
Referenced by DRW_drawdata_ensure().
DRWInstanceData* DRW_instance_data_request | ( | DRWInstanceDataList * | idatalist, |
uint | attr_size | ||
) |
Definition at line 284 of file draw_instance_data.c.
References attr_size(), BLI_assert, drw_instance_data_create(), DRWInstanceDataList::idata_head, MAX_INSTANCE_DATA_SIZE, DRWInstanceData::next, and DRWInstanceData::used.
Referenced by DRW_drawdata_ensure().
void DRW_sparse_uniform_buffer_bind | ( | DRWSparseUniformBuf * | buffer, |
int | chunk, | ||
int | location | ||
) |
Bind the UBO for the given chunk, if present. A NULL buffer pointer is handled as empty.
Definition at line 509 of file draw_instance_data.c.
References buffer, drw_sparse_uniform_buffer_get_ubo(), and GPU_uniformbuf_bind().
Referenced by draw_call_resource_bind(), and draw_update_uniforms().
void DRW_sparse_uniform_buffer_clear | ( | DRWSparseUniformBuf * | buffer, |
bool | free_all | ||
) |
Clean all buffers and free unused ones.
Definition at line 448 of file draw_instance_data.c.
References BLI_BITMAP_RESIZE, BLI_bitmap_set_all(), BLI_BITMAP_TEST, buffer, CHUNK_LIST_STEP, GPU_uniformbuf_free(), MEM_recallocN, MEM_SAFE_FREE, and NULL.
Referenced by DRW_sparse_uniform_buffer_free(), DRW_uniform_attrs_pool_clear_all(), and drw_uniform_attrs_pool_free_cb().
void* DRW_sparse_uniform_buffer_ensure_item | ( | DRWSparseUniformBuf * | buffer, |
int | chunk, | ||
int | item | ||
) |
Returns a pointer to the given item of the given chunk, allocating memory if necessary.
Definition at line 525 of file draw_instance_data.c.
References BLI_BITMAP_ENABLE, BLI_BITMAP_RESIZE, BLI_BITMAP_TEST, buffer, CHUNK_LIST_STEP, MEM_callocN, MEM_recallocN, and NULL.
Referenced by drw_uniform_attrs_pool_update().
void DRW_sparse_uniform_buffer_flush | ( | DRWSparseUniformBuf * | buffer | ) |
Flush data from ordinary memory to UBOs.
Definition at line 436 of file draw_instance_data.c.
References BLI_BITMAP_TEST, buffer, GPU_uniformbuf_create, GPU_uniformbuf_update(), and NULL.
Referenced by DRW_uniform_attrs_pool_flush_all().
void DRW_sparse_uniform_buffer_free | ( | DRWSparseUniformBuf * | buffer | ) |
Frees the buffer.
Definition at line 490 of file draw_instance_data.c.
References buffer, DRW_sparse_uniform_buffer_clear(), and MEM_freeN.
|
static |
Definition at line 501 of file draw_instance_data.c.
References BLI_BITMAP_TEST, buffer, and NULL.
Referenced by DRW_sparse_uniform_buffer_bind(), and DRW_sparse_uniform_buffer_unbind().
|
static |
Definition at line 416 of file draw_instance_data.c.
References buffer, blender::io::obj::chunk_size, and NULL.
Referenced by DRW_sparse_uniform_buffer_new(), and drw_uniform_attrs_pool_ensure().
bool DRW_sparse_uniform_buffer_is_empty | ( | DRWSparseUniformBuf * | buffer | ) |
Checks if the buffer contains any allocated chunks.
Definition at line 496 of file draw_instance_data.c.
References buffer.
Referenced by DRW_uniform_attrs_pool_clear_all().
DRWSparseUniformBuf* DRW_sparse_uniform_buffer_new | ( | unsigned int | item_size, |
unsigned int | chunk_size | ||
) |
Allocate a chunked UBO with the specified item and chunk size.
Definition at line 429 of file draw_instance_data.c.
References blender::io::obj::chunk_size, drw_sparse_uniform_buffer_init(), and MEM_mallocN.
void DRW_sparse_uniform_buffer_unbind | ( | DRWSparseUniformBuf * | buffer, |
int | chunk | ||
) |
Unbind the UBO for the given chunk, if present. A NULL buffer pointer is handled as empty.
Definition at line 517 of file draw_instance_data.c.
References buffer, drw_sparse_uniform_buffer_get_ubo(), and GPU_uniformbuf_unbind().
Referenced by draw_call_batching_finish(), and draw_call_resource_bind().
GPUBatch* DRW_temp_batch_instance_request | ( | DRWInstanceDataList * | idatalist, |
GPUVertBuf * | buf, | ||
GPUBatch * | instancer, | ||
GPUBatch * | geom | ||
) |
Definition at line 124 of file draw_instance_data.c.
References DRWTempInstancingHandle::batch, batch, BLI_assert, BLI_memblock_alloc(), DRWTempInstancingHandle::buf, DRWTempInstancingHandle::geom, GPU_BATCH_BUILDING, GPU_batch_calloc(), GPU_batch_clear(), GPU_BATCH_VBO_MAX_LEN, GPU_VERTBUF_DATA_UPLOADED, GPU_vertbuf_get_status(), GPUBatch, DRWTempInstancingHandle::instancer, instancing_batch_references_remove(), NULL, and DRWInstanceDataList::pool_instancing.
Referenced by DRW_shgroup_call_buffer_instance(), and DRW_shgroup_call_instances_with_attrs().
GPUBatch* DRW_temp_batch_request | ( | DRWInstanceDataList * | idatalist, |
GPUVertBuf * | buf, | ||
GPUPrimType | type | ||
) |
Definition at line 164 of file draw_instance_data.c.
References batch, BLI_memblock_alloc(), GPU_batch_calloc(), GPU_batch_clear(), GPU_batch_init, GPU_VERTBUF_DATA_UPLOADED, GPU_vertbuf_get_status(), GPUBatch, NULL, and DRWInstanceDataList::pool_batching.
Referenced by DRW_shgroup_call_buffer().
GPUVertBuf* DRW_temp_buffer_request | ( | DRWInstanceDataList * | idatalist, |
GPUVertFormat * | format, | ||
int * | vert_len | ||
) |
This manager allows to distribute existing batches for instancing attributes. This reduce the number of batches creation. Querying a batch is done with a vertex format. This format should be static so that its pointer never changes (because we are using this pointer as identifier [we don't want to check the full format that would be too slow]).
Definition at line 101 of file draw_instance_data.c.
References BLI_assert, BLI_memblock_alloc(), DRWTempBufferHandle::buf, DRW_BUFFER_VERTS_CHUNK, DRWTempBufferHandle::format, GPU_USAGE_DYNAMIC, GPU_vertbuf_calloc(), GPU_vertbuf_data_alloc(), GPU_VERTBUF_DISCARD_SAFE, GPU_vertbuf_init_with_format_ex(), NULL, DRWInstanceDataList::pool_buffers, and DRWTempBufferHandle::vert_len.
Referenced by DRW_shgroup_call_buffer(), and DRW_shgroup_call_buffer_instance().
|
static |
Definition at line 637 of file draw_instance_data.c.
References BLI_str_escape(), copy_v4_fl(), drw_uniform_property_lookup(), GPUUniformAttr::name, ParticleSystem::part, DupliObject::particle_system, SNPRINTF, and GPUUniformAttr::use_dupli.
Referenced by drw_uniform_attrs_pool_update().
Definition at line 728 of file draw_instance_data.c.
References BLI_ghash_remove(), buffer, DRW_sparse_uniform_buffer_clear(), DRW_sparse_uniform_buffer_is_empty(), drw_uniform_attrs_pool_free_cb(), GHASH_FOREACH_BEGIN, GHASH_FOREACH_END, and NULL.
Referenced by drw_viewport_data_reset().
|
static |
Definition at line 567 of file draw_instance_data.c.
References BLI_ghash_ensure_p_ex(), buffer, GPUUniformAttrList::count, DRW_RESOURCE_CHUNK_LEN, drw_sparse_uniform_buffer_init(), GPU_uniform_attr_list_copy(), DRWUniformAttrBuf::key, and MEM_callocN.
Referenced by drw_uniform_attrs_pool_update().
DRWSparseUniformBuf* DRW_uniform_attrs_pool_find_ubo | ( | GHash * | table, |
struct GPUUniformAttrList * | key | ||
) |
Definition at line 700 of file draw_instance_data.c.
References BLI_ghash_lookup(), buffer, DRWUniformAttrBuf::key, and NULL.
Referenced by draw_update_uniforms().
Definition at line 711 of file draw_instance_data.c.
References buffer, DRW_sparse_uniform_buffer_flush(), GHASH_FOREACH_BEGIN, and GHASH_FOREACH_END.
Referenced by drw_resource_buffer_finish().
Definition at line 750 of file draw_instance_data.c.
References BLI_ghash_free(), drw_uniform_attrs_pool_free_cb(), and NULL.
Referenced by DRW_viewport_data_free().
Definition at line 719 of file draw_instance_data.c.
References buffer, DRW_sparse_uniform_buffer_clear(), GPU_uniform_attr_list_free(), MEM_freeN, and ptr.
Referenced by DRW_uniform_attrs_pool_clear_all(), and DRW_uniform_attrs_pool_free().
Definition at line 706 of file draw_instance_data.c.
References GPU_uniform_attr_list_hash_new().
Referenced by DRW_viewport_data_create().
void drw_uniform_attrs_pool_update | ( | GHash * | table, |
GPUUniformAttrList * | key, | ||
DRWResourceHandle * | handle, | ||
Object * | ob, | ||
Object * | dupli_parent, | ||
DupliObject * | dupli_source | ||
) |
Definition at line 678 of file draw_instance_data.c.
References buffer, DRW_handle_chunk_get(), DRW_handle_id_get(), DRW_sparse_uniform_buffer_ensure_item(), drw_uniform_attribute_lookup(), drw_uniform_attrs_pool_ensure(), float(), DRWUniformAttrBuf::key, and LISTBASE_FOREACH.
Referenced by drw_resource_handle().
Definition at line 588 of file draw_instance_data.c.
References copy_v4_fl4(), NULL, PROP_FLOAT, PROP_INT, ptr, RNA_id_pointer_create(), RNA_path_resolve(), RNA_property_array_length(), RNA_property_float_get(), RNA_property_float_get_array(), RNA_property_int_get(), RNA_property_type(), and type.
Referenced by drw_uniform_attribute_lookup().
Definition at line 77 of file draw_instance_data.c.
References batch, GPU_BATCH_INST_VBO_MAX_LEN, GPU_BATCH_VBO_MAX_LEN, and GPU_vertbuf_handle_ref_add().
Referenced by DRW_instance_buffer_finish().
Definition at line 87 of file draw_instance_data.c.
References batch, GPU_BATCH_INST_VBO_MAX_LEN, GPU_BATCH_VBO_MAX_LEN, and GPU_vertbuf_handle_ref_remove().
Referenced by DRW_temp_batch_instance_request(), and temp_instancing_handle_free().
Definition at line 195 of file draw_instance_data.c.
References batch, and GPU_BATCH_DISCARD_SAFE.
Referenced by DRW_instance_buffer_finish(), and DRW_instance_data_list_free().
|
static |
Definition at line 183 of file draw_instance_data.c.
References DRWTempBufferHandle::buf, DRWTempBufferHandle::format, GPU_VERTBUF_DISCARD_SAFE, and NULL.
Referenced by DRW_instance_buffer_finish(), and DRW_instance_data_list_free().
|
static |
Definition at line 189 of file draw_instance_data.c.
References DRWTempInstancingHandle::batch, GPU_BATCH_DISCARD_SAFE, and instancing_batch_references_remove().
Referenced by DRW_instance_buffer_finish(), and DRW_instance_data_list_free().
Definition at line 75 of file draw_instance_data.c.
Referenced by DRW_instance_data_list_create(), and DRW_instance_data_list_free().